SSブログ

Excelで郵便番号から住所変換(WEBSERVICE,Addin,WEBAPI) [VBA/VBS]


 Excel表で郵便番号を入力すると自走で住所が入ると便利なことがある。そこでExcel 2013で追加された「WEBSERVICE」関数、zipcode7.xlaアドイン、普通にWebAPIでXMLデータを取得する方法の3種類作成してみた。

「WEBSERVICE」関数を使用する方法
 こちらの「郵便番号検索API」サービスを使用させてもらい、住所のセルに=FILTERXML(WEBSERVICE("http://zip.cgis.biz/xml/zip.php?zn=" & 郵便番号cell),"/ZIP_result/ADDRESS_value/value[@address]/@address")とすれば簡単に実現できる。
 しかし複数行に渡って入力するには上記の式をコピーになければいけなくスマートではないのでVBAで制御することにした。
サンプル
実際のサンプルはここ
コード
'-------------------------------------------------------------------------------------------
'    Sheet1 マクロ
' セルの値が変化したときA列の郵便番号をB列の住所に変換
'------------------------------------------------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim i As Integer
  Dim zipcode, cellad As String
  
  For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
    If Target.Address() = "$A$" + CStr(i) Then
      cellad = "$A$" + CStr(i)
      Cells(i, 2) = zip2address(Range(cellad))
    End If
  Next
End Sub
’------------------------------------------------------------------------------------------------
'   Module1 マクロ
'     FilterXML, WebServiceをWorksheetFunctionを使いvbaで使用
’------------------------------------------------------------------------------------------------
Function zip2address(ByVal 郵便番号 As String)
  Dim httpAdd, State, city, Address As String
  
  郵便番号 = Replace(郵便番号, "-", "")
  httpAdd = "http://zip.cgis.biz/xml/zip.php?zn="
  If 郵便番号 <> "" Then
    State = WorksheetFunction.FilterXML(WorksheetFunction.WebService(httpAdd + 郵便番号), "/ZIP_result/ADDRESS_value/value[@state]/@state")
    city = WorksheetFunction.FilterXML(WorksheetFunction.WebService(httpAdd + 郵便番号), "/ZIP_result/ADDRESS_value/value[@city]/@city")
    Address = WorksheetFunction.FilterXML(WorksheetFunction.WebService(httpAdd + 郵便番号), "/ZIP_result/ADDRESS_value/value[@address]/@address")
  
    zip2address = State + city + Address
 Else
    zip2address = ""
 End If
End Function


Microsoftのzipcode7.xlaアドイン
 インターネットに接続しなくても使えるように、こちらの郵便番号変換アドイン"zipcode7.xla"を使用してみた。本アドインを組み込んで使用する方法は組み込むにも手間がかかること、3ステップもの[郵便番号変換ウィザード ステップ]に入力が必要なのでVBAでzipcode7.xlaのコアな機能のみを使ってみることにした。
 しかしaddin側のfunctionを使用するには、Excelの[セキュリィセンター]-[マクロの設定]-[開発者向けのマクロ設定]-[VBAプロジェクトとオウジェクトモデルへのアクセスを信頼する(Y)]をチェックする必要があることが分かり、この方法も諦め。zipcode7.xlaのコアな機能のみを切り出し、今回作成するExcelのModuleに取り込む方法で実現した。
 取込んだModule(zipcode7.xlaからインポート): Addin_Common, YUBIN7_Core

サンプル
実際のサンプルはここ
コード
'-------------------------------------------------------------------------------------------
'    Sheet1 マクロ
'-------------------------------------------------------------------------------------------
' WEBSERVICEと同じ

’------------------------------------------------------------------------------------------------
'   Module1 マクロ
’------------------------------------------------------------------------------------------------
Public Function zip2address(郵便番号 As String)
    Dim 県 As String * 255, 都市 As String * 255, 都市2 As String * 255
    Dim 町名 As String * 255, 町名2 As String * 255
    Dim Ret As String
    
  If 郵便番号 <> "" Then
    Call YUBIN7_Core.fnStartYubin7
    Call GetZipDecision(郵便番号, 県, 都市, 都市2, 町名, 町名2)
    
    Ret = Replace(県 & 都市 & 都市2 & 町名 & 町名2, Chr(0), vbNullString)
    Ret = Replace(Ret, Chr(32), vbNullString)
    zip2address = Ret
  Else
    zip2address = ""
  End If
End Function

普通にWebAPIでXMLデータを取得する方法
「WEBSERVICE」関数を使用する方法と同じAPIを使用させてもらい、普通にVBAでHTTPリクエストを投げレスポンスを受け取る方法で住所を取得している。
サンプル
実際のサンプルはここ
コード
'-------------------------------------------------------------------------------------------
'    Sheet1 マクロ
'-------------------------------------------------------------------------------------------
' WEBSERVICEと同じ

’------------------------------------------------------------------------------------------------
'   Module1 マクロ
’------------------------------------------------------------------------------------------------
Function zip2address(ByVal 郵便番号 As String)
  Dim objXMLHttp As Object, zipArr, xmldata
  Dim state As String, city As String, address As String

  郵便番号 = Replace(郵便番号, "-", "")
  If 郵便番号 <> "" Then
    Set objXMLHttp = CreateObject("MSXML2.XMLHTTP")
    objXMLHttp.Open "GET", "http://zip.cgis.biz/xml/zip.php?zn=" & 郵便番号, False
    objXMLHttp.Send
    Set xmldata = objXMLHttp.responseXML

    state = xmldata.ChildNodes(1).ChildNodes(9).ChildNodes(4).Attributes.Item(0).Text
    city = xmldata.ChildNodes(1).ChildNodes(9).ChildNodes(5).Attributes.Item(0).Text
    address = xmldata.ChildNodes(1).ChildNodes(9).ChildNodes(6).Attributes.Item(0).Text
    zip2address = state + city + address
  Else
    zip2address = ""
  End If
End Function


nice!(0)  コメント(2)  トラックバック(0) 

nice! 0

コメント 2

molkichi

私のexcelでは「普通にWebAPIでXMLデータを取得する方法」
こちらのみ起動できました。
こちらのマクロで
郵便番号を複数コピーして貼り付けても
起動させるにはどうすれば良いか教えて頂けますでしょうか
by molkichi (2019-09-12 13:14) 

tyama0467

大変失礼しました。タイプミスにより2行目から変換されませんでした。修正してアップロードしなおしました。
by tyama0467 (2019-09-23 16:48) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。