ハードコーディングは罪である: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` を制御し、ユーザーに無駄なチラつきを見せないのがプロの流儀だ。
—
最後に:なぜ「動的」であるべきか
君たちが今作っているツールは、一年後、誰かの手に渡るかもしれない。そのとき、コードを一切いじらずに「設定ファイル」を書き換えるだけで要件を満たせるなら、君は「コードを書いた人」ではなく「システムを設計した人」になる。
技術は目的ではない。業務を止めず、柔軟に変化し続けるための「手段」だ。
この設計を基盤に、君の現場から「仕様変更のたびに深夜残業」という文化を根絶してほしい。
健闘を祈る。
