Word VBAで「数字の群れ」を操る:ワイルドカード検索の真髄
こんにちは。業務自動化の世界へようこそ。
「マクロの記録」ボタンを押して生成された、冗長で意味不明なコードに絶望したことはありませんか?大丈夫、今日からが本当のスタートです。
Word VBAにおいて最も強力な武器、それは「Findオブジェクト」と「ワイルドカード」の組み合わせです。これさえ使いこなせれば、数千ページの文書のクリーンアップも一瞬で終わります。
今回は、バラバラに散らばった「数字」を捕まえ、カンマ区切りに整形するという実務で死ぬほど使うテクニックを伝授します。
—
1. なぜ「ワイルドカード」なのか?
Wordの検索には「普通の検索」と「ワイルドカード検索」の2種類があります。
プログラミングの世界でいう「正規表現」に近い機能なのですが、Word特有の癖があります。
- [0-9] :0から9のいずれか1文字
- {n,} :n回以上の繰り返し
これらを組み合わせると、「数値の塊」を自在に抽出・操作できるようになります。これができれば、手作業での置換作業からは永久に解放されます。
—
2. 実戦コード:数値列をカンマ区切りに整形する
まずは、このコードを標準モジュールに貼り付けてみてください。文書内にある「4桁以上の数字」を見つけ出し、自動的にカンマ(例: 1234 → 1,234)を挿入する実用的なコードです。
Sub FormatNumbersWithComma()
‘ Wordの検索機能を制御するRangeオブジェクトを定義
Dim rng As Range
Set rng = ActiveDocument.Content
‘ Findオブジェクトで検索条件を構築
With rng.Find
.ClearFormatting ‘ 前回の検索設定をリセット(重要!)
.Replacement.ClearFormatting
.Text = “([0-9])([0-9]{3})” ‘ 4桁以上の数字をグループ化して検索
.Replacement.Text = “\1,\2” ‘ 間にカンマを入れる置換設定
.Forward = True ‘ 文書の前方に向かって検索
.Wrap = wdFindContinue ‘ 文書末まで行ったら最初に戻る
.Format = False ‘ 書式は無視
.MatchWildcards = True ‘ 【最重要】ワイルドカードを有効化
‘ 一括置換(全置換)を実行
.Execute Replace:=wdReplaceAll
End With
MsgBox “数字の整形が完了しました。”, vbInformation
End Sub
—
3. コードの「魂」を解説する
初心者の方が陥りやすい罠と、それを回避する「プロの視点」を共有します。
① `.ClearFormatting` を忘れないこと
これが最も多いバグの原因です。WordのFind機能は、「前回どんな条件で検索したか」を記憶し続けます。 太字の検索をした後にこのコードを動かすと、正常に動作しません。必ず毎回クリアする癖をつけてください。
② `[0-9]` と `([0-9])` の違い
括弧 `()` を使うと、その部分を「グループ」としてメモリに保持できます。
今回の `.Replacement.Text = “\1,\2″` は、検索で見つけたグループ1とグループ2の間にカンマを挟む、という命令です。この「入れ替え・加工」ができるのがワイルドカードの最大の魅力です。
③ `Range` オブジェクトの支配力
`Selection`(現在のカーソル位置)を使うと、画面がチラついて動作も遅くなります。`ActiveDocument.Content` を使って文書全体をRangeとしてメモリ上に展開し、裏側で処理を完結させるのがプロの作法です。
—
4. 最初の一歩を踏み出すあなたへ
このコードを動かす際の注意点として、「ワイルドカード検索は、普通の検索よりも複雑なルールを持っている」ことを覚えておいてください。
例えば、`?` は1文字を表しますが、半角の `?` と全角の `?` は区別されます。また、特殊な記号(“ や `(` )を文字として検索したい場合は、`\`(バックスラッシュ/円記号)を前につけてエスケープする必要があります。
「ここをクリアすれば、Word VBAの基本はバッチリですよ」
まずはこのコードで「数字がカンマに変わる」という魔法を体験してください。それができれば、あなたはもうマクロの記録に頼るだけの初心者ではありません。
次は、これをループさせて「見つけた数値に特定のスタイルを適用する」といったステップアップも可能です。分からないことがあれば、またいつでも聞きに来てくださいね。あなたの自動化ライフを心から応援しています。
