首页 > 解决方案 > 使用 VBA 限制 Excel 中的地理定位 API 调用。

问题描述

我正在使用 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

结束功能

标签: excelvbaapirecursiongeolocation

解决方案


您的想法基本上是跟踪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

推荐阅读