簡體   English   中英

VBA代碼未返回大於999的值

[英]VBA code not returning values larger than 999

我正在嘗試讓Excel返回到地址,郵政編碼等之間的行駛距離。我已經使用Google API進行了所有設置,但是我對VBA一點都不熟悉,所以我不確定是什么此代碼有誤。

每當兩點之間的距離大於999英里時,代碼將僅返回第一個數字。 因此,如果是1,284英里,則僅返回1。如果是2,817英里,則僅返回2,依此類推。 如果有人可以看一下並告訴我我所缺少的內容或我做錯了什么,那么我正在運行的代碼在下面。

只是為了讓我盡可能的透明,我自己沒有寫任何內容。 我是從一個名為analyticscave.com的網站上獲得的 ,並且我之前已經在此網站上發布過有關此問題的信息,而我得到的唯一回復卻沒有解決該問題。 我再次發布,但是我認為StackOverflow是找到正確答案的更好的地方,而且速度更快。

預先感謝您的幫助!

'Calculate Google Maps distance between two addresses
Public Function GetDistance(start As String, dest As String)
    Dim firstVal As String, secondVal As String, lastVal As String

    firstVal = "http://maps.googleapis.com/maps/api/distancematrix/json?origins="

    secondVal = "&destinations="

    lastVal = "&mode=car&language=pl&units=imperial&sensor=false"

    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")

    URL = firstVal & Replace(start, " ", "+") & secondVal & Replace(dest, " ", "+") & lastVal

    objHTTP.Open "GET", URL, False

    objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"

    objHTTP.send ("")

    If InStr(objHTTP.responseText, """distance"" : {") = 0 Then GoTo ErrorHandl

    'Set regex = CreateObject(“VBScript.RegExp”): regex.Pattern = """value"".*?([0-9]+)”: regex.Global = False//
    Set regex = CreateObject("VBScript.RegExp"): regex.Pattern = """text"".*?([0-9]+)": regex.Global = False

    Set matches = regex.Execute(objHTTP.responseText)

    tmpVal = Replace(matches(0).SubMatches(0), ".", Application.International(xlListSeparator))

    Debug.Print matches(0).SubMatches(0)

    GetDistance = CDbl(tmpVal)

    Exit Function
ErrorHandl:
    GetDistance = -1
End Function

如果您查看請求返回的內容(使用輸入“ Los Angeles,CA 90001”,“ New York,NY 10001”),則問題很明顯:

     "elements" : [
        {
           "distance" : {
              "text" : "2 796 mil",
              "value" : 4499875
           },
           "duration" : {
              "text" : "1 dzien 16 godz.",
              "value" : 144859
           },
           "status" : "OK"
        }
     ]

請注意,您要在此處索取具有波蘭語本地化的文本(language = pl ):

lastVal = "&mode=car&language=pl&units=imperial&sensor=false"

這將距離文本本地化為帶有千位分隔符的空間。 請注意,“值” 本地化(以米為單位)-當給定language=en進行本地化和units=metric時,會給出此值:

     "elements" : [
        {
           "distance" : {
              "text" : "4,500 km",
              "value" : 4499875
           },
           "duration" : {
              "text" : "1 day 16 hours",
              "value" : 144859
           },
           "status" : "OK"
        }
     ]

快速解決方案是將注釋中提到的正則表達式模式更改為...

regex.Pattern = """text"".*?([0-9,]+)" 

...以及以下要求:

lastVal = "&mode=car&language=en&units=imperial&sensor=false"

盡管我實際上建議您提取非本地化的“值”而不是本地化的“文本”,然后在需要英制單位時轉換為英里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM