ワードのマクロで、文字列を操作する方法を記します。
すみません、あとで編集しようと思いますが、とりあえず、自分が後で読み返せる程度のメモです。
パターンを探して、Rangeの位置を記録する関数です。rngにたとえば、全範囲を指定すれば、全体から探してきます。 記録は、動的にできるものが欲しかったので、連想配列を使っています。 VBE->ツール->参照設定より、参照設定で「Microsoft Scripting Runtime」を追加する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
'パターンを検索して見つかった箇所のrangeを記録する Private Sub search(rng As Range, pattern As String, dic As Scripting.Dictionary) Dim rng_tmp As Range 'サーチ用のレンジ Set rng_tmp = rng.Duplicate 'コピーして、rng はオリジナルとして取っておく。 dic.RemoveAll '辞書は一旦クリア With rng_tmp.Find .Text = pattern .Forward = True .Wrap = wdFindStop .Replacement.Text = "" .Format = False '書式 .MatchCase = False '大文字小文字の区別 .MatchWholeWord = False '完全一致 .MatchByte = False '全角半角の区別 .MatchAllWordForms = False '英語の活用形を検索 .MatchFuzzy = False '日本語曖昧検索 .MatchSoundsLike = False '英語あいまい検索 .MatchWildcards = True 'ワイルドカード検索 End With Do While rng_tmp.Find.execute = True If rng_tmp.InRange(rng) Then 'もともとの範囲に入ってる場合だけ dic(dic.Count) = Array(rng_tmp.Start, rng_tmp.End) '見つかった単語のidx End If Loop End Sub |
ワイルドカードを True にしているので、「? * [a-z]」などの表現を使うことができます。
拾ってきたrangeを参照するには、
dic(0)(0) のようにします。dic(dic.Count)で代入しているため、キーが数字になります。また、代入しているのが要素数2この配列に、見つかった語句の先頭、最後のRange番地になります。
取得した結果の一覧を見るための関数は次のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
'辞書の内容を表示 Private Sub display_dic(dic As Scripting.Dictionary) '連想配列全チェック Dim key As Variant For Each key In dic If IsArray(dic(key)) Then Dim i As Integer Dim str As String str = key & ": " For i = LBound(dic(key)) To UBound(dic(key)) str = str & dic(key)(i) & " " Next i Debug.Print str End If Next key End Sub |
で、こんなふうに使えます。
1 2 3 4 5 6 7 8 9 10 11 |
'検索テスト Private Sub test_search() Dim pattern As String Dim dic As New Scripting.Dictionary pattern = "テスト*語句" Debug.Print "=====================" Debug.Print ActiveDocument.Content Debug.Print "=====================" search ActiveDocument.Content, pattern, dic display_dic dic End Sub |
出力結果は次のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
===================== これがてすと中のファイルです。 テスト中語句、 でも、テストしてない語句 テストにははやい語句 エンド ===================== 0: 16 22 1: 28 37 2: 39 49 |
範囲がわかるので、Rangeに設定して、消すなり、追加するなり、好きにしてください。
コメント