[[20181001031604]] 『住所から緯度経度を求める処理を複数回行うマクロ』(卒論勉強) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『住所から緯度経度を求める処理を複数回行うマクロ』(卒論勉強)

掲示板を使うのは初めてなので、要領を得ない質問でしたらすみません。

グーグルマップのapiを使って、住所から緯度と経度を算出し、
2地点間の直線距離を求めるマクロを作ろうと考えております。

その処理を複数回行いたいので、あとでfor文を追加しようと思い、
とりあえず、1セットの住所に対して、距離を返すマクロをネットを参照して、作成してみました。

行  A   B  C   D   E  F   G 

   2 住所1  緯度 経度 住所2 緯度 経度 距離 

というシートに対して、

Sub distance()

Dim geo As Variant

 geo = AddressToLatLng(Range("A2").Value)
 Range("b2").Value = geo(0)
 Range("c2").Value = geo(1)

 geo = AddressToLatLng(Range("D2").Value)
 Range("e2").Value = geo(0)
 Range("f2").Value = geo(1)

Range("g2").Value = DistanceKm(Range("b2").Value, Range("c2").Value, Range("e2").Value, Range("f2").Value)

End Sub

Function DistanceKm(StartLatitude As Double, StartLongitude As Double _

 , EndLatitude As Double, EndLongitude As Double) As Double

Dim myNS As Double, myEW As Double

With Application.WorksheetFunction

 myNS = (StartLatitude - EndLatitude) / 360 * 40000#
 myEW = (StartLongitude - EndLongitude) / 360 * 40000# _
 * Cos(.Average(StartLatitude, EndLatitude) * .Pi() / 180)
 DistanceKm = (.SumSq(myNS, myEW)) ^ 0.5
 End With

End Function

'住所から緯度・経度に変換

 '戻り値は配列で、(0)が緯度、(1)が経度。
Function AddressToLatLng(ByVal address As String) As Variant
 Dim sc As Object
 Dim jsn As Object
 Dim result As Object
 Dim http As Object
 Dim URL As String
 Dim status, results, location As String

 Set sc = CreateObject("ScriptControl")
 sc.Language = "JScript"
 Set sc = CreateObject("ScriptControl")
 sc.Language = "JScript"
 sc.AddCode "function getLatLng(s) { return eval('(' + s + ')');}"

URL = "https://maps.googleapis.com/maps/api/geocode/json? address= &key=私のapi key" & sc.CodeObject.encodeURI(address)

Set http = CreateObject("MSXML2.XMLHTTP")

 http.Open "GET", URL, False
 http.send
 Set jsn = sc.CodeObject.getLatLng(http.responseText)

If jsn.status = "OK" Then

 For Each result In jsn.results
 AddressToLatLng = Array(result.geometry.location.lat, result.geometry.location.lng)
 Exit For
 Next
 Else
 'エラー
 AddressToLatLng = Array(999, 999)
 End If

Set jsn = Nothing

 Set sc = Nothing
 End Function

しかし、返される緯度・経度は999で
Function AddressToLatLngでエラーが発生していることはわかるのですが、
何が問題なのかわかりません。

url内のAddress=以降が指定できていないためかと思ったのですが、
これを指定する方法がわかりません。
どうかご教授ください。

< 使用 Excel:Excel2013、使用 OS:Windows8 >


まんまの事が出来るサンプルを過去に何処かのブログで見たことがあるような
(あ) 2018/10/01(月) 09:19

「住所から緯度経度 エクセル 直線距離」
で検索かければ一番上に出てきますね
(い) 2018/10/01(月) 10:06

自分で書いたコードじゃないからといって、他人にデバッグさせては駄目です。ご自分でやること。

まず、ステップ実行しつつ、変数の中身を確認し、どこまで動いているのか確認してください。
とりあえず、URL指定は、アドレスのキーワードと文字列の間に、訳の分からない「私のapi key」とか挟んでいますが、ちゃんと考えて挿入しましょう。 なんでもかんでも書けば伝わる、なんてはずはないです。 連続実行しないなら、キー指定不要でしょう。

そして、エラー時の処理に流れているのだから、jsn.statusは "OK" 以外の何かなのでしょう。 確認してください。 更に、一歩手前の http.responseText に何が返ってきているのか気になりますね。
(???) 2018/10/01(月) 12:58


キー指定なしで試したところ、APIキー使え〜、という意味のエラーメッセージが返ってきました。 指定必須に変わったみたいですね。 なので、アドレス指定より後ろに追加してください。

あと、"? address=" のように余分なスペースが入っていますが、間空けずに詰めましょう。
(???) 2018/10/01(月) 13:13


ご指摘、アドバイスありがとうございます。

勉強を重ねようと思います。
(卒論勉強) 2018/10/01(月) 17:03


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.