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)を行う処理に挑戦してみてください。
質問があればいつでもどうぞ。あなたのコードが、現場の空気を変えることを期待しています。
