こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身がさっぱり分からない……」と頭を抱えていませんか?
大丈夫、安心してください。今日あなたにご紹介するのは、Word VBAの真骨頂であり、数万行の文書を一瞬で手懐けるための秘密兵器「Findオブジェクトのワイルドカード検索」です。
世間では「Wordには正規表現がないから不便だ」なんて言われますが、それは大きな誤解です。Word独自の強力なワイルドカードエンジンをVBAから操れるようになれば、複雑な文字列パターンの抽出も置換も、まるで魔法のように自由自在になりますよ。
ここをクリアすれば、あなたのWord VBAスキルは間違いなく一段上のステージに到達します。さあ、一緒に扉を開けましょう!
—
1. なぜ「ワイルドカード検索」なのか?(正規表現の代わりとして)
VBAで文字列を処理する際、多くの人は `Replace` 関数を使ったり、VBA標準の正規表現(`VBScript.RegExp`)を使ったりします。しかし、Wordの文書(`.docx`)を相手にするなら、Wordアプリケーション自身が持つ検索エンジン(Findオブジェクト)を使うのが最も効率的です。
特に「特定の記号で囲まれた文字列(例:【〇〇】や「〇〇」)をごっそり抜き出したい」「改行を含んだパターンを捕らえたい」といった複雑なタスクにおいて、Wordのワイルドカード検索は正規表現の強力な代抗馬となります。
Wordワイルドカードの基本ルール
まずは、Word独自の記号(メタ文字)の顔ぶれを確認しておきましょう。VBAの正規表現とは少し方言が違うので注意が必要です。
| 意味 | ワイルドカード文字 | VBAコード内での記述例 |
| :— | :— | :— |
| 任意の1文字 | `?` | `[a-z]{1}` ではなく `?` |
| 0文字以上の任意の文字列 | “ | `AB` (AからBまでの文字列) |
| 指定範囲のいずれか | `[ ]` | `[0-9]` (数字のいずれか1文字) |
| 否定(〜以外) | `[! ]` | `[!0-9]` (数字以外の1文字) |
| 繰り返し(直前の文字がn個) | `{n}` または `{n,m}` | `[0-9]{4}` (4桁の数字) |
| グループ化 | `( )` | `(ABC)\1` (後方参照) |
—
2. 基礎のステップ:Findオブジェクトの正しい作法
VBAで検索を行うとき、多くの初心者が陥る罠があります。それは「検索条件を設定しただけで、実行(Execute)を忘れる・あるいは設定が前回の履歴を引きずってしまう」というエラーです。
WordのFindオブジェクトは、いわば「開いたままの検索ダイアログボックス」と同じです。前回の検索条件がネバネバと残り続けるため、VBAで使うときは必ず初期化(ClearFormatting)し、MatchWildcards = True を明示することが鉄則です。
実践:特定のカギ括弧内を太字にする基本コード
まずは、文書内にある「【 】」で囲まれた文字列を検索し、見つけたものを片っ端から太字にするコードを見てみましょう。
Sub FormatBracketsText()
Dim rngTarget As Range
Set rngTarget = ActiveDocument.Content ‘ 文書全体をレンジとして取得
‘ 1. 検索条件の初期化(前回のゴミを残さない)
rngTarget.Find.ClearFormatting
rngTarget.Find.Replacement.ClearFormatting
With rngTarget.Find
‘ 検索パターンの設定:「【」から「】」までの任意の文字列
.Text = “【】”
‘ ワイルドカードを使用するフラグをON
.MatchWildcards = True
‘ 文書全体を対象にする
.Forward = True
.Wrap = wdFindStop
‘ 該当部分の置換設定(今回は見つけたもの自体を太字にする)
.Replacement.Font.Bold = True
‘ 置換を実行(一括置換:wdReplaceAll)
.Execute Replace:=wdReplaceAll
End With
MsgBox “【 】内の太字化が完了しました!”, vbInformation
End Sub
ここがポイント!
- `rngTarget.Content` を使うことで、文書の最初から最後までを一つの「範囲(Range)」として捉えています。
- `.Text = “【】”` がワイルドカードの魔法です。“ は「何文字であっても良い」という意味なので、「【」と「】」で挟まれたあらゆる文字列にヒットします。
—
3. 応用編:複雑なパターンを「グループ(括弧)」で捕まえる
さて、ここからがチーフアーキテクトの本領発揮です。
単に囲み文字を探すだけでなく、「パターンの一部を保持したまま、順番を入れ替えて置換したい」と思ったことはありませんか?
例えば、文書内にある `[姓 名]` という並びを、すべて `[名 姓]` にひっくり返すケースを考えてみましょう。Wordのワイルドカードでは、丸括弧 `( )` で囲んだ部分を `\1`, `\2` という「後方参照」の変数として記憶させることができます。
実践:氏名の順番を入れ替える高度な一括置換
Sub SwapNameOrder()
Dim rngTarget As Range
Set rngTarget = ActiveDocument.Content
rngTarget.Find.ClearFormatting
rngTarget.Find.Replacement.ClearFormatting
With rngTarget.Find
‘ 検索パターン:スペース区切りの2つの単語をグループ(1)と(2)に捕捉
‘ ([一-龠]+) は漢字の連続を意味します
.Text = “([一-龠]{1,4}) ([一-龠]{1,4})”
‘ 置換パターン:グループ(2)とグループ(1)の順番を入れ替える
.Replacement.Text = “\2 \1”
.MatchWildcards = True
.Forward = True
.Wrap = wdFindStop
.Execute Replace:=wdReplaceAll
End With
MsgBox “氏名の順序入れ替えが完了しました。”, vbInformation
End Sub
このコードでは、`[一-龠]` という文字クラス(漢字の範囲指定)と `{1,4}`(1文字以上4文字以下)を組み合わせ、さらにそれを `( )` でグループ化しています。
検索側に `\1` と `\2` の記憶部屋を作り、置換側で `\2 \1` と並び替える。これが使いこなせば、データクレンジングの作業スピードが100倍になります。
—
4. 陥りやすいエラーと、現場のプロが教える回避策
Word VBAでワイルドカードを使っていると、必ずと言っていいほど次のような壁にぶつかります。
エラー・罠1:何もヒットしない(原因は全角・半角の罠)
Wordのワイルドカード検索は、半角と全角を厳密に区別します。
たとえば、検索パターンに半角スペースを入れてしまうと、全角スペースが混ざった日本のビジネス文書では一切ヒットしなくなります。
- 対策: パターンを組むときは、実際の文書内の文字が半角なのか全角なのかを必ず確認し、必要であれば `[ ]`(半角スペースと全角スペースの両方を許容する文字クラス)を使いましょう。
エラー・罠2:意図しない長〜い範囲が選択されてしまう(貪欲なワイルドカードの暴走)
ワイルドカードの “ は「貪欲(Greedy)」です。
例えば、文書内に `「開始」~「終了」` というペアが複数ある場合、`「」` で検索をかけると、最初の「開始」から最後の「終了」までをひとつの塊として一網打尽にしてしまいます。
- 対策: 「特定の文字を含まない」という否定の表現 `[! ]` を上手に使いましょう。
- 誤:`「」` (「」の中に「」が含まれている場合におかしくなる)
- 正:`「[!「」]」` (「」以外の文字が続く「」で囲まれた範囲)
—
おわりに:あなたのWord VBAは、もう「初心者」ではない
お疲れ様でした!今回はWord VBAのFindオブジェクトにおけるワイルドカード検索の極意を解説しました。
最初は呪文のように見えた `[!0-9]{1,}` や `( )\1` も、意味を分解して理解すれば、あなたの強力な相棒になってくれます。マクロの記録の殻を破り、こうした高度なオブジェクト操作を身につけたあなたは、もはやプログラミング初学者ではありません。
現場の面倒な文書整形やデータ抽出はすべてマクロに任せて、あなたしかできないクリエイティブな仕事に時間を使いましょう。
それでは、次回の極限の知見でお会いしましょう!
