【VBA】郵便番号から住所を取得する

VBAで
 ・郵便番号から住所を取得
できます!
※郵便番号に紐づく住所が複数ある場合、複数の住所を取得できます。

VBAから
 ・郵便局のWebサイトへHTTPリクエストをして
 ・HTTPレスポンスから住所を抜き出す
ことで取得します!
※Web APIは使用しません。

PR

VBAコード

ここでは例として
 ・郵便番号「1000001」の住所を取得
します。
※郵便番号「1000001」の住所は「東京都千代田区千代田」です。

郵便番号「1000001」の住所
郵便番号「1000001」の住所
Option Explicit

Sub sample()
    
    Dim url As String
    Dim zip As String
    Dim httpReq As Object
    Dim httpDoc As Object
    Dim tables As Object
    Dim table As Object
    Dim data As Object
    Dim line As Object
    Dim State As String
    Dim city As String
    Dim addressLine As String
    Dim resultAddress As String

    'URL
    url = "https://www.post.japanpost.jp/cgi-zip/zipcode.php?zip="
    '郵便番号
    zip = "1000001"  '紐付く住所が1件の郵便番号
    'zip = "5110851"  '紐付く住所が2件の郵便番号
    
    'HTTPリクエスト実行
    Set httpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
    httpReq.Open "GET", url & zip, False
    httpReq.Send
    
    '「HTMLDocumentオブジェクト」にHTTPレスポンスを設定
    Set httpDoc = CreateObject("htmlfile")
    httpDoc.body.innerHTML = httpReq.responseText
    
    '検索結果を取得
    '※「table」タグのデータを取得(複数ある場合あり)
    Set tables = httpDoc.getElementsByTagName("table")
    
    '検索結果(tables)の件数分繰り返し
    For Each table In tables
        '都道府県と市区を抜き出す
        Set data = table.getElementsByClassName("data")
        State = data(1).innerText
        city = data(2).innerText
        '町村を抜き出す
        Set line = table.getElementsByClassName("line")
        addressLine = line(0).innerText
        '抜き出した結果を連結
        resultAddress = resultAddress & State & city & addressLine & vbCrLf
    Next
    
    '結果
    MsgBox (resultAddress)

    '後片づけ
    Set httpReq = Nothing
    Set httpDoc = Nothing
    
End Sub

URLとして『郵便番号検索結果ページの「郵便番号」を除いた部分』を指定します(19行目)。
※「https://www.post.japanpost.jp/cgi-zip/zipcode.php?zip=」です。

郵便番号検索結果ページの「郵便番号」を除いた部分
郵便番号検索結果ページの「郵便番号」を除いた部分

任意の「郵便番号」を指定します(21行目)。
※上記では「1000001」を指定しています。

「winhttprequestオブジェクト」の
 ・「Open」メソッドでHTTP接続
 ・「Send」メソッドでHTTPリクエストを送信
をします(25~27行目)。

「HTMLDocumentオブジェクト」にHTTPレスポンスを設定します(30~31行目)。

「HTMLDocumentオブジェクト」の「getElementsByTagName」メソッドにより、
HTTPレスポンスから「table」タグのデータを取得します(35行目)。
郵便番号紐づく住所が2件の場合、2件分の「table」タグのデータが取得されます。

「HTMLDocumentオブジェクト」の「getElementsByClassName」メソッドにより、「table」タグのデータから住所を抜き出します(38~48行目)。

郵便局のWebサイトのHTML構成が変更された場合、上記のVBAコードも変更が必要になる可能性があります。

PR

実行結果

郵便番号から住所を取得できました。
※郵便番号「1000001」から住所である「東京都千代田区千代田」を取得できました。

実行結果
実行結果

紐づく住所が2件の場合、結果は以下のようになります。

実行結果(紐づく住所が2件の場合)
実行結果(紐づく住所が2件の場合)
PR

参考①

郵便局の「郵便番号検索ページ」は以下です。

PR

参考②

上記で使用した以下の詳細は、公式サイトをご確認ください。

●「WinhttpRequestオブジェクト」の「Open」メソッド


●「WinhttpRequestオブジェクト」の「Send」メソッド


「HTMLDocumentオブジェクト」について
※公式オンラインマニュアル上に、当該ページは見つかりませんでした。