【入門編】【上級者向け】検索結果を「正規表現」で検証し、条件を満たす場合のみ置換する – Word VBA解析バイブル

スポンサーリンク

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(…)` はループの外に出しましょう。ループの中で毎回インスタンス化すると、メモリの解放が追いつかず、処理速度が劇的に低下します。これは、長く運用されるマクロを書く上での鉄則です。

—

あなたの武器になるために

「マクロの記録」で作ったコードは、その場限りの使い捨てになりがちです。しかし、このように「検索エンジン」の特性を理解し、ロジックを設計するようになれば、それはあなただけの強力なツールになります。

今回紹介した「二段構え」のロジックは、ただの置換にとどまりません。例えば「日付フォーマットを修正する」「特定のコード体系を書き換える」など、活用の幅は無限大です。

まずはこのコードを、お手元の環境で動かしてみてください。うまく動かない箇所があれば、そこがあなたの次の「学びの扉」です。応援しています。何かあれば、いつでもまた聞きに来てくださいね。

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