excel 使用VBA方法通过Bing API获取距离

jxct1oxe  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(184)

我试图通过VBA创建一个方法,当我使用这个方法时,它会显示#NAME?,有时还会显示#value。

Public Function DISTANCE(start As String, dest As String, key As String)
    
    Dim firstVal As String, secondVal As String, lastVal As String
    
    firstVal = "http://dev.virtualearth.net/REST/V1/Routes/Driving?wp.0="
    secondVal = "&wp.1=destinations="
    lastVal = "&optimize=time&routePathOutput=Points&distanceUnit=km&output=xml&key=" & key
    
    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
    
    URL = firstVal & start & secondVal & dest & lastVal
        
    objHTTP.Open "GET", URL, False
    objHTTP.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
    objHTTP.Send ("")
    DISTANCE = Round(Round(WorksheetFunction.FilterXML(objHTTP.ResponseText, "//TravelDistance"), 3) * 1.609, 0)
    
End Function
5vf7fwbs

5vf7fwbs1#

三件事。
1.需要以小写形式传入和传出位置,沿着,表示州的2个字母缩写
1.以上内容需要进行urlencoded
1.响应有一个默认的名称空间,您需要将其添加进去。对于后者,我采用MSXML2.DOMDocument,以便能够添加名称空间。

Public Sub test()

    Debug.Print GetDistance("new york,ny", "miami,fl", "key")

End Sub

Public Function GetDistance(ByVal start As String, ByVal dest As String, ByVal key As String) As Long
    
    Dim firstVal As String, secondVal As String, lastVal As String, objHTTP As Object, url As String
    
    firstVal = "http://dev.virtualearth.net/REST/V1/Routes/Driving?wp.0="
    secondVal = "&wp.1=destinations="
    lastVal = "&optmz=time&routePathOutput=Points&distanceUnit=km&output=xml&key=" & key
    
    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
    
    url = firstVal & Application.EncodeURL(LCase$(start)) & secondVal & Application.EncodeURL(LCase$(dest)) & lastVal
    
    objHTTP.Open "GET", url, False
    objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
    objHTTP.send

    Dim xmlDoc As MSXML2.DOMDocument60 'reference to Microsoft XML via VBE>Tools>References
    
    Set xmlDoc = New MSXML2.DOMDocument60
    xmlDoc.LoadXML objHTTP.responseText
    xmlDoc.SetProperty "SelectionNamespaces", "xmlns:r='http://schemas.microsoft.com/search/local/ws/rest/v1'"

    GetDistance = Round(Round(xmlDoc.SelectSingleNode("//r:TravelDistance").Text, 3) * 1.609, 0)
    
End Function

相关问题