我正在创建一个Excel电子表格,其中包含8个不同位置和它们之间距离的网格,这些距离是从Google Maps Distance Matrix API中获取的。这些位置是从一个表格中输入的,并且会经常更改。
我目前使用的VBA代码是:
然后,我使用简单的函数在电子表格中调用它:
这个脚本运行得很好,但这意味着每次电子表格加载和更改任何位置时都会进行56个API调用,因此我很快就会达到2500个API调用限制。
有没有办法使函数仅在特定时间拉取数据(例如在点击按钮时),或者以更少的API调用获取相同的数据?
我目前使用的VBA代码是:
'Calculate Google Maps distance between two addresses
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 = "+UK&destinations="
lastVal = "+UK&mode=car&language=en&sensor=false"
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($D$14,B15)
这个脚本运行得很好,但这意味着每次电子表格加载和更改任何位置时都会进行56个API调用,因此我很快就会达到2500个API调用限制。
有没有办法使函数仅在特定时间拉取数据(例如在点击按钮时),或者以更少的API调用获取相同的数据?
If Not needRef Is Nothing Then
- baelaelael=INDEX($A:$A,COLUMN())
(自动向右填充以匹配您的地址),然后在B2中放入=IF(B$1=$A2,"-",GetDistance(B$1,$A2))
并自动填充以获取交叉表。确保您的原始工作簿已关闭(只打开新工作簿)。添加一个按钮并将theButtonSub
分配给它。如果您点击按钮,是否仍然出现错误并且没有数字弹出? - Dirk Reichel