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

スポンサーリンク

Word VBAで「脱・マクロ記録」:外部設定から表を自動生成するアーキテクチャ

こんにちは。Word VBAの世界へようこそ。

多くの人が「マクロの記録」から入り、やがて「なぜかコードが動かない」「修正するたびに膨大な工数がかかる」という壁にぶつかります。それは、「レイアウト(見た目)」と「ロジック(処理)」がコードの中に密着結合しているからです。

今回は、真のエンジニアへの第一歩として、「設定ファイル(JSON)を読み込み、動的に表を生成する」というアーキテクチャを伝授します。これさえマスターすれば、もう表の修正ごときでコードを書き換える必要はありません。

—

1. なぜ「外部設定」が必要なのか?

マクロ記録で生成されるコードは、いわば「その場限りの使い捨て」です。
「列が1つ増えた」「項目名を変更したい」という度に変更を求められるたび、VBAを開いてコードを書き換えるのは非効率ですよね。

  • ロジックの分離: プログラムは「どう作るか」に集中し、データは「何を作るか」を定義する。
  • 保守性の向上: 現場の担当者がJSON(あるいはINI)を書き換えるだけで、システムが追従する。

これが、プロフェッショナルな自動化ツールの鉄則です。

—

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

今回はシンプルに、以下のようなJSONファイルを読み込み、Word上に表を生成する仕組みを作ります。

config.json の例

{
“headers”: [“ID”, “項目名”, “ステータス”, “担当者”],
“columnWidths”: [20, 60, 30, 40]
}

この設定を読み込み、Wordの `Tables.Add` メソッドに流し込むのが今回のゴールです。

—

3. 実装コード:魂を込めたVBA

まずは標準モジュールに以下のコードを貼り付けてみてください。VBAでJSONを扱うには `ScriptControl` を使うのが最も軽量でスマートです。

‘ 必要な参照設定: Microsoft Script Control 1.0 (またはLate Bindingで実装)
Sub GenerateTableFromConfig()
Dim jsonPath As String
Dim jsonText As String
Dim scriptObj As Object
Dim config As Object

‘ 1. 設定ファイルの読み込み
jsonPath = ThisDocument.Path & “\config.json”
jsonText = ReadFile(jsonPath)

‘ 2. JSONパース (ScriptControlを使用)
Set scriptObj = CreateObject(“ScriptControl”)
scriptObj.Language = “JScript”
Set config = scriptObj.Eval(“(” & jsonText & “)”)

‘ 3. Wordテーブルの動的生成
Dim tbl As Table
Dim colCount As Integer
colCount = config.headers.length

‘ カーソル位置にテーブルを作成
Set tbl = Selection.Tables.Add(Range:=Selection.Range, _
NumRows:=2, _
NumColumns:=colCount)

‘ 4. ヘッダーの流し込みとレイアウト調整
Dim i As Integer
For i = 0 To colCount – 1
tbl.Cell(1, i + 1).Range.Text = config.headers(i)
tbl.Columns(i + 1).Width = CentimetersToPoints(config.columnWidths(i) / 10)
Next i

‘ 5. スタイルの適用(プロのこだわり)
tbl.ApplyStyleHeadingRows = True
tbl.Style = “表 (格子)”

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

‘ ファイルを読み込むためのヘルパー関数
Function ReadFile(filePath As String) As String
Dim fso As Object, ts As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set ts = fso.OpenTextFile(filePath, 1)
ReadFile = ts.ReadAll
ts.Close
End Function

—

4. 陥りやすい罠と対策

① 「参照設定」の壁

`ScriptControl` が見つからない場合は、VBAエディタの「ツール」→「参照設定」から追加するか、あるいは `Late Binding`(上のコードのように `CreateObject` で生成する手法)を使ってください。現場のPC環境に依存しないためには、後者が圧倒的に有利です。

② テーブルの「範囲(Range)」の把握

初心者の方が最も苦労するのは `Selection` オブジェクトです。
プロは `Selection` ではなく `Range` オブジェクトを操作します。`Selection` はユーザーのカーソル位置に依存するため不安定ですが、`Range` を使えば「文書の末尾」や「特定のブックマーク位置」へ正確に表を挿入できます。

③ 文字化けとエンコーディング

JSONファイルは必ず UTF-8 (BOMなし) で保存してください。VBAの `Scripting.FileSystemObject` はデフォルトではShift-JISを想定するため、日本語が含まれる場合はADODB.Streamで読み込むなど、もう一段階の深掘りが必要になります。

—

最後に:エンジニアとしてのマインドセット

今回学んだのは「コードを書くこと」ではなく、「変更を許容する設計を作ること」です。

表の項目が変わるたびに「明日までに修正して!」と言われても、もう焦る必要はありません。設定ファイルを書き換えるだけで、あなたのツールは即座に新しい要件に適応します。

この感覚を掴めれば、あなたはもう「マクロ記録を追いかける人」ではありません。「Wordという巨大なコンポーネントを操るアーキテクト」です。次の一歩として、次はJSONから複雑なセル結合(Merge)を行う処理に挑戦してみてください。

質問があればいつでもどうぞ。あなたのコードが、現場の空気を変えることを期待しています。

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