Word (VBA)

Word VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Home : Word 2003)
WORDマクロで文字列を検索してメッセージを表示したい
投稿日時: 21/09/09 17:05:41
投稿者: m.kirai

WORDマクロで文字列を検索してメッセージを表示したいです。
 
何日もネットで調べてみましたが、調べ方が悪いのか該当するコードがありませんでした。
マクロの記録でも試してみましたが、何も出力されませんでした。
どなたか教えていただきたく、よろしくお願いいたします。
 
@文字列A〜文字列Bの間を範囲指定する。
A@の範囲で複数の文字列(text1〜text10)を検索する。
B検索文字列があればメッセージを表示する。
 ※メッセージは全て異なるメッセージ
C検索文字列がなくなるまで処理を続ける。

回答
投稿日時: 21/09/09 18:16:25
投稿者: sk

引用:
@文字列A〜文字列Bの間を範囲指定する。

(標準モジュール)
----------------------------------------------------------------
Sub Macro1()
     
    Dim docSearch As Word.Document
    Dim rngSearch As Word.Range
    Dim strKeyWord As String
         
    Set docSearch = ThisDocument
    docSearch.Activate
     
    docSearch.StoryRanges(wdMainTextStory).Select
    With Selection.Find
        .ClearAllFuzzyOptions
        .ClearFormatting
        .Forward = True
        .MatchWildcards = True
        .Text = "文字列A*文字列B"
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchFuzzy = False
        .Replacement.Text = ""
        If .Execute = False Then
            Exit Sub
        End If
    End With
    Set rngSearch = Selection.Range
     
    strKeyWord = "text1"
     
    rngSearch.Select
    With Selection.Find
        .MatchWildcards = False
        .Text = strKeyWord
        If .Execute = True Then
            MsgBox """" & strKeyWord & """が含まれています。"
        Else
            MsgBox """" & strKeyWord & """は含まれていません。"
        End If
    End With
     
    Set rngSearch = Nothing
    Set docSearch = Nothing
     
End Sub
----------------------------------------------------------------
 
こんな感じの処理が出来ればよい、ということでしょうか。
 
引用:
A@の範囲で複数の文字列(text1〜text10)を検索する。
B検索文字列があればメッセージを表示する。
 ※メッセージは全て異なるメッセージ

・複数の文字列をどのようにして指定するのか。
 (どこに入力するのか、どこから参照するのか)
 
・具体的にどのようなメッセージを表示させたいのか。
 
あとは以上の点次第。

回答
投稿日時: 21/09/09 18:26:05
投稿者: QooApp

Wordファイルにはこのように記載されていると仮定する(選択範囲テキスト)

ばななのななちはばなななち
ばななのななちはばなななち
ばなななち
ばなななち
ばななち

Sub main()
    
    Dim i As Long
    Dim ArrayWord(2) As String
    
    ArrayWord(0) = "りんご"
    ArrayWord(1) = "ばなな"
    ArrayWord(2) = "ななち"
    
    If (Selection.Range.Text <> "") Then
        For i = 0 To UBound(ArrayWord)
            If (Replace(Selection.Range.Text, ArrayWord(i), "") <> Selection.Range.Text) Then
                MsgBox (ArrayWord(i) & "は選択範囲のテキストに存在する")
            End If
        Next i
    End If
    
End Sub

 
配列ArrayWordに登録する単語は外部ファイルに書き出しておいて、
都度プログラムソースコードの中身を書き換えない方がコストは低くなるが割愛。
あとは動かして求める動作か判断してください。

投稿日時: 21/09/10 09:23:03
投稿者: m.kirai

skさん
 
ご回答いただきありがとうございます。
返信が遅くなり、申し訳ございません。
 
>複数の文字列をどのようにして指定するのか。
>(どこに入力するのか、どこから参照するのか)
 「検索文字列(text1〜text10)」はWORD文書上で複数記載されますが、「文字列A〜文字列Bの間」の「検索文字列」のみを指定したいです。
  文字列は増える可能性があるため、イメージとしてはQooAppさんが記載していただいた感じでいいと思います。
 
>具体的にどのようなメッセージを表示させたいのか。
  検索文字列によってそれぞれ異なるメッセージを表示させたいと思います。
  以下のようなイメージです。
     MsgBox1 "「検索文字列1」は○○○のため、△△△△してください。"
     MsgBox2 "「検索文字列2」はXXXXXXXXです。"
 
 
※上記マクロを実施したところ、以下のようなエラーになりました。
-----------
実行時エラー  ’6182'
 
MatchPhrase, MatchWildcards, MatchSoundsLike, MatchAllWordForms, MatchFuzzyパラメータは、同時にTrueに設定することはできません
-----------
 
「MatchWildcardsプロパティをTrueにする前に、MatchFuzzyプロパティをFalseにする」必要があるようなので順番を入れ替えたら、解消しました。
https://tonari-it.com/word-vba-find-match-wildcards/
 
 
    With Selection.Find
        .ClearAllFuzzyOptions
        .ClearFormatting
        .Forward = True
        .MatchWildcards = True
        .Text = "文字列A*文字列B"
        .MatchFuzzy = False ← ←
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .Replacement.Text = ""
        If .Execute = False Then
            Exit Sub
        End If
    End With

投稿日時: 21/09/10 09:29:20
投稿者: m.kirai

QooAppさん
  
ご回答いただきありがとうございます。
VBA初心者なので、配列関数等メッセージ表示の参考になりました。

トピックに返信