excel - 使用 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
结束功能
解决方案
您的想法基本上是跟踪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
推荐阅读
- php - sqlserver语法错误的表格式
- ios - Siri Shortcut INPlayMediaIntent 2 分钟后停止播放
- http - 如何同时有条件地重定向和提供带有资产的 HTML
- javascript - Sails.js 中使用来自 Vue.js 的sails-hook-uploads 上传多个文件:ETIMEOUT
- swift - 如何初始化让文本属性
- django - 为特定距离范围内的项目过滤 PointField 的查询集字段不正确
- vbscript - 使用 VBScript CDO.Message 创建电子邮件时如何设置重复的标题而不覆盖?
- delphi - 如何根据参数创建 Delphi 混合(控制台或 GUI)应用程序?
- angular - Angular 6中父子通信的问题
- python - 使用“for”循环中的变量删除 Python 中的多余空格