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

スポンサーリンク

Word VBAの限界を突破せよ:JSON駆動型「置換エンジン」の設計思想

Word VBAで「置換機能」を実装する際、多くの初学者が陥る罠がある。それは、置換ルールをコード内にハードコーディングしたり、Excelシートを毎回読み込ませたりする非効率な実装だ。

いいか、大規模なドキュメント処理において、「ロジック」と「データ」の分離はエンジニアリングの鉄則だ。今回は、外部JSONファイルを辞書として読み込み、Wordを再起動することなく置換ルールを即時反映させる「堅牢な置換アーキテクチャ」を伝授する。

なぜJSONなのか?:疎結合がもたらす保守性

なぜCSVやExcelではなくJSONなのか。理由は明確だ。
1. 構造化データとの親和性: 階層構造が直感的であり、将来的に「置換ルール」だけでなく「書式設定」まで辞書に含める拡張が可能だからだ。
2. オーバーヘッドの抑制: Excelオブジェクトを介在させるのはWordにとって重すぎる。ファイルシステムへの直接アクセスは、大規模運用においてボトルネックを排除する。

実装の要:JSON解析とRangeオブジェクトの最適化

VBAには標準のJSONパーサーがない。ここで「あえて外部ライブラリを使わず、ScriptControlで完結させる」という手法も取れるが、今回はモダンな開発環境を前提に、ScriptControl(Microsoft Script Control 1.0)を用いた軽量な実装を紹介する。

プロダクションコード:JSON駆動置換エンジン

このコードは、ドキュメントの末尾まで一度の走査で置換を完了させるよう設計されている。

‘ 必要な参照設定: Microsoft Script Control 1.0
‘ 辞書ファイル(dict.json)の構造: {“旧語”: “新語”, “Word”: “Microsoft Word”}

Public Sub ExecuteJsonReplace()
Dim jsonStr As String
Dim sc As Object
Dim jsonDict As Object
Dim key As Variant
Dim rng As Range

‘ 1. JSONファイルの読み込み(高速なADODB.Streamを使用)
jsonStr = LoadFile(“C:\path\to\dict.json”)

‘ 2. JSON解析エンジンを初期化
Set sc = CreateObject(“ScriptControl”)
sc.Language = “JScript”
Set jsonDict = sc.Eval(“(” + jsonStr + “)”)

‘ 3. 置換処理の高速化(画面更新を停止)
Application.ScreenUpdating = False

‘ 4. 全置換の実行
For Each key In GetJsonKeys(sc, jsonDict)
Set rng = ActiveDocument.Content
With rng.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = CStr(key)
.Replacement.Text = CStr(sc.Eval(“jsonDict.” & key))
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = True ‘ 必要に応じて調整
.MatchWholeWord = False
.Execute Replace:=wdReplaceAll
End With
Next

Application.ScreenUpdating = True
MsgBox “置換完了”, vbInformation
End Sub

‘ ファイル読み込みの最適化
Private Function LoadFile(path As String) As String
Dim stream As Object
Set stream = CreateObject(“ADODB.Stream”)
stream.Open
stream.Charset = “UTF-8”
stream.LoadFromFile path
LoadFile = stream.ReadText
stream.Close
End Function

‘ JSONキー取得のヘルパー
Private Function GetJsonKeys(sc As Object, dict As Object) As Collection
Dim keys As New Collection
sc.AddObject “dict”, dict
sc.ExecuteStatement “var keys = Object.keys(dict);”
‘ 中略: スクリプト側でキーを抽出してVBAに返す処理
End Function

運用上のクリティカルな注意点

1. `Find.Execute` の罠を回避せよ

Word VBAの `Find` オブジェクトは、一度実行すると「検索条件」がオブジェクト内にキャッシュされる。ループ内で置換を行う際は、必ず `.ClearFormatting` を実行し、状態をリセットすること。これを怠ると、前回の検索条件が残留し、予期せぬ置換ミスを誘発する。

2. 巨大なJSONのパース

もし辞書が数千件を超える場合は、JSON解析のオーバーヘッドが無視できなくなる。その場合は、JSONをパースするのではなく、`FileSystemObject` でテキストを読み込み、正規表現(`VBScript.RegExp`)を併用して置換ロジックを自作する方が、メモリ効率の面で遥かに優れている。

3. ファイルロックへの配慮

JSONを外部管理にすると、編集中に他のプロセスがファイルを掴んでいる可能性がある。読み込み時には必ずエラーハンドリングを実装し、ファイルがロックされている場合はユーザーに「ファイルを閉じてから実行してください」と通知するフローを組み込むこと。これがプロの作るツールの「品格」だ。

最後に:自動化の真髄

業務自動化の目的は、単にキーボード入力を減らすことではない。「ルールの変更に即座に追従できるシステム」を作り上げることこそが、エンジニアとしての価値だ。

JSON辞書を更新するだけで、Word側のコードを一行も変えずに挙動が変わる。この疎結合な設計こそが、明日からのあなたのメンテナンスコストを激減させるはずだ。

次は「正規表現による高度なパターン置換」について深掘りする。準備はいいか。

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