段落単位で置換できる(Word)

段落単位で置換できる

Wordで、特定の範囲だけ置換したかった。

f:id:akashi_keirin:20210210084737j:plain

目次

標準機能による置換

普通、置換はこうする。

f:id:akashi_keirin:20210210084543j:plain

画像中に示した、「《 》」でくくられた箇所を置換したいとき、[Ctrl] + [ H ]で置換ダイアログを呼び出して、

f:id:akashi_keirin:20210210084546j:plain

このようにすればよい。

しかし、これだと当たり前のことながら、文書全体の当該箇所が根こそぎ置換されてしまう。

もちろん、必要な範囲のみ選択した状態で実行すれば良いが、それは単に〝手動〟なのであって、あまり有効な解決策とは言えない。

Find.Executeメソッドによる置換

たとえば、次のリスト1を実行するとどうか。

リスト1 標準モジュール
Private Sub test01()
  Call Selection.Find.Execute(FindText:="《*》", _
                              ReplaceWith:="", _
                              Replace:=wdReplaceAll, _
                              MatchWildcards:=True)
End Sub

こいつを実行するとどうなるか。

カーソルのある場所以降の部分のみ置換されるのである。

これは実に便利な仕様。

しかし、これは〝どこから〟しか指定できないことを意味する。

段落単位でFind.Executeメソッドを使う

Wordでは、段落単位で文書の断片を取得することができる。

[Document].Paragraphsコレクションのインデックスを指定すれば良いのである。

たとえば、18番目~21番目の段落の部分のみ置換を実行したければ、次のようなコードを書けば良い。

スト2 標準モジュール
Private Sub test02()
  Dim Doc As Document
  Set Doc = ActiveDocument
  Dim i As Long
  For i = 18 To 21
    With Doc.Paragraphs(i)
      Call .Range.Find.Execute( _
                         FindText:="《*》", _
                         ReplaceWith:="", _
                         Replace:=wdReplaceAll, _
                         MatchWildcards:=True)
    End With
  Next
End Sub

見ての通り、1821の各段落に順に[Range].Find.Executeメソッドを実行して置換している。

f:id:akashi_keirin:20210210084550j:plain

結果はこの通り。

見事に狙った箇所のみ置換することに成功している。

おわりに

これで、置換を施したい対象箇所の始めと終わりに、当該文書内では出てこないような文字列(「@@@」とか。)を目印として置いておき、その段落を取得するようにすれば、文書内の狙った範囲の箇所にのみ置換を実行することができる。

段落番号を取得するやつは、

akashi-keirin.hatenablog.com

このときに作成済み。