こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押してコードを生成する日々から一歩進み、「自分の手でスマートなプログラムを書きたい」と思っているあなたへ。
実務でこんな壁にぶつかったことはありませんか?
「社内用語の古い言い回しを、新しい言い回しにまとめて一括変換したい。しかもそれが10個や20個ではなく、数十個もある……」
これを愚直に `Find.Execute` のコードを何十行も書き並べていたら、コードは縦長になり、保守性は最悪、実行速度もガタガタになります。
今回は、「検索・置換のリストを『配列』でスマートに管理し、たった一つのループで爆速かつ優雅に処理する極上のデザインパターン」を伝授します。ここをクリアすれば、あなたのWord VBAスキルは間違いなく中級者の領域に到達します。一緒にマスターしていきましょう!
—
1. なぜ「配列 × ループ」なのか?(アーキテクトの視点)
まず、Word VBAの `Find` オブジェクトの性質を思い出してください。あれはWordの画面上で「Ctrl + F」を押して検索窓に文字を入力する動作を裏側で再現しているようなものです。
そのため、何十個ものキーワードを置換しようとコードをこう書くと……
‘ ──【悪い例:泥臭いハードコーディング】──
Selection.Find.ClearFormatting
Selection.Find.Text = “旧用語A”
Selection.Find.Replacement.Text = “新用語A”
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.Text = “旧用語B”
Selection.Find.Replacement.Text = “新用語B”
Selection.Find.Execute Replace:=wdReplaceAll
‘ (これが延々と続く…)
これでは、新しい用語を追加・削除するたびにコードの本体を修正しなければならず、メンテナンス(保守性)の観点から最悪です。
解決策:データとロジックの分離
「どの言葉を、どの言葉に置き換えるか」というデータ(置換リスト)と、「それをどうやって検索・置換するか」というロジック(処理プログラム)を完全に切り離します。
その器として最適なのが、VBAの「二次元配列」です。
—
2. 全体像をイメージしよう(二次元配列の構造)
今回使う配列は、いわば「エクセルの表」のようなものです。行と列を持ち、次のようにデータを保持させます。
| 行(インデックス) | 列0(検索する言葉:Key) | 列1(置換後の言葉:Value) |
| :— | :— | :— |
| 0行目 | “株式会社A” | “株式会社ABC” |
| 1行目 | “旧システム” | “新クラウド基盤” |
| 2行目 | “平成〇年” | “令和〇年” |
この表をメモリ上にパッと展開し、プログラムが「上から順に1行ずつ取り出して置換を実行していく」という仕組みを作ります。
—
3. 実装コード:複数キーワード一括置換プロシージャ
それでは、実際の開発現場でそのままコピペして使える、洗練されたコードを公開します。標準モジュールに貼り付けて実行してみてください。
Option Explicit
Sub ExecuteBatchReplace()
‘ =====================================================================
‘ 目的:二次元配列に定義した複数のキーワードを一括で検索・置換する
‘ 対象:アクティブなWord文書全体
‘ =====================================================================
Dim replaceList() As Variant
Dim i As Long
Dim startTime As Double
‘ 処理速度計測用(エンジニアのこだわり)
startTime = Timer
‘ —————————————————————–
‘ 1. 置換リスト(二次元配列)の定義
‘ —————————————————————–
‘ 形式:replaceList(行, 列) -> 0列目:検索ワード, 1列目:置換ワード
‘ ※ここにいくらでもキーワードを追加・削除できます
‘ —————————————————————–
replaceList = Array( _
Array(“旧システム”, “新クラウド基盤”), _
Array(“株式会社A”, “株式会社ABC”), _
Array(“平成〇年”, “令和〇年”), _
Array(“ハンコ”, “電子サイン”), _
Array(“紙の書類”, “デジタルアセット”) _
)
‘ —————————————————————–
‘ 2. Wordの描画を停止して爆速化する(画面のチラつきも防止)
‘ —————————————————————–
Application.ScreenUpdating = False
‘ —————————————————————–
‘ 3. ループ処理による一括置換の実行
‘ —————————————————————–
‘ LBound(配列) から UBound(配列) まで、配列の要素数分だけループを回します
For i = LBound(replaceList) To UBound(replaceList)
With ActiveDocument.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
‘ 配列の 0番目(検索文字)と 1番目(置換文字)を取り出す
.Text = replaceList(i)(0)
.Replacement.Text = replaceList(i)(1)
‘ 前後の条件設定
.Forward = True
.Wrap = wdFindContinue
.MatchCase = False ‘ 大文字・小文字を区別するか
.MatchWholeWord = False ‘ 単語全体を一致させるか
.MatchWildcards = False ‘ ワイルドカードを使用するか
‘ 一括置換の実行
.Execute Replace:=wdReplaceAll
End With
Next i
‘ —————————————————————–
‘ 4. 描画設定を元に戻す
‘ —————————————————————–
Application.ScreenUpdating = True
‘ 完了メッセージ(処理時間つき)
MsgBox “一括置換が完了しました!” & vbCrLf & _
“処理時間: ” & Format(Timer – startTime, “0.00”) & ” 秒”, _
vbInformation, “処理成功”
End Sub
—
4. コードの深掘りポイント(ここが分かると一気にプロっぽくなる)
① `Array(Array(…), Array(…))` という書き方
VBAで二次元配列(あるいは配列の配列)をスマートに初期化する定番のイディオムです。1行ずつ `replaceList(0, 0) = “…”` と書いていくとコードが無駄に長くなりますが、この書き方なら一目でリスト構造が把握できます。保守性が劇的に向上しますよね。
② `Application.ScreenUpdating = False` の魔法
これ、実務では絶対に忘れてはいけないプロの技です。
Word VBAは、コードが1回置換を実行するたびに、画面の表示を更新(再描画)しようとします。キーワードが50個あれば、画面が50回パチパチと切り替わり、処理が非常に遅くなります。
処理の最初に `False` にし、最後に `True` に戻すことで、バックグラウンドで一瞬にして処理を完了させることができます。
③ `With ActiveDocument.Content.Find` のスコープ
カーソルがある場所(`Selection`)だけに頼るのではなく、文書全体を内包する `ActiveDocument.Content` に対して直接 `Find` を行っています。これにより、ユーザーがどこにカーソルを置いていようとも、確実に文書全体の置換を保証できます。
—
5. 初学者が陥りやすい「罠」とエラー対策
このコードを実務で応用する際、よくあるつまずきポイントを先回りして解説しておきます。
- 罠1:特殊文字や改行コードを置換したい
- 普通の文字列だけでなく、改行(`^p`)やタブ(`^t`)を含めたい場合は、配列内の文字列にそのままWordの検索記号(`^p` 等)を指定可能です。ただし、ワイルドカードを使う場合は `.MatchWildcards = True` に切り替える必要があります(今回は基礎のため `False` に固定しています)。
- 罠2:配列のインデックスエラー
- `replaceList(i)(0)` の部分で「インデックスが有効範囲にありません」というエラーが出る場合、配列の定義(`Array` のネスト構造)が崩れている可能性が高いです。括弧の閉じ忘れに注意してください。
—
まとめ:あなたの武器をまた一つ増やそう
今回は、検索対象の文字列を配列でスマートに管理し、複数キーワードを一括置換する手法を解説しました。
- データ(置換リスト)とロジック(プログラム)を分離する
- 配列と `For` ループでコードをコンパクトにする
- `ScreenUpdating` でパフォーマンスを最大化する
この3つを押さえておけば、どんなに大量の置換作業を頼まれても、コーヒーを一口飲んでいる間に終わるような自動化ツールをサクッと作れるようになります。
ここをクリアしたあなたなら、もう「マクロの記録の奴隷」ではありません。ぜひ、ご自身の業務データで試してみてくださいね。あなたのVBAライフが、より優雅で快適なものになりますように!
