【入門編】【中級者向け】正規表現による「郵便番号」や「電話番号」の表記ゆれを自動統一するクレンジングツール – Word VBA解析バイブル

スポンサーリンク

【Word VBA極意】正規表現で「表記ゆれ」を殲滅せよ!郵便番号・電話番号クレンジングの極み

こんにちは。自動化の現場で泥臭いデータと格闘し続けてきた先輩エンジニアです。

「マクロの記録」で生成された長ったらしいコードに絶望したことはありませんか? `Selection.Find` を繰り返すだけの非効率な処理から卒業しましょう。今回は、VBScript.RegExp(正規表現エンジン)をWord VBAに組み込み、文書内の「表記ゆれ」を瞬時に統一するプロフェッショナルな手法を伝授します。

—

なぜ「Find/Replace」だけでは限界があるのか?

Word標準の検索機能は優秀ですが、「全角・半角の混在」や「ハイフンの有無」といった不規則なパターンを条件分岐なしで処理するのは困難です。

そこで登場するのが正規表現です。これを使うと、「数字が3つ、ハイフン、数字が4つ…」といった「パターンのルール」を記述するだけで、Word文書内のあらゆる箇所を一網打尽にできます。

—

実践:郵便番号と電話番号をクレンジングするコード

以下のコードをVBAエディタ(Alt + F11)に貼り付けてみてください。このコードは、文書全体を走査し、見つけた番号を「半角・ハイフン付き」の美しい形式へ統一します。

Option Explicit

‘ 参照設定不要で使えるVBScript.RegExpを利用します
Public Sub CleanUpNumberFormats()
Dim regEx As Object
Dim rng As Range

‘ 正規表現オブジェクトの生成(設計図を作るイメージ)
Set regEx = CreateObject(“VBScript.RegExp”)

‘ 郵便番号(例: 123-4567, 1234567, 123ー4567)を統一
‘ 全角数字や全角ハイフンも許容し、半角の XXX-XXXX に変換
CleanText “([0-90-9]{3})[--ー]([0-90-9]{4})”, “$1-$2”, regEx

‘ 電話番号(例: 090-1234-5678)を統一
CleanText “0[789]0[--ー]?[0-90-9]{4}[--ー]?[0-90-9]{4}”, “090-1234-5678”, regEx, True

MsgBox “クレンジング完了!文書が整理されました。”, vbInformation
End Sub

‘ 正規表現による置換エンジン(再利用可能な共通関数)
Private Sub CleanText(pattern As String, replaceStr As String, regEx As Object, Optional isPhone As Boolean = False)
Dim doc As Document
Set doc = ActiveDocument

With regEx
.Global = True ‘ 文書全体を検索
.IgnoreCase = True ‘ 大文字小文字を区別しない
.pattern = pattern ‘ 検索したいパターンのルール

‘ 置換実行:WordのRangeオブジェクトを直接操作せず、
‘ 一度テキストを取得してメモリ上で処理するのが高速化の秘訣です
Dim txt As String
txt = doc.Content.Text

If .Test(txt) Then
doc.Content.Text = .Replace(txt, replaceStr)
End If
End With
End Sub

—

コードのここが「プロのこだわり」

1. メモリ上での一括置換(高速化の極意)

多くの初心者がやりがちな「`Selection` を一つずつ動かして置換する」方法は、画面描画が発生するため非常に低速です。このコードでは `doc.Content.Text` で文書全体を一度メモリ上の変数に引き上げ、正規表現で一気に処理してから書き戻しています。処理速度が数百倍変わります。

2. 再利用可能な関数構造

`CleanText` という共通関数を作ることで、検索パターンが増えてもメイン処理が汚れません。現場で求められるのは「読みやすく、保守しやすい」コードです。

—

陥りやすいエラーと対策

  • 「全角数字」の罠

Word VBAは標準では半角しか扱いにくいですが、正規表現の `[0-90-9]` と記述することで、全角数字もまとめて補足できます。これだけでデータ入力者の入力ミスを吸収できます。

  • 置換後の文字化け

`doc.Content.Text` を直接書き換えると、Wordが持っている書式情報(太字やフォントなど)がリセットされる場合があります。もし書式を維持したい場合は、`Range.Find` と正規表現を組み合わせる高度なアプローチが必要になります。まずはこのコードで「テキストのクレンジング」に慣れてください。

—

最後に:自動化は「ルール」を定義することから始まる

Word VBAをマスターする近道は、「手作業のルール」を「正規表現のパターン」に翻訳する練習をすることです。

「表記ゆれを一つ一つ手で直す」という苦行から、あなたを解放するためにこのコードはあります。まずはご自身の文書で試してみてください。エラーが出たら、それは「新しいパターンの発見」です。その一つ一つが、あなたのエンジニアとしての血肉になっていきます。

次は、この正規表現をさらに応用して、「特定のキーワードを自動的に見出しスタイルに変更する」テクニックを解説できればと思います。応援していますよ!

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