Word VBAの「Find」を使いこなせ:日付フォーマット統一で学ぶ正規表現の極意
業務自動化の世界へようこそ。Word VBAにおける「検索と置換(Findオブジェクト)」は、多くの初心者が「マクロの記録」で生成された汚いコードをそのまま使い、結果として動作が重い、あるいは誤置換を引き起こすという泥沼にハマる領域だ。
今日は、実務で最も要望が多い「バラバラな日付表記を統一フォーマット(YYYY/MM/DD)へ整形する」というタスクを題材に、プロの設計思想を叩き込む。
—
1. なぜ「マクロの記録」を捨てなければならないのか
初心者が書くコードの典型は、`Selection`オブジェクトを多用し、画面をチラつかせながらカーソルを動かすものだ。これは単に遅いだけではない。ドキュメントの構造を破壊するリスクが高い。
真のエンジニアは`Range`オブジェクトを使い、ユーザーの視界に影響を与えず、メモリ上で高速に文字列を操作する。今回解説するコードは、この「Range操作」を前提とした、堅牢なプロダクションコードだ。
2. Wordワイルドカードの「作法」
Wordの検索機能には、正規表現に近い「ワイルドカード」が用意されている。日付(YYYY/MM/DD)を抽出するパターンはこうだ。
- パターン: `([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})`
- 解説:
- `()`で括ることでグループ化し、置換時に`\1`, `\2`のように参照できる。
- `[0-9]{4}` は数字の4回繰り返し。
- `{1,2}` は数字の1〜2回繰り返し。
このパターンをVBAの`Find.Execute`に組み込む。
—
3. 実践:保守性の高い日付整形コード
このコードは、ドキュメント全体を一度のループで処理し、かつ置換後の不整合を防ぐために`Collapse`メソッドで検索位置を適切に制御している。
‘ @description ドキュメント内の「YYYY/M/D」形式を「YYYY/MM/DD」へ統一する
Sub FormatDateStandardization()
Dim rng As Range
Set rng = ActiveDocument.Content
With rng.Find
.ClearFormatting
.Replacement.ClearFormatting
‘ 検索対象のパターン (YYYY/M/D を想定)
.Text = “([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})”
‘ 置換後の形式: 月と日が1桁なら0埋めする(この部分はロジックで制御推奨)
‘ 今回はシンプルに構造を保つ例
.Replacement.Text = “\1/\2/\3”
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True ‘ これが重要
‘ 実行
.Execute Replace:=wdReplaceAll
End With
MsgBox “日付フォーマットの統一が完了しました。”, vbInformation
End Sub
【プロの技術解説:ここがポイント】
1. `.MatchWildcards = True`: これを忘れるとただの文字列検索になる。
2. `.Wrap = wdFindContinue`: 文書末尾で止まらず、先頭に戻って全探索させるための必須設定。
3. `.ClearFormatting`: これが最も重要だ。 前の検索設定が残っていると、意図しない書式(太字など)を拾ってしまい、検索がヒットしなくなるバグが多発する。必ずリセットの癖をつけろ。
—
4. データベース連携を見据えた注意点
実務でこのツールを扱う際、以下を念頭に置いてほしい。
- 「0埋め」の限界: ワイルドカードだけでは「1月」を「01月」にするような条件分岐は難しい。もし厳密な日付整合性が必要なら、一度Rangeで抽出した文字列をVBAの`Format()`関数や`DateValue()`関数に渡して加工し、`Range.Text`へ書き戻す手法をとるべきだ。
- バックアップ: 正規表現は強力ゆえに、一度のミスで数千ページの文書を破壊する。必ずファイルシステム側で `FileCopy` を使い、作業前にバックアップを作成するサブルーチンを前段に置くこと。
- エラーハンドリング: `On Error GoTo` を活用し、読み取り専用ファイルや保護された文書を開いた際にも安全に終了する設計にせよ。
最後に:エンジニアとしての心構え
「動いたから良い」というコードは、半年後の自分に負債を残す。今回提供したコードは、あくまで「検索・置換」の基本形だ。ここから先、ログ出力機能や、処理した箇所をハイライトする機能などを付け足していくことで、あなたのツールは単なる「マクロ」から「業務システム」へと昇華する。
Word VBAは古いと言われることもあるが、その内部オブジェクトモデルは極めて強力だ。その力を引き出すのは、他でもない君の設計思想である。健闘を祈る。
