excel - Excel VBA 函数发布
问题描述
我有一个简单的问题,我知道我只是没有正确地问它,因此我找不到我想要的结果。
VBA 仍然相当新鲜,所以我为这个愚蠢的问题道歉。
我创建了一个使用 bing API 获取坐标的函数。到目前为止,它工作正常。
我的问题是如何抵消上述结果?最终目标是能够随时调用该函数,并将结果发布到所选范围旁边。EG 在 A1 中键入地址,在 B1 单元格中调用函数“CoordinatesBing(A1)”,然后它应该在 B1 和 C1 中发布搜索结果。
注意:这绝不是最终产品。这只是一个测试,看看我是否可以得到坐标。稍后我将介绍工作流和错误捕获。另外,我可能完全错了。再次对错误感到抱歉。
Option Explicit
Const bingURL As String = "http://dev.virtualearth.net/REST/v1/Locations?query="
Const apiKey As String = "BingsMapKey"
Private Const ReadyOk As Long = 4
Public Function CoordinatesBing(reqAddress As String) As String
Dim URL As String
Dim reqHTTP As New MSXML2.XMLHTTP60
Dim xmlAddress As String
Dim Latitude As Variant
Dim Longitude As Variant
Dim Result As Range
xmlAddress = WorksheetFunction.EncodeURL(reqAddress)'turns the selected range to Uri encoding
'Makes the request to BingMap
URL = bingURL & xmlAddress & "&o=xml" & "&key=" & apiKey
reqHTTP.Open "GET", URL, False
reqHTTP.send ("")
'Stores the coordinated in these variables.
Latitude = WorksheetFunction.FilterXML(reqHTTP.responseText,"/Response/ResourceSets/ResourceSet/Resources/Location/Point/Latitude")
Longitude = WorksheetFunction.FilterXML(reqHTTP.responseText, "/Response/ResourceSets/ResourceSet/Resources/Location/Point/Longitude")
'This is where I am having difficulties.
Set Result = ' selects the cell here. I assume
'Post the results
Result.Offset(0, 2).Value = Latitude
Result.Offset(0, 3).Value = Longitude
End Function
解决方案
您需要根据仅返回一个值的函数来考虑它。所以你的函数定义会更像
Public Function CoordinatesBing(ByVal reqAddress As String, ByVal lWhich As Long) As String
'do stuff
If lWhich = 0 Then
CoordinatesBing = latitude
Else
CoordinatesBing = longitude
End If
End Function
您可以将其称为单元格 B1 的零和单元格 c1 的一。这很糟糕,因为 http 调用很昂贵,并且您必须调用该函数两次才能获得两个坐标。
您可以将公式编写为数组公式。然后您只需调用 API 一次,但您的用户必须知道在选择两个单元格的情况下输入公式并使用 Ctrl+Shift+Enter。不理想。数组公式 UDF 如下所示
Public Function CoordinatesBing(ByVal reqAddress As String) As String()
Dim sreturn(0 To 1) As String
sreturn(0) = "long"
sreturn(1) = "lat"
CoordinatesBing = sreturn
End Function
函数声明行末尾的那些括号告诉它它正在返回一个数组。
如果您只有有限数量的地址,第三种选择是使用 Sub 过程为每个地址生成一个表,然后使用内置查找函数从表中获取坐标。
推荐阅读
- docker - 错误配置无效,在Kafka集群中异常退出
- java - Kafka Streams 重新平衡高吞吐量 kafka-streams 服务的延迟峰值
- java - 如何在spring boot docker容器中访问mysql docker容器
- r - 阅读 R 中的 power point 模板
- dart - pub.dartlang.org 上发布的软件包的下载统计信息?
- xargs - 使用 xargs 传递多行参数
- node.js - TypeError: storage._handleFile 不是函数
- azure - 如何链接 Azure ARM 模板中的模板?
- python - 使用 Python 在 Redis 中获取多个键/值
- javascript - 保存并读取数据库中的复选框值,更改标签的状态