こんにちは、blueです。
今回は郵便番号検索APIから住所を取得します。
これまでの記事はこちら
【VBA-API】Web APIを使ってデータを取得する(OpenWeatherMap)1
【VBA-API】Web APIを使って時間別天気予報を取得する(気象庁API)
【VBA-API】Web APIを使ってLINE通知を行う(LINE Notify)1
【VBA-API】Web APIを使って翻訳をする(DeepL API)
【VBA-API】Web APIを使ってNHK番組表を取得する(NHK番組表API)
このAPIを使えば「郵便番号を入力すれば自動的に住所が出る」ようにできます。
APIの使用についても非常に易しいサイトなのでぜひ参考にしていただければ幸いです。
VBAでのAPIにはMicrosoft XML, v6.0の参照設定やVBA-JSONの導入が必要になります。
もしまだの方は以下の記事をご覧ください。
pythonですが会話形式で非常にわかりやすく書かれている書籍です。WebAPIやスクレイピングを一から理解できる内容になっています。ネットからデータを取得したいと思っている方にお勧めの書籍です。
今回のWeb API
今回のサイトは以下です。
このサイトでは郵便番号をもとに該当する住所の情報を取得することができます。
今回は以下のテンプレートを使い、郵便番号を入力すると住所が出るようにします。
サンプルはこちらをどうぞ。
APIの情報
今回のサイトではAPI Keyの取得は必要ありません。必要なのは「リクエストURL」と「パラメータ」になります。
リクエストURL:https://zipcloud.ibsnet.co.jp/api/search
パラメータ
パラメータ名 | 項目名 | 必須 | 備考 |
---|---|---|---|
zipcode | 郵便番号 | ○ | 7桁の数字。ハイフン付きでも可。完全一致検索。 |
callback | コールバック関数名 | – | JSONPとして出力する際のコールバック関数名。UTF-8でURLエンコードした文字列。 |
limit | 最大件数 | – | 同一の郵便番号で複数件のデータが存在する場合に返される件数の上限値(数字) ※デフォルト:20 |
基本的にはzipcodeのみでOKでURLの後ろに「?パラメータ名=”数値”」を記載します。複数件表示させたくない場合は?limit=1とします。
例:https://zipcloud.ibsnet.co.jp/api/search?zipcode=”1000000″
備考にも書かれている通りハイフンの有り無しに関わらず処理してくれます。その為VBA側での処理は不要になります。
全コード
VBAのHTTPリクエストを使ったコードは以下になります。
今回の郵便番号は「6028202」を使用します(ExcelのD2セルに記載)。
Sub 郵便番号API()
Dim zipcode As String
Dim address1 As String
Dim address2 As String
Dim address3 As String
Dim i As Long
Dim http As MSXML2.XMLHTTP60
Set http = New MSXML2.XMLHTTP60
zipcode = ThisWorkbook.Worksheets(1).Range("D2").Value
'HTTPリクエストにより郵便番号から住所を取得をする
With http
Call .Open("GET", "https://zipcloud.ibsnet.co.jp/api/search?zipcode=" & zipcode)
Call .send
Do
If .readyState = 4 Then Exit Do
DoEvents
Loop
'JSONを出力
Debug.Print .responseText
'JSONパース
Dim jsonObj As Object
Set jsonObj = JsonConverter.ParseJson(.responseText)
' 検索結果が複数存在する場合は、配列として返される為1つ1つ取得する
For i = 1 To jsonObj("results").Count
With ThisWorkbook.Worksheets(1)
.Cells(4 * i, 4).Value = jsonObj("results")(i)("address1") '住所1
.Cells(4 * i + 1, 4).Value = jsonObj("results")(i)("address2") '住所2
.Cells(4 * i + 2, 4).Value = jsonObj("results")(i)("address3") '住所3
End With
Next
End With
End Sub
各コードの説明
HTTPリクエスト
HTTPリクエストについては以下の記事をご確認ください。
基本的にここまでのやり方は同じです。
全データ取得と出力
次にデータ解析の為、データを取得した後全出力します。
'JSONを出力
Debug.Print .responseText
イミディエイトウィンドウには以下の様に表示されます。
この中の「address1」、「address2」、「address3」を取得していきます。
JSONパースと住所の出力
'JSONを出力
Debug.Print .responseText
'JSONパース
Dim jsonObj As Object
Set jsonObj = JsonConverter.ParseJson(.responseText)
' 検索結果が複数存在する場合は、配列として返される為1つ1つ取得する
For i = 1 To jsonObj("results").Count
With ThisWorkbook.Worksheets(1)
.Cells(4 * i, 4).Value = jsonObj("results")(i)("address1") '住所1
.Cells(4 * i + 1, 4).Value = jsonObj("results")(i)("address2") '住所2
.Cells(4 * i + 2, 4).Value = jsonObj("results")(i)("address3") '住所3
End With
Next
End With
得られたデータをVBAの方でJSONパースします。
JSONパースについてはこちら
今回取得したいのは以下の情報になります
今回はresultsキー内の配列([])を取得する形になります。
その為最初のaddress1はjsonObj(“result”)(0)(“address1”)という形で取得します。
このようにして他の情報も取って行きます。
最終的に以下の形で表示されればOKです。
おまけ
今回は無料サイトの使用でしたが、郵便番号から住所を取得するAPIには以下の様なものがあるようです。
詳しくは以下のサイトを参考ください。
今回のまとめ
今回は郵便番号APIを使って郵便番号から住所を取得しました。
VBAでAPI操作を行っている書籍は少ないですが以下の書籍は参考になります。
pythonですが会話形式で非常にわかりやすく書かれている書籍です。webAPIやスクレイピングを一から理解できる内容になっています。ネットからデータを取得したいと思っている方にお勧めの書籍です。
↓困ったときは以下が頼りになります。私も利用させてもらってます😊。
【VBA-API】Web APIを使ってデータを取得する(OpenWeatherMap)1
【VBA-API】Web APIを使って時間別天気予報を取得する(気象庁API)
【VBA-API】Web APIを使ってLINE通知を行う(LINE Notify)1
【VBA-API】Web APIを使って翻訳をする(DeepL API)
【VBA-API】Web APIを使ってNHK番組表を取得する(NHK番組表API)
コメント