2017-08-13 114 views
-5

我想在Windows 10的Excel中使用GMDMA中的This Post baelaelael的代碼,並且遇到我無法理解的錯誤。在Excel上使用Google Maps Distance Matrix API - 我哪裏出錯了?

我需要用距離爲我的論文填充一個非常龐大的數據庫(254x30),我試圖避免手工搜索所有內容 - 所以如果我可以每天使用=GetDistance函數調用2000多天這應該夠了吧。

我得到的功能,在紙張返回錯誤(-1),這樣看來我第一次進入VBA至少使它成爲Excel工作表...

我嘗試添加我的API關鍵是因爲我認爲這可能是問題。

下面的代碼:

Public Function GetDistance(start As String, dest As String) 

    Dim firstVal As String, secondVal As String, lastVal As String 

    firstVal = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=" 
    secondVal = "+&destinations=" 
    lastVal = "+&mode=car&language=en&sensor=false&key=###################################" 

    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP") 

    URL = firstVal & Replace(start, " ", "+") & secondVal & Replace(dest, " ", "+") & lastVal 

    objHTTP.Open "GET", URL, False 
    objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
    objHTTP.send ("") 

    If InStr(objHTTP.responseText, """distance"" : {") = 0 Then GoTo ErrorHandl 

    Set regex = CreateObject("VBScript.RegExp"): regex.Pattern = """value"".*?([0-9]+)": regex.Global = False 

    Set matches = regex.Execute(objHTTP.responseText) 

    tmpVal = Replace(matches(0).SubMatches(0), ".", Application.International(xlListSeparator)) 

    GetDistance = CDbl(tmpVal) 

    Exit Function 

ErrorHandl: 

    GetDistance = -1 

End Function 

然後我調用該函數在片材:

=GetDistance(B12,T3) 

但我想,可能是錯誤的,所以我嘗試:

=GetDistance($P$13,T4) 

對於原來的代碼用戶發佈的語法之後的另一組單元格,也沒有工作。有什麼想法嗎?

+1

B12和T3的格式是什麼?你能給個例子嗎? –

+0

我試過http://maps.googleapis.com/maps/api/distancematrix/json?origins=paris+&destinations=london&mode=car&language=en&sensor=false&key=######### ....它每天幾次沒有密鑰,並返回json數據,所以問題不是關鍵 – jsotola

+0

我也嘗試了從vba sub調用它的代碼,它的工作。代碼接受兩個字符串(城市名稱都可以)....也在單元格中嘗試過,並且工作正常......您是否在B12和T3中放置了城市名稱?返回的值是以米爲單位的距離。 – jsotola

回答

0

想通了。在程序後面手動構建URL,並返回一個ssl錯誤。在URL代碼行中添加了「s」,並以米爲單位返回正確的值。更正後的代碼如下:

Public Function GetDistance(start As String, dest As String) 
Dim firstVal As String, secondVal As String, lastVal As String 
firstVal = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" 
secondVal = "+&destinations=" 
lastVal = "+&mode=car&language=en&sensor=false&key=####################################################################" 
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP") 
URL = firstVal & Replace(start, " ", "+") & secondVal & Replace(dest, " ", "+") & lastVal 
objHTTP.Open "GET", URL, False 
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
objHTTP.send ("") 
If InStr(objHTTP.responseText, """distance"" : {") = 0 Then GoTo ErrorHandl 
Set regex = CreateObject("VBScript.RegExp"): regex.Pattern = """value"".*?([0-9]+)": regex.Global = False 
Set matches = regex.Execute(objHTTP.responseText) 
tmpVal = Replace(matches(0).SubMatches(0), ".", Application.International(xlListSeparator)) 
GetDistance = CDbl(tmpVal) 
Exit Function 
ErrorHandl: 
GetDistance = -1 
End Function 

該代碼需要地址,十進制度數等等。希望這對某人有用。您必須先激活Google距離矩陣API,然後獲取密鑰並將其插入代碼中,然後將############ s放入代碼中。乾杯。

相關問題