【Word VBA×JSON】「置換辞書」を外部化して、マクロを“運用可能な資産”に変える極意
こんにちは。現場で泥臭い自動化を積み重ね、いつしかシステム全体を俯瞰するようになったエンジニアです。
皆さんはWordで「置換」作業をするとき、マクロの中に直接「Find.Text = “A”、Replace.Text = “B”」と書き込んでいませんか? もしそうなら、そのマクロは「一度書いたら修正できない負債」になりかけています。
今回は、置換ルールをJSONファイルに追い出し、Wordを閉じることなく辞書を更新できる「柔軟な置換エンジン」のアーキテクチャを伝授します。マクロの記録から一歩先へ進み、堅牢な自動化の世界へ足を踏み入れましょう。
—
1. なぜ「外部JSON」で管理すべきなのか?
コードの中に置換ルールをハードコーディングすると、修正のたびにVBE(エディタ)を開いてコンパイルし直す必要があります。これは運用上、非常に危険です。
JSONで外部管理すれば:
- 非エンジニアでも修正可能: テキストエディタだけで置換ルールを更新できる。
- 保守性の向上: ロジック(VBA)とデータ(辞書)の完全分離。
- 拡張性: JSONの構造を工夫すれば、正規表現のON/OFFや、置換範囲の指定も辞書側で制御できる。
—
2. 準備するもの
VBAでJSONをパース(解析)するために、今回は最も標準的で安定した手法である「ScriptControl」を用いた手法を紹介します。
JSONの構造(dict.json)
作業フォルダに`dict.json`を作成してください。
[
{“find”: “株式会社”, “replace”: “(株)”},
{“find”: “Word”, “replace”: “Microsoft Word”}
]
—
3. 実践!置換エンジン・アーキテクチャ
以下のコードは、単に置換するだけでなく、「オブジェクトのライフサイクルを意識し、メモリを浪費しない」構成にしています。
Option Explicit
‘ 外部JSONを読み込み、Wordで一括置換するメインエンジン
Public Sub ExecuteJsonReplace()
Dim jsonPath As String
Dim jsonText As String
Dim fso As Object, ts As Object
Dim scriptCtrl As Object
Dim jsonArray As Object
Dim i As Long
‘ 1. ファイルパスの設定
jsonPath = ThisDocument.Path & “\dict.json”
‘ 2. JSONを文字列として読み込み
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set ts = fso.OpenTextFile(jsonPath, 1) ‘ 1=ForReading
jsonText = ts.ReadAll
ts.Close
‘ 3. ScriptControlでJSONをオブジェクト化
Set scriptCtrl = CreateObject(“MSScriptControl.ScriptControl”)
scriptCtrl.Language = “JScript”
‘ JSONパース用に配列を評価させる
Set jsonArray = scriptCtrl.Eval(“(” & jsonText & “)”)
‘ 4. 置換の実行(画面更新を止めて高速化)
Application.ScreenUpdating = False
For i = 0 To jsonArray.length – 1
Call PerformReplace(jsonArray.item(i).find, jsonArray.item(i).replace)
Next i
Application.ScreenUpdating = True
MsgBox “置換が完了しました!”, vbInformation
End Sub
‘ 置換の最小単位(Findオブジェクトを適切にリセットするのがコツ)
Private Sub PerformReplace(findText As String, replaceText As String)
With Selection.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = findText
.Replacement.Text = replaceText
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False ‘ 必要に応じてTrueへ
‘ 実行
.Execute Replace:=wdReplaceAll
End With
End Sub
—
4. 現場で陥りやすい罠と解決策
① `.ClearFormatting` を忘れるな
VBAの `Find` オブジェクトは、前回の検索設定を強烈に引き継ぎます。特に「太字」や「色」といった書式設定が残っていると、意図しない場所で置換が失敗します。必ず `ClearFormatting` を呼び出すのがプロの作法です。
② `Selection` の多用は避ける(中級編)
今回は分かりやすさを優先して `Selection` を使いましたが、大規模な文書では `ActiveDocument.Range` を使う方が動作が速く、画面のちらつきも抑えられます。まずは `Selection` で仕組みを作り、慣れてきたら `Range` オブジェクトを操作する設計にアップグレードしてください。
③ 文字コードの壁
JSONファイルは「UTF-8」で保存してください。VBAから読み込む際、Shift-JISだと日本語が文字化けします。もし文字化けする場合は、ADODB.Streamを使用してUTF-8として読み込む実装に切り替えるのが定石です。
—
最後に:自動化の先にあるもの
この「辞書外部化」の仕組みを作れば、あなたはもう「コードを書く人」から「業務フローを設計するエンジニア」へと進化しています。
この辞書をExcelで管理できるようにし、ボタン一つでJSONを吐き出すツールを作れば、現場のメンバーはプログラミングを知らなくても「置換辞書を更新するだけ」で業務フローを修正できるようになります。
「仕組みを自動化するのではなく、仕組み自体を更新可能にする」。
これこそが、世界最高峰の自動化への第一歩です。まずはこのコードをコピペして、あなたの手元のJSONを動かしてみてください。応援しています!
