首页 > 解决方案 > 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

标签: excelvba

解决方案


您需要根据仅返回一个值的函数来考虑它。所以你的函数定义会更像

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 过程为每个地址生成一个表,然后使用内置查找函数从表中获取坐标。


推荐阅读