【vba+xml+google地図】ver3で都道府県が取れた!

中元と歳暮商戦だけ動かす自作MS-Accessの地図ソフト
(住所→緯度経度→地図HTML作成)。

毎回、Google Maps APIの仕様変更でシーズン最初の実行は、エラー発生でクラッシュ!

でも、2014年中元商戦開始で動かすと、「あれ!」、拍子抜けの正常終了。
2013年歳暮シーズン以降にGoogle Maps APIの仕様変更は無かったみたい(ホッ)

だったら時間に余裕が出来たので前回解決できなかった不具合に再チャレンジ!
今度こそXMLから都道府県を取り出せないかな!?

Google Maps API Ver2のXMLには”prefecture”ノードが有り、それを取れば都道府県がすぐに分かりました。

ちなみに下のXMLデータが、Google Maps API Ver3で返ってきた形部商事の住所検索結果

<?xml version="1.0" encoding="UTF-8"?>
<GeocodeResponse>
	<status>OK</status>
	<result>
		<type>sublocality_level_5</type>
		<type>sublocality</type>
		<type>political</type>
		<formatted_address>Obara-144-1 Fukuicho, Anan, Tokushima, Japan</formatted_address>
		<address_component>
			<long_name>1</long_name>
			<short_name>1</short_name>
			<type>sublocality_level_5</type>
			<type>sublocality</type>
			<type>political</type>
		</address_component>
		<address_component>
			<long_name>144</long_name>
			<short_name>144</short_name>
			<type>sublocality_level_4</type>
			<type>sublocality</type>
			<type>political</type>
		</address_component>
		<address_component>
			<long_name>Obara</long_name>
			<short_name>Obara</short_name>
			<type>sublocality_level_2</type>
			<type>sublocality</type>
			<type>political</type>
		</address_component>
		<address_component>
			<long_name>Fukuicho</long_name>
			<short_name>Fukuicho</short_name>
			<type>sublocality_level_1</type>
			<type>sublocality</type>
			<type>political</type>
		</address_component>
		<address_component>
			<long_name>Anan</long_name>
			<short_name>Anan</short_name>
			<type>locality</type>
			<type>political</type>
		</address_component>
		<address_component>
			<long_name>Tokushima</long_name>
			<short_name>Tokushima</short_name>
			<font color="red"><type>administrative_area_level_1</type></font>
			<type>political</type>
		</address_component>
		<address_component>
			<long_name>Japan</long_name>
			<short_name>JP</short_name>
			<type>country</type>
			<type>political</type>
		</address_component>
		<geometry>
			<location>
				<lat>33.8455715</lat>
				<lng>134.6262605</lng>
			</location>
			<location_type>APPROXIMATE</location_type>
			<viewport>
				<southwest>
					<lat>33.8442225</lat>
					<lng>134.6249115</lng>
				</southwest>
				<northeast>
					<lat>33.8469205</lat>
					<lng>134.6276095</lng>
				</northeast>
			</viewport>
		</geometry>
	</result>
</GeocodeResponse>

Google Maps API Ver3では、複数存在するaddress_componentノードで、
typeノード=’administrative_area_level_1’なのが都道府県。

と言うことはXMLデータのフィルタリング方法を勉強しなければ。
早速、私の師Google様にお伺いを立てながら右往左往・・・・:-(

都道府県の値を持ってる要素(ノード)は、
/GeocodeResponse/result/address_component
/long_name

検索方法は、検索したい要素(ノード)を”[]”内で指定するそうなのでGoogle Mapsの場合はこんな感じかな?
[/GeocodeResponse/result
/address_component/type=’administrative_area_level_1’]

この2つを相対パスで繋ぐとこうなる。これで動くのかな?

/GeocodeResponse/result/address_component
/long_name[../type=’administrative_area_level_1’]

やった、都道府県を取りだせた😀

これで「都道府県ごとの配送先分布地図HTMLファイル生成」機能が再び動かせる!(良かった)

.....
Dim myF As Integer
Dim myKEN, myFormatAddress, myCity, myLng, myLat,myPref5 As String

myF = 0
myKEN = ""
myCity = ""
myFormatAddress = ""
myLng = ""
myLat = ""
myPref5=""

For Each Node In XDoc.selectNodes
("/GeocodeResponse/result/address_component
/long_name[../type=’administrative_area_level_1’]")
       ’都道府県administrative_area_level_1
       myKEN = Node.Text
Next

For Each Node In XDoc.selectNodes
("/GeocodeResponse/result/address_component
/long_name[../type=’locality’]")
       ’市locality
       myCity = Node.Text
Next

For Each Node In XDoc.selectNodes
("/GeocodeResponse/result/formatted_address")
       ’住所formatted_address
       myFormatAddress = Node.Text
Next
    
    
For Each Node In XDoc.selectNodes
("/GeocodeResponse/result/geometry/location/lng")
       ’経度
       myLng = Node.Text
Next

For Each Node In XDoc.selectNodes
("/GeocodeResponse/result/geometry/location/lat")
       ’緯度
       myLat = Node.Text
Next

myPref5 = Left(myPref, 5)

    Select Case myPref5
    Case "Tokus"
        rs![都道府県] = "徳島県"
    Case "Kagaw"
        rs![都道府県] = "香川県"
    Case "Kochi"
        rs![都道府県] = "高知県"
    Case "Ehime"
        rs![都道府県] = "愛媛県"
    Case Else
        rs![都道府県] = "四国外"
    End Select

.....

地図ソフトが動けば配送準備は数日で完了。
そして、いよいよリアルジョブ、中元の配達だ! 🙂

出来るだけ早くお客様へオーダー通りの商品を無事お届け出来るよう頑張らねば 。

それにしても、軟弱な独学VBAプログラマーにとってXMLの取り回しは超難しいよ!
この数日で髪の毛が百本ぐらい抜けた気がする・・ 😮

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA