【実務・中級編】【上級者向け】Wordの「段落」の書式設定をJSONファイルから読み込み、動的に適用する汎用エンジン – Word VBA解析バイブル

スポンサーリンク

Word VBAを「脱・ハードコーディング」せよ:JSON駆動型・書式適用エンジンの設計

Word VBAでドキュメント生成を自動化する際、多くの開発者が陥る罠がある。それは「書式設定をコードの中にベタ書きすること」だ。

`Paragraph.Format.LineSpacing = 18` といったコードを何百行も書いた瞬間、そのマクロは保守不可能な「技術的負債」へと変貌する。要件変更のたびにコンパイルを行うのは、エンジニアの仕事ではない。

今回は、書式定義を外部JSONに追い出し、Wordの段落オブジェクトを自在に制御する「JSON駆動型・書式適用エンジン」の設計思想と実装を伝授する。

1. なぜ「JSON駆動」が必要なのか

Wordの書式は複雑だ。段落(Paragraph)、フォント(Font)、スタイル(Style)が階層的に絡み合い、一度設定が壊れるとドキュメント全体が崩壊する。

JSON化するメリット:

  • 疎結合性: デザイナーや業務担当者がWordの知識なしにJSONを編集できる。
  • 再利用性: 複数のドキュメントテンプレートで同じ書式ルールを共有できる。
  • 堅牢性: ロジック(VBA)とデータ(書式定義)を分離することで、デバッグが劇的に容易になる。

2. アーキテクチャの核心:ScriptControlの活用

VBAには標準でJSONパーサーが存在しない。そのため、外部ライブラリ(VBA-JSON等)を使う手もあるが、環境配布の手間を嫌うなら、Windows標準の `ScriptControl` を用いるのが最もエレガントだ。

実装コード:汎用書式適用エンジン

以下のコードは、JSONのキーとWordの `Paragraph.Format` プロパティをマッピングし、動的に適用する核心部分だ。

‘ 必要なライブラリ: Microsoft Script Control 1.0
Public Sub ApplyStylesFromJson(targetPara As Paragraph, jsonString As String)
Dim sc As Object
Set sc = CreateObject(“ScriptControl”)
sc.Language = “JScript”

‘ JSONをオブジェクト化
Dim json As Object
Set json = sc.Eval(“(” & jsonString & “)”)

‘ エラーハンドリング:プロパティの存在チェックを厳密に行う
On Error Resume Next
With targetPara.Format
If Not IsNull(json.lineSpacing) Then .LineSpacing = json.lineSpacing
If Not IsNull(json.alignment) Then .Alignment = json.alignment
If Not IsNull(json.spaceBefore) Then .SpaceBefore = json.spaceBefore
If Not IsNull(json.spaceAfter) Then .SpaceAfter = json.spaceAfter
End With

With targetPara.Range.Font
If Not IsNull(json.fontSize) Then .Size = json.fontSize
If Not IsNull(json.fontName) Then .Name = json.fontName
End With
On Error GoTo 0
End Sub

3. 実務で「壊れない」ための重要設計指針

① オブジェクトのライフサイクルを制御せよ

Wordの `Range` や `Paragraph` オブジェクトは、頻繁にアクセスするとメモリリークやメモリ不足を招く。ループ処理内で `Paragraph` を扱う際は、必ず `With` ステートメントでスコープを限定し、明示的な解放を意識すること。

② 外部リソースの非同期リスク

JSONファイルを読み込む際は、ファイルロックに注意が必要だ。

  • 読み込み時: `ADODB.Stream` を使用してUTF-8で安全に読み込むこと。
  • キャッシュ戦略: 毎回ファイルI/Oを行うと遅い。初回実行時にメモリ上の `Collection` オブジェクトに辞書として保持させるのが、プロフェッショナルの実装だ。

③ 「スタイル」vs「直接書式」の境界線

Wordのベストプラクティスは「スタイル」の利用である。このエンジンを真に活用するなら、JSONには直接書式を羅列するのではなく、「適用すべきスタイル名」を記述し、VBA側で `Paragraph.Style = “スタイル名”` を呼び出す設計にすべきだ。

4. 次の一手:JSONの構造化例

以下のようなJSONを用意すれば、ドキュメントの「見出し」「本文」「注釈」のルールを分離管理できる。

{
“heading1”: {
“fontSize”: 16,
“spaceBefore”: 12,
“spaceAfter”: 6
},
“body”: {
“fontSize”: 10.5,
“lineSpacing”: 18
}
}

最後に:エンジニアとしての矜持

VBAは「古臭い言語」と揶揄されることがある。しかし、適切に設計されたVBAエンジンは、現代のどのフレームワークよりも「ユーザーのデスクサイド」で直接的に業務を救う力を持っている。

「書式が変わるたびにコードを書き換える」のは、もう終わりにしよう。
JSONを読み込み、動的にWordを操る。このアーキテクチャが、あなたの自動化ツールを「使い捨てのスクリプト」から「堅牢なソフトウェア」へと昇華させるはずだ。

次は、このエンジンに「バリデーションロジック」を組み込み、無効な書式設定が渡された際にログを吐き出す仕組みを作ってみてほしい。その時、あなたは真のWord自動化エンジニアになる。

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