マクロ記録のその先へ。Word表データをJSON化し、Web API経由でデータベースへ届ける「真の自動化」への招待
こんにちは。今日まで「マクロの記録」機能を使って、なんとか業務を回してきた皆さん。素晴らしい一歩を踏み出しましたね。でも、ふとした瞬間にこう思ったことはありませんか?
「この表のデータを、もっとスマートに別のシステムへ送れたらいいのに」
「Excelにコピペして、そこからまた別の作業をするなんて、二度手間じゃないか?」
もしあなたがそう感じているなら、あなたはすでに「自動化エンジニア」への入り口に立っています。
今日は、単なる「Wordの操作」を卒業し、Wordを「高度なデータ入力インターフェース」へと進化させる、プロフェッショナルな手法を伝授します。テーマは、Wordの表データをJSON形式に変換し、Web APIを通じてSQL Serverなどのデータベースへ安全に送信する技術です。
少し難しく感じるかもしれませんが、大丈夫。一歩ずつ、丁寧に紐解いていきましょう。ここをクリアすれば、あなたのVBAスキルは劇的に進化しますよ。
1. なぜ「直接SQLに接続」してはいけないのか?
まず、設計の思想(アーキテクチャ)についてお話しします。
「VBAから直接SQL Serverに接続(ADODBなどを使用)すればいいじゃないか」と思うかもしれません。確かにそれは可能です。しかし、プロの現場では「Wordから直接データベースを叩く」ことは推奨されません。
理由は主に3つあります。
1. セキュリティのリスク: Wordファイルの中にデータベースの接続パスワードを書き込むのは、鍵を玄関に刺したまま外出するようなものです。
2. ネットワークの壁: 社内ネットワークの構成によっては、クライアントPCから直接データベースへアクセスすることが禁止されている場合が多いです。
3. データの整合性: Wordから直接書き込むと、データ形式のチェックが甘くなり、データベースが壊れる原因になります。
そこで登場するのが「Web API」です。
Wordは「JSONという綺麗なデータ形式」に変換してAPIに投げます。APIが「データの検品」を行い、安全にデータベースへ格納する。この「役割分担」こそが、堅牢なシステムを作る極意なのです。
2. ステップ1:Wordの表からデータを抽出する
まずは基本。Wordの表(Tableオブジェクト)から、中身を読み取るところから始めましょう。
ここで重要なのは、「セルの値をただ取るのではなく、構造を理解してループさせる」ことです。
💡 ここがエンジニアの視点
Wordのセルには、末尾に必ず「改行コード(制御文字)」が含まれています。これを知らずに取得すると、データが汚れてしまいます。必ず `.Text` プロパティを使い、必要に応じてトリミングを行いましょう。
' 表のデータを配列に格納するイメージのコード
Sub ExtractTableData()
Dim tbl As Table
Dim r As Integer, c As Integer
Dim rowData As String
' 文書内の最初の表を対象にする
Set tbl = ActiveDocument.Tables(1)
' 行のループ
For r = 1 To tbl.Rows.Count
' 列のループ
For c = 1 To tbl.Columns.Count
' セルのテキストを取得(末尾の改行文字を除去するためにTrimを使用)
' ※実際にはより高度な文字除去が必要な場合もあります
rowData = tbl.Cell(r, c).Range.Text
rowData = Left(rowData, Len(rowData) - 2) ' Word特有の制御文字を除去
Debug.Print "Row:" & r & " Col:" & c & " Value:" & rowData
Next c
Next r
End Sub
3. ステップ2:JSON形式への変換(シリアライズ)
次に、抽出したデータを「JSON」という形式に組み立てます。
JSONは `{ “名前”: “田中”, “年齢”: 30 }` のような、Webの世界で共通言語として使われるデータ形式です。
VBAには標準でJSON変換機能がありません。そのため、文字列結合を使って、自前で組み立てる手法が最も軽量で確実です(大規模な場合は外部ライブラリを使いますが、今回は基本を学びましょう)。
4. 実戦:APIへデータを送信する完全なコード
さあ、いよいよメインディッシュです。
「表を読み取る」→「JSONを作る」→「APIへ送る」という一連の流れを統合したコードを見てみましょう。
このコードを動かすには、VBAエディタのメニューから [ツール] -> [参照設定] を開き、「Microsoft WinHTTP Services, version 5.1」 にチェックを入れてください。これが、Webの世界と通信するための魔法の道具になります。
Option Explicit
''' <summary>
''' Wordの表をJSON化してWeb APIへ送信するメインルーチン
''' </summary>
Sub ExportTableToJsonViaApi()
Dim tbl As Table
Dim jsonString As String
Dim apiUrl As String
Dim http As WinHttp.WinHttpRequest
' --- 設定エリア ---
' 送信先のAPI URL(テスト用のエンドポイントなどを指定してください)
apiUrl = "https://your-api-endpoint.com/api/save-data"
' ------------------
On Error GoTo ErrorHandler
' 1. 表の存在確認
If ActiveDocument.Tables.Count = 0 Then
MsgBox "文書内に表が見つかりません。", vbExclamation
Exit Sub
End If
Set tbl = ActiveDocument.Tables(1)
' 2. JSONの組み立て
' ここでは、1行目をヘッダー(列名)、2行目以降をデータとして扱う構造にします
jsonString = BuildJsonFromTable(tbl)
If jsonString = "" Then
MsgBox "データが空です。", vbExclamation
Exit Sub
End If
' 3. WinHttpを使用してAPIへPOST送信
Set http = New WinHttp.WinHttpRequest
With http
.Open "POST", apiUrl, False ' Falseは同期通信(完了を待つ)
.SetRequestHeader "Content-Type", "application/json"
.SetRequestHeader "Authorization", "Bearer YOUR_TOKEN_HERE" ' 認証が必要な場合
Debug.Print "Sending JSON: " & jsonString
.Send jsonString
' 4. レスポンスの確認
If .Status = 200 Or .Status = 201 Then
MsgBox "データの送信に成功しました!" & vbCrLf & "Response: " & .ResponseText, vbInformation
Else
MsgBox "エラーが発生しました。ステータス: " & .Status & vbCrLf & .ResponseText, vbCritical
End If
End With
Exit Sub
ErrorHandler:
MsgBox "予期せぬエラーが発生しました。" & vbCrLf & Err.Description, vbCritical
End Sub
''' <summary>
''' Wordの表を解析し、JSON形式の文字列を生成する
''' </summary>
Private Function BuildJsonFromTable(tbl As Table) As String
Dim r As Integer, c As Integer
Dim json As String
Dim cellVal As String
Dim header(1 To 10) As String ' 最大列数を想定(適宜調整)
Dim colCount As Integer
colCount = tbl.Columns.Count
json = "[" ' JSON配列の開始
' --- ステップA: ヘッダー(1行目)の読み取り ---
For c = 1 To colCount
header(c) = CleanText(tbl.Cell(1, c).Range.Text)
Next c
' --- ステップB: データ行(2行目以降)のループ ---
For r = 2 To tbl.Rows.Count
json = json & "{"
For c = 1 To colCount
cellVal = CleanText(tbl.Cell(r, c).Range.Text)
' JSONのキーと値を結合
' 例: "氏名": "田中"
json = json & """" & header(c) & """: """ & cellVal & """"
' 最後の列以外にはカンマを入れる
If c < colCount Then json = json & ","
Next c
json = json & "}"
' 最後の行以外にはカンマを入れる
If r < tbl.Rows.Count Then json = json & ","
Next r
json = json & "]" ' JSON配列の終了
BuildJsonFromTable = json
End Function
''' <summary>
''' Word特有の制御文字を除去し、JSONとして安全な文字列にする
''' </summary>
Private Function CleanText(rawText As String) As String
Dim txt As String
txt = rawText
' Wordのセル末尾にある特殊文字(Chr(13) & Chr(7))を除去
If Len(txt) > 2 Then
txt = Left(txt, Len(txt) - 2)
End If
' ダブルクォーテーションをエスケープ(JSON破壊防止)
txt = Replace(txt, """", "\""")
' 改行をスペースに置換(JSONの構造を壊さないため)
txt = Replace(txt, vbCr, " ")
txt = Replace(txt, vbLf, " ")
CleanText = Trim(txt)
End Function
5. 陥りやすい「落とし穴」と回避術
ここまで読んでくださったあなたに、現場でよく遭遇するトラブルを共有しておきます。
① JSONの構文エラー(カンマの罠)
JSONは非常にデリケートです。配列の最後や、オブジェクトの最後の要素の後に `,`(カンマ)が一つあるだけで、受け取り側のAPIは「不正な形式です」と拒絶します。
上記のコードでは、`If c < colCount Then` という条件分岐を入れることで、この問題を回避しています。
② 文字化け問題
VBA内部の文字列はUnicodeですが、APIに送る際に文字コードの不一致が起きることがあります。`WinHttp` は基本的に適切に処理してくれますが、もし日本語が化ける場合は、API側が `UTF-8` を要求しているか確認してください。
③ セルの空文字
セルが空の場合、`CleanText` 関数で適切に空文字列 `””` になるように設計することが重要です。これを怠ると、API側で「Null値は受け付けられません」というエラーを食らいます。
最後に:あなたはもう「ただのユーザー」ではない
いかがでしたでしょうか?
Wordの表を読み取り、JSONという共通言語に変換し、Web APIという窓口を通じて、安全にデータベースへ届ける。これは、現代のシステム開発における「データのパイプライン」そのものです。
最初は難しく感じるかもしれません。でも、この仕組みを一度理解してしまえば、Wordは単なる文書作成ソフトではなく、「強力な業務アプリケーション」へと姿を変えます。
「マクロが動いた」で終わるのではなく、「データがシステムに正しく流れた」ことを喜べる。そんなエンジニアを目指して、一歩ずつ進んでいきましょう。
応援していますよ!
