【入門編】【上級者向け】Wordの表をJSON形式に変換し、Web API経由でSQL Serverへ直接保存する連携術 – Word VBA解析バイブル

スポンサーリンク

こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して「動いた!」と感動したのも束の間、「これを実務のシステム連携に使いたい」「Wordの表データをきれいなデータとしてデータベースに放り込みたい」と思ったとき、多くの人が壁にぶつかりますよね。

今回は、そんな「マクロの記録」を卒業し、Wordを単なるワープロソフトから『最強のデータ入力・連携クライアント』へと昇華させる上級テクニックをお伝えします。

テーマは「Wordの表をJSONに変換し、Web API経由でSQL Serverへ直接保存する連携術」です。

「Wordから直接データベースに繋ぐなんてできるの?」と思うかもしれませんが、答えはYESです。ここをクリアすれば、あなたのVBAスキルは間違いなくプロの領域に到達します。優しく、そして本質的なところまでしっかりと解説していきますので、リラックスしてついてきてくださいね!

—

1. なぜWordの表とWeb APIを連携させるのか?

実務の現場では、こんな要望がよくあります。

  • 「営業マンがWordの報告書(表形式)に記入したら、自動で会社のデータベース(SQL Server)に蓄積してほしい」
  • 「Excelだとレイアウトが崩れて見栄えが悪くなるからWordを使いたいが、データ集計はデータベース側で行いたい」

通常、Wordの表データを扱うのは結構面倒です。しかし、「Wordの表を走査してJSONという共通言語に翻訳し、HTTP通信でWeb APIに投げつける」というパイプラインを作ってしまえば、Wordは一瞬にして「スマートな入力インターフェース」に生まれ変わります。

全体のデータ流れのイメージはこうです:

[Wordの表 (Table)]
↓ (VBAでセルを走査)
[JSON文字列の構築]
↓ (MSXML2.ServerXMLHTTP6.0)
[Web API (C# / Node.js など)]
↓ (ADO / Entity Framework)
[SQL Server (データベース)]

それでは、具体的なコードと設計の極意を見ていきましょう!

—

2. 実装の全体像:VBAマクロコード

まずは、Wordのドキュメント内にある最初の表を読み込み、JSONに変換して、指定したWeb APIエンドポイントへ`POST`送信する実践的なVBAコードです。

VBAの標準モジュールに、以下のコードを貼り付けてみてください。

Option Explicit

‘ ==============================================================================
‘ 【上級者向け】Word表データ -> JSON変換 & Web API送信マクロ
‘ 前提条件: 参照設定に「Microsoft Scripting Runtime」を追加してください(任意ですがDictionary用)
‘ ==============================================================================
Sub ExportTableToJsonAndSend()
Dim doc As Document
Set doc = ActiveDocument

‘ 1. ドキュメント内に表が存在するかチェック
If doc.Tables.Count = 0 Then
MsgBox “ドキュメント内に表が見つかりません。”, vbExclamation, “エラー”
Exit Sub
End If

‘ 対象は文書内の最初の表とする
Dim targetTable As Table
Set targetTable = doc.Tables(1)

‘ 2. 表データをJSON文字列にシリアライズ(変換)
Dim jsonString As String
jsonString = ConvertTableToJson(targetTable)

If jsonString = “” Then
MsgBox “有効な表データが取得できませんでした。”, vbExclamation, “エラー”
Exit Sub
End If

‘ デバッグ用:イミディエイトウィンドウにJSONを出力
Debug.Print jsonString

‘ 3. Web APIへ非同期/同期通信で送信
Dim apiURL As String
apiURL = “https://your-web-api-server.com/api/reports/save” ‘ ←実際のAPIエンドポイントに変更してください

Call SendJsonToApi(apiURL, jsonString)

End Sub

‘ ——————————————————————————
‘ 補助関数: Wordの表オブジェクトをJSON配列形式の文字列に変換する
‘ ——————————————————————————
Function ConvertTableToJson(tbl As Table) As String
Dim r As Long, c As Long
Dim rowCount As Long, colCount As Long
rowCount = tbl.Rows.Count
colCount = tbl.Columns.Count

‘ ヘッダー行(1行目)をキー名として取得すると仮定
If rowCount < 2 Then ConvertTableToJson = "" Exit Function End If Dim headers() As String ReDim headers(1 To colCount) For c = 1 To colCount ' セルの末尾にある改行コード(CR)やセル ターミネータを置換・除去 headers(c) = CleanCellText(tbl.Cell(1, c).Range.Text) Next c Dim jsonRows As String jsonRows = "" ' 2行目(データ行)からループ For r = 2 To rowCount Dim jsonCols As String jsonCols = "" For c = 1 To colCount Dim cellValue As String cellValue = CleanCellText(tbl.Cell(r, c).Range.Text) ' JSONのキーと値のペアを作成(エスケープ処理は簡易版) Dim colPair As String colPair = """" & headers(c) & """: """ & EscapeJson(cellValue) & """" If c = 1 Then jsonCols = colPair Else jsonCols = jsonCols & ", " & colPair End If Next c ' 行オブジェクトの構築 Dim rowObj As String rowObj = "{" & jsonCols & "}" If r = 2 Then jsonRows = rowObj Else jsonRows = jsonRows & ", " & rowObj End If Next r ' 全体をJSON配列として包む ConvertTableToJson = "[" & jsonRows & "]" End Function ' ------------------------------------------------------------------------------ ' 補助関数: セル内の余分な制御文字(セルマークなど)を除去 ' ------------------------------------------------------------------------------ Function CleanCellText(ByVal rawText As String) As String ' Wordのセルテキストの末尾には必ず Chr(13) & Chr(7) が含まれるため削除 rawText = Replace(rawText, Chr(13) & Chr(7), "") rawText = Replace(rawText, Chr(13), "") rawText = Replace(rawText, Chr(7), "") ' 前後の空白をトリム CleanCellText = Trim(rawText) End Function ' ------------------------------------------------------------------------------ ' 補助関数: JSON用の特殊文字エスケープ ' ------------------------------------------------------------------------------ Function EscapeJson(ByVal val As String) As String val = Replace(val, "\", "\\") val = Replace(val, """", "\""") val = Replace(val, vbCrLf, "\n") val = Replace(val, vbCr, "\n") val = Replace(val, vbLf, "\n") EscapeJson = val End Function ' ------------------------------------------------------------------------------ ' 通信処理: MSXML2.ServerXMLHTTPを使ってAPIへPOST送信 ' ------------------------------------------------------------------------------ Sub SendJsonToApi(url As String, json As String) Dim http As Object Set http = CreateObject("MSXML2.ServerXMLHTTP.6.0") On Error GoTo ErrorHandler ' 接続タイムアウト設定など(接続, 送信, 受信のタイムアウトをミリ秒で指定可) ' http.setTimeouts 5000, 5000, 5000, 10000 http.Open "POST", url, False ' 第3引数 False = 同期通信 http.setRequestHeader "Content-Type", "application/json; charset=utf-8" http.setRequestHeader "Accept", "application/json" ' 送信実行 http.send json ' レスポンス確認 If http.Status = 200 Or http.Status = 201 Then MsgBox "データベースへの保存が成功しました!", vbInformation, "通信成功" Debug.Print "Response: " & http.responseText Else MsgBox "APIエラーが発生しました。" & vbCrLf & _ "ステータス: " & http.Status & vbCrLf & _ "詳細: " & http.responseText, vbCritical, "通信エラー" End If Exit Sub ErrorHandler: MsgBox "通信中に致命的なエラーが発生しました: " & Err.Description, vbCritical, "システムエラー" End Sub ---

3. コードのキモと知っておくべき極意

このコードには、Word VBAの実務で必ず直面する「罠」を回避するための知見が詰め込まれています。特に重要なポイントを解説します。

① Word特有の「セル末尾のゴミ文字」トラップ

Wordの表から `tbl.Cell(r, c).Range.Text` でテキストを取得すると、必ず末尾に `Chr(13) & Chr(7)`(段落記号とセル区切り記号)が混入します。
これをそのままJSONに含めると、データベース側でパースエラーを起こしたり、意図しない改行が含まれたりします。`CleanCellText`関数でこれを綺麗にこそぎ落とすのが、プロの技です。

② 外部ライブラリに依存しない堅牢性

今回はあえて `Scripting.Dictionary` や外部のJSONパースライブラリ(VBA-JSONなど)を必須とせず、純粋な文字列結合でJSONを組み立てています。
これにより、「新しいPCでマクロを動かすときに参照設定のミッシングでエラーが出る」という現場特有のトラブルを完全になくし、どこでも動く高い堅牢性を実現しています。

③ `MSXML2.ServerXMLHTTP.6.0` の選択

Excel VBAなどでよく見かける `MSXML2.XMLHTTP` ではなく、`ServerXMLHTTP.6.0` をあえて使用しています。
これは、サーバーサイドや高度な通信においてスレッドセーフであり、セキュリティやタイムアウトの制御がより厳密に行えるためです。実務でWeb APIを叩くならこちらを選ぶのが王道です。

—

4. 受け皿となるWeb API(SQL Server保存)側のイメージ

VBAから飛んできたJSONを受け取る側(サーバーサイド)は、C# (.NET Core) や Node.js など、どんな言語でも構いません。
C#(ASP.NET Core Web API)であれば、以下のようなコードで簡単に受け取ってSQL Serverへ保存できます。

[HttpPost(“save”)]
public async Task SaveReport([FromBody] List reports)
{
foreach (var report in reports)
{
// Entity Framework または Dapper を使って SQL Server へインサート
_context.Reports.Add(report);
}
await _context.SaveChangesAsync();

return Ok(new { status = “success”, message = “Saved to SQL Server successfully.” });
}

Wordの表の1行1行が、データベースの1レコードとして美しく格納されていく……。想像するだけでワクワクしませんか?

—

5. よくあるエラーと脱却のヒント

  • Q. 「プログラミング クリップボード エラー」や「名前が定義されていません」と言われます。
  • A. 宣言抜けや、コードの貼り付けミスがないか確認してください。特に `Option Explicit` を入れているため、変数の型定義(Dim)漏れがあると怒られます。これはバグを早期発見するためのエンジニアの必須作法です。
  • Q. API通信で「400 Bad Request」が返ってきます。
  • A. イミディエイトウィンドウ(`Ctrl + G`)に出力された `jsonString` をコピーし、[JSONLint](https://jsonlint.com/) などのバリデーターに貼り付けて、JSONの構文(ダブルクォーテーションの抜けなど)が正しいか確認してください。

—

まとめ:ここをクリアすれば、Word VBAは敵なし!

今回は、Wordの表をJSON化し、Web APIを経由してSQL Serverに保存するという、一歩進んだシステム連携の技術を解説しました。

「たかがWord、されどWord」。
Wordを単なる文書作成ツールではなく、『フロントエンドの入力端末』として捉えられるようになると、業務自動化のアイデアは無限に広がります。

ここをクリアしたあなたなら、もはや「マクロの記録」に頼る必要はありません。ぜひ自分の開発環境で試して、業務システムとシームレスに連携する快感を味わってみてくださいね!

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