【実務・中級編】【上級者向け】Word表のデータをJSON形式に変換して外部APIへ送信する連携術 – Word VBA解析バイブル

スポンサーリンク

Word VBAを「ただの文書作成ツール」で終わらせるな:表データをJSON化し、APIへ直結する極限の自動化術

Word VBAを単なる「定型文書作成のためのツール」だと思っているなら、それは大きな勘違いだ。Wordの表(Table)は、適切に構造化すれば、極めて強力な「GUI付きデータ入力インターフェース」に化ける。

本記事では、Wordの表からデータを抽出し、JSONにシリアライズした上で、REST API経由で外部システムへ叩き込むための「プロダクション級」の設計思想を伝授する。

—

1. なぜ「手当たり次第の操作」が地獄を招くのか

多くの初心者が陥る罠は、`Selection`オブジェクトを乱用し、カーソルを移動させながらセルを取得する方法だ。これは遅いだけでなく、ユーザーが誤って別箇所をクリックした瞬間に爆発する、極めて脆弱なコードだ。

プロの鉄則:

  • RangeとTableオブジェクトを直に操作せよ: `Selection`は画面描画を伴うため重い。メモリ上でオブジェクトを完結させろ。
  • 構造化の責務を分離せよ: 「Wordの表から読み取る処理」と「JSON形式に変換する処理」を混ぜるな。単一責任の原則をVBAでも貫く。
  • パースの堅牢性: セルの結合や空行は「例外」ではない。「仕様」としてガード節を設けろ。

—

2. 実践:Word表のJSON変換アーキテクチャ

以下のコードは、Wordの表を解析し、JSON文字列を構築して、`MSXML2.XMLHTTP`を用いてAPIへ送信する一連のフローだ。

プロダクションコード例

Option Explicit

‘ 依存関係: Microsoft XML, v6.0 を参照設定すること
‘ 目的: 表データをJSON化し、REST APIへPOSTする

Public Sub ExportTableToApi()
Dim tbl As Table
Dim jsonPayload As String

‘ 1. 表の存在確認(アクティブな文書の最初の表を対象)
If ActiveDocument.Tables.Count = 0 Then Exit Sub
Set tbl = ActiveDocument.Tables(1)

‘ 2. JSON生成(データ抽出層)
jsonPayload = SerializeTableToJson(tbl)

‘ 3. API通信(送信層)
Call SendToApi(“https://api.example.com/v1/data”, jsonPayload)
End Sub

Private Function SerializeTableToJson(tbl As Table) As String
Dim i As Long, j As Long
Dim rowData As String
Dim jsonArray As String

‘ ヘッダー行をスキップしてデータのみ抽出
For i = 2 To tbl.Rows.Count
rowData = “{ ” & _
“””id””: “”” & CleanCell(tbl.Cell(i, 1).Range.Text) & “””, ” & _
“””value””: “”” & CleanCell(tbl.Cell(i, 2).Range.Text) & “”” ” & _
“}”

jsonArray = jsonArray & IIf(jsonArray = “”, “”, “, “) & rowData
Next i

SerializeTableToJson = “[” & jsonArray & “]”
End Function

‘ Word特有の終了コード(Chr(13) & Chr(7))を除去する重要関数
Private Function CleanCell(ByVal txt As String) As String
CleanCell = Replace(Replace(txt, vbCr, “”), vbBell, “”)
End Function

Private Sub SendToApi(url As String, payload As String)
Dim http As Object
Set http = CreateObject(“MSXML2.XMLHTTP”)

With http
.Open “POST”, url, False
.setRequestHeader “Content-Type”, “application/json”
.send payload

If .Status = 200 Then
MsgBox “送信成功”, vbInformation
Else
MsgBox “エラー発生: ” & .StatusText, vbCritical
End If
End With
End Sub

—

3. 保守性を高めるための設計上のアドバイス

セル結合への対応

Wordの表で厄介なのが、`Merge`されたセルだ。`tbl.Cell(i, j)`で指定すると、結合されたセルに対してインデックスがずれる現象が発生する。これを解決するには、`Row.Cells.Count`を確認し、データ構造が崩れていないか検証するバリデーションロジックを噛ませるのが、大規模開発における常識だ。

エラーハンドリングの重要性

APIとの通信は「必ず失敗する」と仮定せよ。

  • 通信タイムアウトの設定: `MSXML2.ServerXMLHTTP`を使用し、`setTimeouts`で秒数を明示する。
  • ログ出力: 送信したJSONが期待通りか、一度テキストファイルに書き出すデバッグモードを実装しておくと、現場でのトラブルシュートが劇的に早くなる。

セキュリティの境界

もしAPIへ送信するデータに機密情報が含まれる場合、VBAコード内に認証トークンを直書きしてはならない。環境変数から読み込むか、Wordの「カスタムXMLパーツ」に暗号化して保存する設計を検討すべきだ。

—

最後に:なぜ「今」このスキルが必要なのか

DXという言葉が踊る現在、Wordを「印刷してハンコを押すための道具」として使うのはあまりにも勿体ない。Wordの表は、Excelよりも直感的で、かつユーザーの入力制約をかけやすい。

この仕組みを構築できれば、現場のユーザーは「Wordに入力するだけ」で、バックエンドのデータベースに自動的にデータが格納されるシステムを構築できる。「使い慣れた道具」の裏側を掌握することこそ、真の自動化エンジニアの嗜みだ。

さあ、あなたの次のプロジェクトで、このコードを武器に現場のワークフローを破壊的イノベーションへ導いてほしい。

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