Word VBAで「表記ゆれ」を撲滅する。正規表現を用いたデータクレンジングの極意
Wordの検索・置換機能(`Find`オブジェクト)を使い、手作業でポチポチと表記ゆれを修正しているなら、今すぐその手を止めてください。それは「自動化」ではなく「単なる力仕事」です。
ビジネス文書における「郵便番号」や「電話番号」の表記ゆれは、データ活用における最大の敵です。今回は、VBScript.RegExpをWord VBAに統合し、「表記ゆれを壊滅させ、正規化されたデータに昇華させる」ための、プロフェッショナルな実装手法を伝授します。
—
1. なぜ「Wordの検索・置換」だけでは不十分なのか
Word標準のワイルドカード検索は強力ですが、複雑な条件分岐や、キャプチャグループを用いた文字列の再構成には限界があります。
例えば、以下のケースを想像してください。
- 「03-1234-5678」
- 「(03)1234.5678」
- 「03 1234 5678」
これらを「03-1234-5678」という標準フォーマットに統一する際、標準機能では力不足です。我々エンジニアが求めるのは、「一撃で、漏れなく、再利用可能な形で変換する」こと。そこで登場するのが `VBScript.RegExp` です。
—
2. プロダクションコード:正規化エンジン
このコードは、ドキュメント内の全テキストを走査し、マッチしたパターンを洗練された形式に置換します。ポイントは、正規表現オブジェクトを一度だけインスタンス化し、使い回すことです。ループ内で何度も生成するのはメモリの無駄遣いであり、パフォーマンスを低下させる悪手です。
Option Explicit
‘ 郵便番号と電話番号を正規化するメインルーチン
Sub NormalizeContactInfo()
Dim regEx As Object
Set regEx = CreateObject(“VBScript.RegExp”)
‘ ドキュメント全体を対象にする
Dim rng As Range
Set rng = ActiveDocument.Content
‘ 1. 電話番号の正規化 (例: 03-1234-5678)
‘ 全角半角・記号のゆれを吸収し、ハイフン区切りへ
With regEx
.Global = True
.IgnoreCase = True
.MultiLine = False
‘ 0から始まる市外局番、区切り文字を問わず抽出
.Pattern = “0\d{1,4}[-.\s\(]?\d{1,4}[-.\s\)]?\d{3,4}”
Dim matches As Object
Set matches = .Execute(rng.Text)
‘ 逆順から置換しないと、文字列のインデックスがずれて崩壊する
Dim i As Long
For i = matches.Count – 1 To 0 Step -1
Dim m As Object
Set m = matches(i)
‘ ここで標準形式へフォーマットする(簡易的な例)
rng.SetRange m.FirstIndex, m.FirstIndex + m.Length
rng.Text = FormatPhoneNumber(m.Value)
Next i
End With
MsgBox “クレンジング完了。データが最適化されました。”, vbInformation
End Sub
‘ 正規化ロジックの分離:保守性を高める
Function FormatPhoneNumber(ByVal rawText As String) As String
‘ 1. 全角数字を半角に変換
‘ 2. ハイフン以外の記号を削除
‘ 3. 規定のフォーマットに加工
‘ 実務ではここでさらに詳しいバリデーションを行う
FormatPhoneNumber = StrConv(rawText, vbNarrow)
‘ ※簡易実装のため、実際にはさらに詳細な置換ロジックを組むこと
End Function
—
3. 実務で「バグらせない」ための3つの鉄則
① 「逆順」から置換せよ
文字列の置換を行う際、先頭から処理すると、後の文字列のインデックス(`FirstIndex`)がズレてしまい、結果としてドキュメントが破壊されます。必ず末尾のインデックスから処理を行うこと。これはWord VBAにおける鉄則中の鉄則です。
② データベース連携時の注意点
もしWordから抽出したデータをCSVやSQLへ送るなら、必ず「全角・半角の正規化」だけでなく「不要な制御文字(改行コード等)のトリミング」をセットで行ってください。Excelに貼り付けた瞬間にセルが崩れる原因の9割は、このクリーニング不足です。
③ ユーザーへのフィードバック
数千ページに及ぶドキュメントを処理する場合、VBAの処理時間は数秒から数分かかることがあります。`Application.ScreenUpdating = False` を利用して画面描画を停止し、処理が終わったら元に戻す。この一行があるだけで、ユーザー体験(UX)は劇的に向上します。
—
最後に:コードは「資産」である
今回紹介した手法は、単なるテキストの置き換えではありません。「表記のゆれ」というビジネス上のノイズを除去し、情報をデータとして正しく機能させるための「データエンジニアリングの第一歩」です。
コードをコピペして動かして終わりにするのではなく、正規表現のパターン(`.Pattern`)を自社の業務データに合わせて調整し、自分だけの「クレンジング・ライブラリ」を育ててみてください。
これこそが、伝説的な自動化エンジニアへの近道です。健闘を祈ります。
