Word VBAの真髄:Find検索と正規表現を融合させた「二段構え」の置換術
こんにちは。現場で泥臭い自動化と格闘し続けてきたエンジニアとして、今日はWord VBAの「検索と置換」という、一見地味で、しかし極めて奥が深い領域について語りましょう。
多くの人が「マクロの記録」から始めますが、それはあくまで入り口です。「Find」の高速な検索能力と、「正規表現」の緻密なパターンマッチング。この二つを掛け合わせることで、あなたのドキュメント処理は一段上の次元へと進化します。
今日は、そのための「二段構え」の戦略を伝授します。
—
なぜ「二段構え」が必要なのか?
Wordの`Find`オブジェクトは非常に強力ですが、標準のワイルドカード検索は、プログラミングの世界で使われる「正規表現(RegExp)」と比べると機能が制限されています。
そこで、「Findで大まかな候補を絞り込み、RegExpで詳細なバリデーションを行う」というアプローチをとります。これにより、パフォーマンスを落とさずに、複雑なロジックに基づいた置換が可能になります。
—
ステップ1:準備(VBScriptの正規表現エンジンを呼び出す)
Word VBAで正規表現を使うには、参照設定が必要です。
1. VBAエディタを開く(Alt + F11)
2. メニューの「ツール」→「参照設定」を選択
3. 「Microsoft VBScript Regular Expressions 5.5」にチェックを入れてOKを押す
これで、あなたのWord VBAから強力な正規表現エンジンが呼び出せるようになりました。
—
ステップ2:実装コード(現場の知見を込めて)
以下のコードは、「特定の単語を含み、かつ数値が3桁である場合のみ置換する」というシナリオを想定しています。
Sub AdvancedReplaceWithRegExp()
Dim rng As Range
Dim regEx As Object
Set regEx = CreateObject(“VBScript.RegExp”)
‘ 正規表現パターンの設定(例:3桁の数字を抽出)
regEx.Pattern = “\d{3}”
regEx.Global = True
‘ Wordの検索範囲を指定
Set rng = ActiveDocument.Content
With rng.Find
.ClearFormatting
.Text = “ID[0-9]{3}” ‘ まずFindでID+数字のような形式を大まかに絞り込む
.MatchWildcards = True
‘ ドキュメントを先頭からループ検索
Do While .Execute
‘ 【二段構えの核心】
‘ Findで見つけたテキストを、正規表現で厳密に検証する
If regEx.Test(rng.Text) Then
‘ 条件を満たした場合のみ、ここで置換処理を行う
rng.Text = “Verified_” & rng.Text
‘ 置換した分、Rangeを先に進める(無限ループ防止)
rng.Collapse wdCollapseEnd
End If
Loop
End With
MsgBox “置換処理が完了しました。”, vbInformation
End Sub
—
コードの解説と「ハマりどころ」
1. なぜ `rng.Collapse` が必要なのか?
Findのループ処理で最も多いミスが「無限ループ」です。置換した後の文字列を再びFindが検索してしまうためです。`rng.Collapse wdCollapseEnd` を入れることで、検索開始位置を「現在の末尾」に移動させ、正しく次へ進ませることができます。
2. Findと正規表現、どちらに重きを置くか
Findは「Wordのバイナリ構造を高速に走査する」のに長けています。一方、正規表現は「論理的なパターン検証」に長けています。
- Find: 全体から候補を絞る(パフォーマンス重視)
- 正規表現: 候補の中から正しいものを選ぶ(正確性重視)
この役割分担こそが、大規模なドキュメントを扱う際の最適解です。
3. 陥りやすいエラー:オブジェクトの寿命
`Set regEx = CreateObject(…)` はループの外に出しましょう。ループの中で毎回インスタンス化すると、メモリの解放が追いつかず、処理速度が劇的に低下します。これは、長く運用されるマクロを書く上での鉄則です。
—
あなたの武器になるために
「マクロの記録」で作ったコードは、その場限りの使い捨てになりがちです。しかし、このように「検索エンジン」の特性を理解し、ロジックを設計するようになれば、それはあなただけの強力なツールになります。
今回紹介した「二段構え」のロジックは、ただの置換にとどまりません。例えば「日付フォーマットを修正する」「特定のコード体系を書き換える」など、活用の幅は無限大です。
まずはこのコードを、お手元の環境で動かしてみてください。うまく動かない箇所があれば、そこがあなたの次の「学びの扉」です。応援しています。何かあれば、いつでもまた聞きに来てくださいね。
