こんにちは!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
{
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を単なる文書作成ツールではなく、『フロントエンドの入力端末』として捉えられるようになると、業務自動化のアイデアは無限に広がります。
ここをクリアしたあなたなら、もはや「マクロの記録」に頼る必要はありません。ぜひ自分の開発環境で試して、業務システムとシームレスに連携する快感を味わってみてくださいね!
