【実務・中級編】【上級者向け】表のレイアウトを外部設定ファイル(INI/JSON)から読み込み、動的生成する – Word VBA解析バイブル

スポンサーリンク

ハードコーディングは罪である:JSON設定によるWord表の動的生成アーキテクチャ

現場でよく見る「仕様変更のたびに数千行のVBAを書き直す」という悪夢。これを終わらせるのが、プロのエンジニアの仕事だ。

今日は、Wordの表(Table)生成を「コード」から切り離し、外部設定ファイル(JSON)に委譲するアーキテクチャを伝授する。これができれば、君の作成したツールは「使い捨てのスクリプト」から、メンテナンスコストを最小化した「業務基盤」へと進化する。

—

1. なぜ「ハードコーディング」が敗北を招くのか

多くの初心者は、表の行数や項目を `Table.Cell(1, 1).Range.Text = “項目名”` のように直書きする。しかし、以下の理由からこれは「負債」でしかない。

1. 仕様変更への脆弱性: 顧客から「列を一つ増やして」と言われた瞬間、オフセット計算が崩壊し、デバッグの迷宮に迷い込む。
2. 型安全性の欠如: セル指定のインデックス(Row, Column)は1始まりであり、配列(0始まり)との混同がバグの温床となる。
3. 可読性の崩壊: 複雑なレイアウトになればなるほど、コードはスパゲッティ化し、誰も触れなくなる。

我々が目指すべきは、「レイアウト定義(JSON)」と「描画エンジン(VBA)」の完全分離だ。

—

2. アーキテクチャの設計思想

今回実装するのは、以下の3層構造だ。

  • データ層: 外部JSONファイル(列の定義、幅、結合ルールを記述)。
  • 制御層: VBAでJSONを解析(`ScriptControl` または `VBA-JSON` ライブラリを使用)。
  • 描画層: `Word.Table` オブジェクトを操作し、設定に従って動的に描画。

※VBAでJSONを扱うなら、GitHubの[VBA-JSON](https://github.com/VBA-tools/VBA-JSON)を導入するのが世界標準だ。標準モジュールにインポートするだけで準備は完了する。

—

3. 実装コード:動的表生成エンジン

以下のコードは、JSONから読み取った定義に基づき、Wordドキュメントのカーソル位置に表を生成するプロダクションコードの精髄である。

‘ 必要なライブラリ: VBA-JSON
‘ 動作要件: Microsoft Scripting Runtime 参照設定が必要

Public Sub GenerateTableFromJSON(jsonPath As String)
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim jsonText As String
Dim jsonDict As Object

‘ 1. JSON読み込み
jsonText = fso.OpenTextFile(jsonPath, 1).ReadAll
Set jsonDict = JsonConverter.ParseJson(jsonText)

‘ 2. 表の初期化
Dim targetDoc As Document: Set targetDoc = ActiveDocument
Dim tbl As Table
Set tbl = targetDoc.Tables.Add(Selection.Range, jsonDict(“rows”), jsonDict(“cols”))

‘ 3. スタイル適用と描画(この抽象化が重要)
Dim colIndex As Integer
For colIndex = 1 To jsonDict(“cols”)
Dim colDef As Object
Set colDef = jsonDict(“columns”)(colIndex)

‘ 列幅の設定
tbl.Columns(colIndex).Width = CentimetersToPoints(colDef(“width”))
‘ ヘッダーの流し込み
tbl.Cell(1, colIndex).Range.Text = colDef(“header”)
Next colIndex

‘ 4. 境界線の微調整(パフォーマンスを考慮し自動調整をオフ)
tbl.AutoFormat wdTableFormatGrid1

MsgBox “表の生成が完了しました。”, vbInformation
End Sub

JSON設定ファイルの例(config.json)

{
“rows”: 5,
“cols”: 3,
“columns”: [
{“header”: “ID”, “width”: 2},
{“header”: “項目名”, “width”: 8},
{“header”: “備考”, “width”: 5}
]
}

—

4. 伝説のエンジニアとしてのアドバイス

このコードを実戦投入する際、必ず守るべき「3つの鉄則」がある。

① `Selection` オブジェクトを排除せよ

VBAの初心者は `Selection` を多用するが、これは処理が遅く、ユーザーが操作するとカーソルが飛んでエラーになる。可能な限り `Range` オブジェクトを直接指定し、処理対象をメモリ内で完結させろ。

② エラーハンドリングは「境界」で行う

ファイルが存在しない、JSONの構造が不正であるといったケースを想定し、必ず `On Error GoTo` でエラーをトラップすること。特に、表の列数とデータ数が一致しない場合の例外処理は、ツール全体の堅牢性を左右する。

③ 描画の負荷を意識せよ

`ScreenUpdating = False` はVBAの基本だが、Wordの表操作においては特に有効だ。描画処理の前後で必ず `Application.ScreenUpdating` を制御し、ユーザーに無駄なチラつきを見せないのがプロの流儀だ。

—

最後に:なぜ「動的」であるべきか

君たちが今作っているツールは、一年後、誰かの手に渡るかもしれない。そのとき、コードを一切いじらずに「設定ファイル」を書き換えるだけで要件を満たせるなら、君は「コードを書いた人」ではなく「システムを設計した人」になる。

技術は目的ではない。業務を止めず、柔軟に変化し続けるための「手段」だ。
この設計を基盤に、君の現場から「仕様変更のたびに深夜残業」という文化を根絶してほしい。

健闘を祈る。

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