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

スポンサーリンク
スポンサーリンク

マクロ記録のその先へ。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は単なる文書作成ソフトではなく、「強力な業務アプリケーション」へと姿を変えます。

「マクロが動いた」で終わるのではなく、「データがシステムに正しく流れた」ことを喜べる。そんなエンジニアを目指して、一歩ずつ進んでいきましょう。

応援していますよ!

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