自動化に最適! Findと編集操作の組み合わせ

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
SelectionはRangeオブジェクトにセットして使用するのがお勧めです。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は移動してしまうので、起点を保持しておく必要がある場合は、検索実行の前に別のRangeにコピーを設けておきましょう。

多重検出を防止する

rngFind.Collapse Direction:=wdCollapseEnd

次の検索対象を「検出済み箇所を含まないそれ以降の範囲」にします。検出範囲に対する編集処理によっては、再度に検出されて無限ループになることがあるため、それを回避するためのおまじないです。下から上方向への処理の場合は、Direction:=wdCollapseStart にします。

検索条件 : Findオブジェクト

FindRangeオブジェクトの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を返します。

このサンプルは、文書の先頭から対象が見つからなくなるまで(ExecuteFalseを返すまで)繰り返すということになります。

Executeメソッドには、FindTextMatchCase など先にFindのプロパティに指定したものと同じ意味のパラメータがあります。Findプロパティで指定済みの条件は、Executeのパラメータでは指定不要です。

 

タイトルとURLをコピーしました