【入門編】Wordの『Findオブジェクト』でワイルドカード検索を極める:複雑な文字列のパターンマッチングと置換 – Word VBA解析バイブル

スポンサーリンク

ようこそ、Word VBAという深遠なる自動化の世界へ。私は、数多のドキュメントをコードの力で統治してきたチーフアーキテクトです。

マクロの記録を卒業し、「自分の意図通りにWordを操りたい」と願うあなたに、今日はWord VBAにおける最強の武器の一つである「Findオブジェクト(検索)とワイルドカード」の真髄を伝授しましょう。

Excel VBAの経験がある方でも、Wordの「Find」には少し戸惑うかもしれません。しかし、ここを乗り越えれば、数千ページの文書から特定のパターンだけを抜き出し、瞬時に書き換える「魔法」が手に入ります。

準備はいいですか? Word VBAの基本であり、かつ極致でもある「検索の美学」について解説します。

1. なぜ「Findオブジェクト」を極める必要があるのか?

WordはExcelのように「セル」という明確な住所を持っていません。広大な文字の海から目的の場所を特定するには、Range(範囲)を定義し、そこに対してFind(検索)をかけるのが唯一にして最善の道です。

特に「ワイルドカード(正規表現に似た機能)」を組み合わせることで、以下のような高度な処理が可能になります。

  • 「2023/10/01」をすべて「2023年10月1日」に変換する。
  • 「第1章」から「第99章」まで、特定の書式が設定された見出しだけを抽出する。
  • カッコ内の文字(例:【重要】)だけを太字にする。

これらはすべて、ワイルドカード検索の得意分野です。

2. 実装の前に知っておくべき「Findの三原則」

コードを書く前に、プロのエンジニアが必ず守る「Findの作法」があります。これを怠ると、意図しない挙動や無限ループに悩まされることになります。

1. ClearFormatting(初期化)の徹底: Wordの検索条件は、前回の操作(手動の検索を含む)を記憶してしまいます。必ず最初にリセットが必要です。
2. Rangeオブジェクトの使用: `Selection`(選択範囲)でも検索は可能ですが、画面がチラつきます。高速で安定した処理には`Range`を使いましょう。
3. MatchWildcardsをTrueにする: これを忘れると、ワイルドカード記号がただの文字として扱われます。

3. 【実践】ワイルドカード検索の基本パターン

まずは、実務で最も頻出する「日付形式の変換」を例に、基本のコードを見てみましょう。

サンプルコード:日付のフォーマットを一括変換する

Sub MasterWildcardSearch()
Dim doc As Document
Dim rng As Range

Set doc = ActiveDocument
Set rng = doc.Content ‘ 文書全体を対象にする

‘ — 1. Findオブジェクトの設定 —
With rng.Find
.ClearFormatting ‘ 検索条件の書式をクリア
.Replacement.ClearFormatting ‘ 置換後の書式をクリア

‘ ワイルドカード: ([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})
‘ 意味: 数字4桁 / 数字1〜2桁 / 数字1〜2桁
‘ カッコ()で囲むことで、後で \1, \2, \3 として再利用可能(バックリファレンス)
.Text = “([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})”

‘ 置換後の文字列: \1年\2月\3日
.Replacement.Text = “\1年\2月\3日”

.Forward = True ‘ 前方(下方向)へ検索
.Wrap = wdFindContinue ‘ 文末に達したら最初に戻る
.Format = False ‘ 書式の検索は行わない
.MatchCase = False ‘ 大文字小文字の区別
.MatchWholeWord = False ‘ 単語全体の一致
.MatchByte = False ‘ 半角全角の区別
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True ‘ ★ここが最重要!ワイルドカードを有効化
End With

‘ — 2. 実行 —
‘ wdReplaceAll はすべて置換。一つずつ処理する場合は Execute をループさせます。
rng.Find.Execute Replace:=wdReplaceAll

MsgBox “日付の変換が完了しました!”, vbInformation, “チーフアーキテクトからの報告”
End Sub

コードの解説

  • `([0-9]{4})`: 0から9の数字が4回繰り返されるパターンを「グループ1」として記憶します。
  • `\1`: 置換後の文字列の中で「グループ1」の内容をそのまま呼び出します。
  • `MatchWildcards = True`: これが「ワイルドカード・モード」のスイッチです。

4. プロの知恵:特定の「書式」を持つ文字列だけを狙い撃つ

単なる文字列置換ならExcelでもできます。Word VBAの真骨頂は、「書式(フォント、色、太字など)」を条件に含められることです。

例えば、「赤字になっている特定のパターンの単語だけを抽出する」といった処理です。

Sub FindSpecificFormat()
Dim rng As Range
Set rng = ActiveDocument.Content

With rng.Find
.ClearFormatting
.Text = “第[0-9]{1,}章” ‘ 「第1章」「第12章」などにマッチ
.Font.ColorIndex = wdRed ‘ ★検索条件:文字色が「赤」であること
.MatchWildcards = True

‘ 見つかるまでループする
Do While .Execute
‘ 検索にヒットすると、rngの範囲がそのヒットした文字列に「自動的に縮小」される
Debug.Print “発見しました: ” & rng.Text

‘ 次の検索のために、rngの終点を文書の最後まで広げ直す
‘ これを忘れると、同じ場所を無限に検索し続けます
rng.Collapse wdCollapseEnd
Loop
End With
End Sub

ここがポイント!

`rng.Find.Execute`が成功すると、`rng`オブジェクト自体が「見つかった場所」にピタッと重なるように変形します。 これがWord VBAで最も重要な感覚です。
次の検索へ進むには、`rng.Collapse wdCollapseEnd`(範囲をその場所の直後に折りたたむ)を行い、検索の開始地点をずらす必要があります。

5. 陥りやすいエラーと回避策

1. 「見つかりません」エラー:
`MatchWildcards`をTrueにしている場合、通常の検索で使える記号(`^p`(改行)など)が使えなくなる場合があります。ワイルドカード時は改行を`^13`と記述するなどの工夫が必要です。
2. 無限ループ:
`Execute`をループ内で使う際、`rng.Collapse`を忘れると、同じ箇所で「発見!」を繰り返し、Wordがフリーズします。
3. 前回の設定が残る:
`.ClearFormatting`は、おまじないではなく「必須の儀式」です。

終わりに:ここをクリアすれば、Word VBAの基本はバッチリですよ

WordのFindオブジェクトとワイルドカードの関係は、最初は少し複雑に感じるかもしれません。しかし、「Rangeを定義し、Findを設定し、Executeで動かす」という流れさえ掴んでしまえば、どんなに複雑な文書整形も一瞬で終わらせることができるようになります。

マクロの記録から一歩踏み出したあなたは、今、Wordという巨大なエンジンの鍵を手に入れました。このコードをベースに、自分の業務に合わせたパターンを組み込んでみてください。

もし分からないことがあれば、いつでも立ち止まってコードを読み返してください。一歩ずつ、確実に。あなたのエンジニアとしての成長を、私は心から応援しています。

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