その他
    ホーム 技術発信 DoRuby EXCEL(VBA)から、JSONデータをHTTP送信してみよう。
    EXCEL(VBA)から、JSONデータをHTTP送信してみよう。
     

    EXCEL(VBA)から、JSONデータをHTTP送信してみよう。

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    はじめに

    EXCELでマスタデータ等を作成して、直接サーバへリクエストしデータの格納/情報の取得をしたいと思いませんか?
    それを実現する簡単な方法をご紹介します。

    JSONデータを使用するために

    BOXのAPIを使って見よう。(その3)でも紹介していますが、
    EXCEL(VBA)でJSONを扱うには、VBA-JSONを使用するのが簡単です。

    サンプル JSON

    JSONデータ交換フォーマットの定義は、ECMA-404を参照して下さい。

    {
      "id" : 1,
      "name" : "John Smith",
      "friend_ids" : [ 10, 20, 30 ],
      "shipTo" : { "name" : "Appirits Inc.",
                   "address" : "5F Kyocera-Harajuku Bldg. 6-27-8, Jingumae, Shibuya-ku",
                   "city" : "Tokyo",
                   "state" : "Japan",
                   "zip"   : "150-0001" },
    }
    

    VBA で JSON 生成

    連想配列 Dictionary と、可変配列 Collection を使って JSONオブジェクトにデータをセットする

     '---------------------------------
     ' リクエストパラメタ生成
     '---------------------------------
     Dim JsonObject As Object
     Set JsonObject = New Dictionary
    
     JsonObject.Add "id", 1
    
     JsonObject.Add "name", "John Smith"
    
     JsonObject.Add "friend_ids", New Collection
     JsonObject("friend_ids").Add 10
     JsonObject("friend_ids").Add 20
     JsonObject("friend_ids").Add 30
    
     JsonObject.Add "shipTo", New Dictionary
     JsonObject("shipTo").Add "name", "Appirits Inc."
     JsonObject("shipTo").Add "address", "5F Kyocera-Harajuku Bldg. 6-27-8, Jingumae, Shibuya-ku"
     JsonObject("shipTo").Add "city", "Tokyo"
     JsonObject("shipTo").Add "state", "Japan"
     JsonObject("shipTo").Add "zip", "150-0001"
    
     ' イミディエイトウィンドウで確認(デバック用)
     Debug.Print JsonConverter.ConvertToJson(JsonObject, Whitespace:=2)
    

    イミディエイトウィンドウで確認すると、JSONが生成されている事が確認できますね。
    イミディエイトウィンドウで表示したJSON

    VBAからHTTP通信

    CreateObject(“MSXML2.XMLHTTP”)でIXMLHTTPRequestオブジェクトをを生成して送信するのが簡単な方法です。

    '---------------------------------
    ' リクエスト
    '---------------------------------
    Dim objHTTP As Object
    Set objHTTP = CreateObject("msxml2.xmlhttp")
    objHTTP.Open "POST", "http://localhost:8080", False
    objHTTP.setRequestHeader "Content-Type", "text/plain"
    objHTTP.send JsonConverter.ConvertToJson(JsonObject)
    
    ' レスポンスコード(正常)
    If objHTTP.status = 200 Then
        MsgBox "正常に終了しました"
    End If
    
    

    実際のHTTP通信内容を proxy ツールで確認

    proxyツールfiddler を使った、HTTP通信内容を確認した様子です。

    FiddlerでHTTP通信内容を確認

    FiddlerでリクエストのPOSTデータが、JSONとなっていることを確認した結果です。
    FiddlerでJSON内容確認

    まとめ

    送信するデータをEXCELから取得する部分は割愛しましたが、簡単にJSONデータが作成出来ましたね。
    次回は、VBAで画像などのファイルをアップロードするにはどうすればいいか?
    を考えて見ます。