2016-08-02 84 views
0

我试图让Excel返回地址,邮政编码等之间的行驶距离。我已经使用Google API设置了所有设置,但我不熟悉VBA在所有,所以我不知道这个代码有什么问题。VBA代码不返回大于999的值

每当两点之间的距离大于999英里时,代码将只返回第一个数字。所以如果它是1,284英里,它只返回1。如果它是2,817英里,它只返回2,等等。我正在运行的代码在下面,如果有人可以看看它,告诉我我错过了什么,或者我做错了什么。

而且我只是尽可能地透明,我自己也没有写过这些。我从一个叫做analystcave.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 
+1

您的正则表达式是否在千位分隔符处打破? – steenbergh

+0

我不知道。我如何检查?对不起,我对VBA一无所知。 – burkamus

+2

我认为他的意思是,你的输入文本的正则表达式像10000或10,000像?如果是后者,那么在处理这个逗号时会遇到问题。 – Mikegrann

回答

0

的问题,如果你看一下是由您的请求返回的是相当明显的(使用输入 “洛杉矶,CA 90001”, “纽约,NY 10001”):

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

请注意,您要请求与这里的波兰本地化的文本(语言= 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" 

虽然我实际上建议拉动非本地化的“价值”,而不是本地化的“文本”,然后转换为英里,如果你需要英制单位。