Word VBAの検索(Find)の利用価値は置換だけではありません。拡張的に利用して様々な作業を自動化する方法を紹介します。
例えば、検出箇所が含まれる段落全体の色を変えたり、検出箇所が表の中かどうかで処理を分析させたりといったことが可能です。これをうまく使えば、Wordの編集作業を自動化するのに強力なツールになります。
そのためには少し複雑な仕組みの理解が必要なので、その解説をしていきます。
文書全体の該当箇所を処理するマクロ
Set rngFind = ActiveDocument.Range(0, 0)
rngFind.Find.ClearFormatting
With rngFind.Find
'検索条件を指定
.Forward = True
.Wrap = wdFindStop
End With
Do While rngFind.Find.Execute(FindText:=FINDTXT) = True
'検出時の rngFind を基点にした処理
' .......
rngFind.Collapse Direction:=wdCollapseEnd
Loop
検索対象 : Rangeオブジェクト
Rangeオブジェクトをセット
この例では文書全体を処理するので、rngFind に ActiveDocument.Range(0, 0)
(文書の先頭)をセットしています。ActiveDocument.Content(文書全体)としてもOKです。
特定の範囲内を対象にすることもできます。
' 文書全体
Set rngFind = ActiveDocument.Content
'1番目のテーブル内
Set rngFind = ActiveDocument.Tables(1)
'選択範囲内
Set rngFind = Selection
Rangeオブジェクトは検出範囲に移動する
WordのFind
の重要ポイントです。検索で該当箇所が見つかると、Rangeオブジェクトはその該当箇所に移動します(Rangeオブジェクトが再定義されます)。
このおかげでRangeオブジェクト(検出された範囲)から情報を取得したり操作したりといったことが可能になります。
操作の対象、分岐判断の対象の取得例
'例(1) 検出箇所を含む段落
Set p = rngFind.Paragraphs(1)
'例(2) 検出箇所の前の段落
Set pPre = rngFind.Paragraphs(1).Previous
'例(3) 検出箇所が表内か
ret = rngFind.Information(wdWithInTable)
多重検出を防止する
rngFind.Collapse Direction:=wdCollapseEnd
次の検索対象を「検出済み箇所を含まないそれ以降の範囲」にします。検出範囲に対する編集処理によっては、再度に検出されて無限ループになることがあるため、それを回避するためのおまじないです。下から上方向への処理の場合は、Direction:=wdCollapseStart
にします。
検索条件 : Findオブジェクト
Find
はRange
オブジェクトのFind
プロパティから取得するオブジェクトです。段落のように文書内に実体があるわけでないので、慣れないと戸惑うかもしれません。Find
オブジェクトは、検索・置換の各種条件を保持するプロパティと、検索・置換を実行するメソッドを持ちます。
Findオブジェクトのプロパティは、[検索と置換]ダイアログボックスと対応しています。
前回の検索・置換時の書式条件をクリア
検索マクロではお約束のおまじないです。Findオブジェクトのプロパティを指定する前に、前回実行時の指定をクリアしておきます。ダイアログボックスの[書式を削除]ボタンに相当します。
Rangeオブジェクト.Find.ClearFormatting
置換も行う場合は、以下も追加します。
Rangeオブジェクト.Find.Replacement.ClearFormatting
Findオブジェクトにプロパティをセット
条件に必要なプロパティを設定します。この例では、文書先頭から末尾方向(Forward)に処理し、末尾から先頭に戻らないという条件を指定しています。
Findオブジェクトの実行とループ処理
Do
While
rngFind.Find.Execute(FindText:=FINDTXT)
=
True
~ Loop
Find
オブジェクトにセットした条件で検索・置換を実行するには、Execute
メソッドを使います。Execute
は対象が検出されるとTrue
を返します。
このサンプルは、文書の先頭から対象が見つからなくなるまで(Execute
がFalse
を返すまで)繰り返すということになります。