【入門編】【上級者向け】Word VBAと外部JSONファイルを連携した「置換辞書」の構築 – Word VBA解析バイブル

スポンサーリンク

【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を動かしてみてください。応援しています!

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