Excel VBAでロケタッチAPIを利用して住所表現を正規化する

ロケタッチAPI 位置情報 β版は与えられた住所の正規化結果を取得してくれます。

RubyやJavaからの使用は検索上位に出てきますが、VBAは出てこなかったので作ってみました。

1.何でAPIを呼び出すか

Web APIの呼び出しだとよくXMLHTTPオブジェクトが使われます。そのほかHTMLdocumetを使ったり、IE objectを使う方法が一般的で、当初これらを用いての呼び出しを試みましたがうまくいきません...

XMLHTTP...StatusTextがエラーコードを返し、内容を読み取れません。戻り値のJSONがUTF-8形式なのが問題なのでしょうか?
HTMLdocument...重い。とにかく重い。そしてhttpを開くかどうかの問い合わせダイアログがでる。使えないので却下。
IE object...ファイル(戻り値のJSON)をダウンロードするか、のダイアログが出る。いちいち答えなきゃいけないのでは使えないので却下。firefoxならJSON開いてくれるのに、IEはダウンロードなのね...。

どうしたものか、と行き詰ったのですが、ダウンロードダイアログが出るのなら、最初からダウンロード前提でやればよかろう、ということで調べたところ、「URLDownloadToFile」がurlmon.dllにあると知り、そちらを使うことにしました。

2.入手したJSONをどう読むか

1,でデータの入手には成功したものの、openステートメントで読むと2バイト文字の部分が化け化けです。入手したJSONは文字コードがUTF-8でしたOTL (openステートメントはshift-jisが大前提)。
これについてはADODB.streamを経由で読み込んで解決。

以下、ソースコードです。

Function AddressNormalize(ByVal FullAddress As String) As Variant

'住所表現正規化APIロケタッチをVBAから呼び出す
'HTML取得ではうまくいかないのでjsonをダウンロードして読み込む
'jsonはUTF-8なのでADODB使用。参照設定いらないようcreateobjectする。
'結果jsonの不要文字を除き、ヘッダ:結果の配列で返す。
'is_error: 0=OK 1=NG
'query: 元の住所
'code: よくわからん
'zip: 郵便番号
'resion_id: 市区町村コード
'number: 番地以下の住所
'resion: 都道府県、郡、市区町村
'town: 市区町村から後、番地より前
'build: 建物名や部屋番号
'address: 正規化住所

On Error GoTo ErrAddressNormalize

'エラー部特定用
Dim Step As Long

'ダウンロードファイル操作用
Dim strm As Object
Dim strData As String

'データ取得用
Dim ResultValue

'ダウンロードファイル名
Dim StrFile As String

StrFile = ThisWorkbook.Path & "\address_normalize.json"

Step = 0

'HTTP通信に関する変数
Dim url As String

'(1)キーワードの入力チェック
Step = 1
If Len(FullAddress) = 0 Then
MsgBox "キーワードが未入力です", vbExclamation
GoTo FailureAddressNormalize
End If

'(2)URL生成
Step = 2

url = "https://api.loctouch.com/v1/geo/address_normalize" 'リクエスト送信先
url = url & "?address=" & URLEncode(FullAddress) 'キーワード指定引数を追加

'(3)結果ファイルをダウンロード
'URLDownloadToFile API をコールする
Step = 3

ResultValue = URLDownloadToFile(0, url, StrFile, 0, 0)

If ResultValue <> 0 Then
MsgBox "結果の取得に失敗しました。", vbExclamation
GoTo FailureAddressNormalize
End If

'(4)ダウンロードファイルをテキストとして変数に格納
Step = 4

Set strm = CreateObject("ADODB.stream")

With strm
'キャラクタコードを設定
.Charset = "UTF-8"
'Streamオブジェクトを開く
.Open
'テキストファイルをStreamオブジェクトに読み込み
.LoadFromFile StrFile
'Streamオブジェクトの内容を変数に読み込み
ResultValue = .ReadText
'Streamオブジェクトを閉じる
.Close: Set strm = Nothing
End With

'(5)取得データの各要素の配列に
Step = 5

ResultValue = Replace(ResultValue, """", "")
ResultValue = Replace(ResultValue, "{", "")
ResultValue = Replace(ResultValue, "}", "")
ResultValue = Replace(ResultValue, "result:", "")
ResultValue = Replace(ResultValue, "normalize:", "")
ResultValue = Split(ResultValue, ",")

AddressNormalize = ResultValue

Exit Function

FailureAddressNormalize:

AddressNormalize = "Failed"

Exit Function

ErrAddressNormalize:

MsgBox Err.Number & vbCrLf & Err.Description, , "エラー:AddressNormalize step" & Step
Err.Clear
AddressNormalize = "Error"

End Function

「URLDownloadToFile」と「URLEncode」は先達のHPに詳しい説明がございますのでそちらをご参照ください^^
スマートなやり方じゃないですけど、今のところエラーなく正規化表現取得できています。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください