見出し画像

郵便番号から住所を取得する! ※全文無料

2年ぐらい前に郵便番号から住所を取得する方法を紹介しました。

郵便局のサイトからデータをダウンロードしてきて、それをvlookupするという方法です。
この方法で十分なのですが、すべての郵便番号をダウンロードするのが面倒ですよね。
必要な分だけにしていると、遠方から引っ越し予定の人の住所が取得できません。
それぐらい手打ちすればいいのですが、完全自動にしたい!!!という気持ちで新しい方法に挑戦しました。

今回はVBAで「GetAddress」関数を作ります。
郵便局が提供するAPIを通して郵便番号から住所を取得します。

「Alt+F11」でVBEを起動し、標準モジュールを追加します。

Option Explicit

Function GetAddress(zipcode As String) As String
    Dim apiUrl As String
    Dim xmlhttp As Object
    Dim json As Object
    Dim result As Object
    
    apiUrl = "http://zipcloud.ibsnet.co.jp/api/search?zipcode=" & zipcode
    
    Set xmlhttp = CreateObject("MSXML2.XMLHTTP")
    xmlhttp.Open "GET", apiUrl, False
    xmlhttp.send
    
    If xmlhttp.Status = 200 Then
        Set json = ParseJson(xmlhttp.responseText)
        
        If json("status") = 200 Then
            Set result = json("results")(1)
            GetAddress = result("address1") & result("address2") & result("address3")
        Else
            GetAddress = "住所が見つかりませんでした"
        End If
    Else
        GetAddress = "APIへの接続に失敗しました"
    End If
End Function

こちらのコードをコピペします。
一応解説すると、
"http://zipcloud.ibsnet.co.jp/api/search?zipcode=【郵便番号】"
でAPIを通して住所のJsonファイルを手に入れられます。
試しに、
http://zipcloud.ibsnet.co.jp/api/search?zipcode=1000001
とすると皇居の住所が手に入ります。

ここまで準備して郵便番号の入ったテーブルに=GetAddress(参照セル)と打ち込んでみると、郵便番号でわかる住所の前半部がゲットできました!


郵便番号が間違っていると#VALUE!になるみたいですね。

もしかしたら、ParseJsonがマークされ「コンパイルエラー sub または Functionが定義されていません」と出るかもしれません。
ParseJson関数はVBAにはデフォルトで含まれていないためです。
JSONを解析するために、JsonConverterを導入する必要があります。

JsonConverter.basを手に入れます

ここにアクセスし、zipファイルをダウンロードし、展開すると、JsonConverter.basが入っているので、これをVBEにドラッグアンドドロップするだけで、使えます。


でも、ここでも「~~~が定義されていません」みたいなエラーが出るかもしれません。
そのときは、VBAエディターで [ツール] > [参照設定] をクリックし、一覧から Microsoft Scripting Runtime にチェックを入れて、[OK] をクリックします。
すると、エラーが解消されるはずです。

……と、ここまでさも自分が考えたかのように書きましたが、実はほとんどchatGPTくんにしてもらったのです。
調べたり寄り道しながらなので、時間はかかりましたが、実質コピペしただけです。
なんて賢いのでしょうか。

以下会話、太字は私です。

新入生の住所録をEXCELで作る必要があります。 郵便番号から住所の前半をvlookupして、残りの部分は手打ちするのですが、他にいいやり方はありませんか。
……いくつかの提案(アドオン使う、クエリ使う、マクロ使うなど)……
VBAで教えてください。
VBAを使って、郵便番号から住所を自動的に取得する方法を説明します。次の手順に従って、VBAマクロを作成してください。
1.Excelを開き、郵便番号が入力されているシートを選択します。
2.[開発] タブをクリックし、[Visual Basic] ボタンをクリックします。開発タブが表示されていない場合は、[ファイル] > [オプション] > [カスタマイズリボン]で開発タブを有効にしてください。
3.Visual Basic for Applications (VBA) エディターが開きます。左側のプロジェクトエクスプローラーで、対象のワークシートを右クリックし、「挿入」>「モジュール」を選択して新しいモジュールを作成します。
新しいモジュールが作成されたら、次のVBAコードを貼り付けます。
(コード)
このコードでは、GetAddress関数を定義して、郵便番号を入力すると住所情報を返すようにしています。
5.VBAエディターで[ファイル] > [閉じるして戻る]を選択し、Excelに戻ります。
6.元のシートで、住所を表示したいセルに次の式を入力します。ここでA2セルに郵便番号が入力されていると仮定しています。
=GetAddress(A2)
これで、郵便番号が入力されたセルに応じて、住所情報が自動的に取得され、指定したセルに表示されます。ただし、この方法を使用するには、マクロが許可されている環境である必要があります。また、インターネット接続が必要です。
ParseJsonがマークされ「コンパイルエラー sub または Functionが定義されていません」と出ます。
すみません、おっしゃる通り、ParseJson関数はVBAにはデフォルトで含まれていません。JSONを解析するために、JsonConverterを導入する必要があります。
1.以下のリンクから JsonConverter.bas をダウンロードしてください:
https://github.com/VBA-tools/VBA-Web/blob/master/Converters/JsonConverter.bas
2.VBAエディターを開き、[ファイル] > [インポートファイル]をクリックし、ダウンロードした JsonConverter.bas をインポートします。
3.次に、参照設定に Microsoft Scripting Runtime を追加する必要があります。VBAエディターで [ツール] > [参照設定] をクリックし、一覧から Microsoft Scripting Runtime にチェックを入れて、[OK] をクリックします。
4.これで ParseJson 関数が利用可能になります。先程のVBAコードを貼り付け、保存してください。これでコンパイルエラーが解消されるはずです。
これらの手順を完了した後、先程のVBAコードを使用して、郵便番号から住所を取得できるようになります。

最後のPareJsonの部分に対する回答で示されているサイトは404でした。ググってJsonConverter.basを手に入れました。
ほかは、指示に従っただけです。

ちなみに、最初はPowerQueryを使いました。こっちはめちゃくちゃ時間がかかりました。わたしの不理解のためです。
時間をかけたにも関わらず、リアルタイムには住所が取得できないことがわかりました。
努力の成果ですので、おいておきます。

以上です。

※ 本文は以上です。「記事を購入」での応援を歓迎します。応援いただけましたら今回作成したEXCELファイルをプレゼントいたします。

ここから先は

52字 / 2ファイル

¥ 200

この記事が参加している募集

最後までお読みいただきありがとうございます。「スキ」をしていただけるととても励みになります。