使用 VBA 限制 Excel 中的地理定位 API 调用。
Posted
技术标签:
【中文标题】使用 VBA 限制 Excel 中的地理定位 API 调用。【英文标题】:limit geolocation API calls in Excel with VBA. 【发布时间】:2018-07-20 00:15:02 【问题描述】:我正在使用 google geolocations API 在 excel 中获取地址的坐标。我查找的地址不会经常更改,因此我不想在每次重新计算工作簿时获得 lat、lng 数据后继续调用 API。我正在使用 lat, lng 来获取将更频繁地重新计算的天气数据。 我尝试使用递归函数来调用编写函数的单元格,以查看我是否已经进行了 API 调用(我不想继续更新具有相同信息的单元格)。 我曾想在 vba 中使用 isblank 函数,但它无法检查单元格是否已准备好任何数据。我认为我的代码有意义并且应该可以工作。有没有更好的方法来做到这一点,我有什么意义吗?
Function TT(Address As String, self As Integer) As Variant
Debug.Print "TT is open__________________________________"
Debug.Print Now()
Dim key As Integer
Dim latlng As String
key = self
Debug.Print Address
Debug.Print self
'this will be set by the self value and should update???
If key = 0 Then
Debug.Print "****recursive call****"
key = 1
Call TT(Address, 1)
End If
latlng = GetCoordinates(Address)
Debug.Print latlng
Debug.Print "Excting function"
TT = latlng
结束函数
【问题讨论】:
我可能想不通,但为什么不使用隐藏表来跟踪已知地址 lat\long 组合? 隐藏表是一种明智的跟踪方式,甚至是写入数据库,但听起来确实有些情况下您确实想用相同的坐标进行另一个调用,还是我误解了? @QHarr 是的,我确实想在获得数据后拨打其他电话。我正在使用黑暗天空 API 来获取天气信息,我还将绘制这些点。假设我有 10 个地址,我想获取天气信息,因为我只想调用 api 10 次并存储这些坐标。获得坐标后,我将对其进行天气 api 更新,2 或 3 次天气 api 调用 20 或 30 次。如果我将另一个位置添加到我的列表中,我只想要一个 api 调用,因为其他 10 个位置已经被调用并且有数据。 听起来你在下面的答案中有一个可行的解决方案:-) 我还不能尝试该代码,但我认为它可以正常工作。但是为了提出问题,您可以在不使用更多内存或向列表中添加任何内容的情况下执行此操作吗?你知道科学! 【参考方案1】:您的想法基本上是跟踪您已处理的Address
,并且只为您尚未处理的那些调用GetCoordinates
。关键是在哪里存储您已经处理过的Address
。
可能性包括
在(隐藏的)工作表上(对共产国际的评论点头) 存储在静态数据结构中,例如字典 以(隐藏的)名称存储 还有许多其他这是一个静态词典版本。 (后期绑定,可选的早期绑定版本已注释)
Function TT(Address As String, Optional Reset As Boolean = False) As String
Static LLs As Object 'Dictionary
Dim latlng As String
If LLs Is Nothing Then Set LLs = CreateObject("Scripting.Dictionary") ' Set LLs = New Dictionary
If Reset Then LLs.RemoveAll
If LLs.Exists(Address) Then
TT = LLs(Address)
Else
latlng = GetCoordinates(Address)
LLs.Add Address, latlng
TT = latlng
End If
End Function
【讨论】:
以上是关于使用 VBA 限制 Excel 中的地理定位 API 调用。的主要内容,如果未能解决你的问题,请参考以下文章
Excel - VBA CopyFromRecordset 字段限制 256