【EXCEL VBA】REST APIを呼び出してJSONデータを取得したい(例:郵便番号から住所を取得)

VBAからREST APIを呼び出してJSONデータを取得する方法を紹介します。サンプルプログラムとして、郵便番号から住所を取得します。今回利用する郵便番号APIは無料で利用でき、アカウント登録なども不要です。

APIを利用するには、「Dictionary」と「XMLHTML60」クラスを使います。よって、参照設定にて「Microsoft Scripting Runtime」と「Microsoft XML, v6.0」をONにしておいてください。

またレスポンスがJSON形式で返却されるためパース処理が必要となります。JsonConverterを利用しますので、以下記事を参照してVBA-JSONの設定を完了させてください。

サンプルプログラム

Option Explicit

Sub sample()
    
    Dim httpReq As New XMLHTTP60   '「Microsoft XML, v6.0」を参照設定
    Dim params As New Dictionary   '「Microsoft Scripting Runtime」を参照設定
    
    Dim pCode As String
    pCode = "100-0014"   '郵便番号
    
    With httpReq
      .Open "GET", "https://madefor.github.io/postal-code-api/api/v1/" & Left(pCode, 3) & "/" & Right(pCode, 4) & ".json"
      .Send
    End With

    Do While httpReq.readyState < 4
        DoEvents
    Loop

    Debug.Print "GETレスポンス"
    Debug.Print httpReq.responseText
    Debug.Print ""
    

    ' JSONパース
    Dim jsonObj As Object
    Set jsonObj = JsonConverter.ParseJson(httpReq.responseText)
    
    Debug.Print "JSON整形"
    Debug.Print JsonConverter.ConvertToJson(jsonObj, " ")
    Debug.Print ""
   
    Debug.Print jsonObj("data")(1)("ja")("prefecture")  ' 東京都
    Debug.Print jsonObj("data")(1)("ja")("address1")    ' 千代田区
    Debug.Print jsonObj("data")(1)("ja")("address2")    ' 永田町

End Sub

出力結果

GETレスポンス
{"code":"1000014","data":[{"prefcode":"13","ja":{"prefecture":"東京都","address1":"千代田区","address2":"永田町","address3":"","address4":""},"en":{"prefecture":"Tokyo","address1":"Chiyoda-ku","address2":"Nagatacho","address3":"","address4":""}}]}


JSON整形
{
 "code": "1000014",
 "data": [
  {
   "prefcode": "13",
   "ja": {
    "prefecture": "\u6771\u4EAC\u90FD",
    "address1": "\u5343\u4EE3\u7530\u533A",
    "address2": "\u6C38\u7530\u753A",
    "address3": "",
    "address4": ""
   },
   "en": {
    "prefecture": "Tokyo",
    "address1": "Chiyoda-ku",
    "address2": "Nagatacho",
    "address3": "",
    "address4": ""
   }
  }
 ]
}

東京都
千代田区
永田町