1

誰かが私を正しい方向に向けてくれることを願っています。ある郵便番号から別の郵便番号までの距離を呼び出すために、Excel から呼び出される VBA の関数があります。これは今のところ問題なく動作しています。

距離はオランダについてのみ計算する必要がありますが、クエリ文字列を国に限定することはできません。これで、郵便番号が 2151 KD になりました。これをクエリ文字列で from または to の郵便番号として使用します。お気に入り:

http://maps.googleapis.com/maps/api/distancematrix/json?origins=1251KD&destinations=1211LW&mode=car&sensor=false

(数字と文字の間のスペースを削除します)。

これをブラウザに貼り付けるとうまくいきます。正しい位置と距離を示します。(目的地または出発地)。

このクエリ文字列は、次の VBA 関数を使用してコードで生成されます。

Function GetDistance(fromZip As String, toZip As String) As Integer

Dim Uri As String: Uri = "http://maps.googleapis.com/maps/api/distancematrix/json?origins={0}&destinations={1}&mode=car&sensor=false"
Dim xmlHttp As Object: Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")
Dim Json As Object
Dim distance As Double: distance = 0

Uri = Replace(Uri, "{0}", fromZip)
Uri = Replace(Uri, "{1}", toZip)

With xmlHttp
    .Open "GET", Uri, False
    .setRequestHeader "Content-Type", "text/xml"
    .send
End With

'Debug.Print (Uri)
Set Json = JsonConverter.ParseJson(xmlHttp.ResponseText)

'Top-level status OK
If Json("status") = "OK" Then
    'Elementstatus
    If Json("rows")(1)("elements")(1)("status") = "OK" Then
        distance = CLng(Json("rows")(1)("elements")(1)("distance")("value")) / 1000
    Else
        distance = -2
    End If
Else
    distance = -1
End If

If fromZip = "1251KD" Or toZip = "1251KD" Then
    Debug.Print (xmlHttp.ResponseText)
    Debug.Print (Uri)
End If

If IsObject(xmlHttp) Then
    Set xmlHttp = Nothing
End If

If IsObject(Json) Then
    Set Json = Nothing
End If

GetDistance = Round(distance, 0)

終了機能

ただし、結果は異なります。西暦 1251 年は現在、米国内の場所です。また、距離計算はありません。

VBA コードから呼び出した場合の結果:

{
  "destination_addresses" : [ "1211 LW Hilversum, Netherlands" ],
   "origin_addresses" : [ "NE 1251, Osceola, MO 64776, USA" ],
   "rows" : [

      {
         "elements" : [
            {
               "status" : "ZERO_RESULTS"
            }
         ]
      }
   ],
   "status" : "OK"
}

ブラウザから直接呼び出された場合の結果:

{
destination_addresses: [
"1211 LW Hilversum, Nederland"
],
origin_addresses: [
"1251 KD Laren, Nederland"
],
rows: [
{
elements: [
{
distance: {
text: "6,9 km",
value: 6878
},
duration: {
text: "14 min.",
value: 810
},
status: "OK"
}
]
}
],
status: "OK"
}

これまでのところ、これを解決する方法を見つけることができませんでした。ブラウザのアドレスバーに貼り付けるとクエリ文字列が機能しますが、VBA から呼び出すと結果が無効になります。これまでのところ、この特定の郵便番号 1251 KD についてだけです。

誰も手がかりを持っていますか?

4

1 に答える 1

1

エラーを再現できません。コードは問題なく動作します。

しかし、オランダからの結果のみが必要な場合は、国をクエリ文字列に追加してみませんか?

あなたのコードにとって、それは

Uri = Replace(Uri, "{0}", fromZip & ",Netherlands")
Uri = Replace(Uri, "{1}", toZip & ",Netherlands")
于 2016-03-15T19:59:38.017 に答える