Xml 基于VBA的自动地理编码

Xml 基于VBA的自动地理编码,xml,vba,excel,xml-parsing,Xml,Vba,Excel,Xml Parsing,我正在尝试创建一个VBA脚本,让我可以对我的地址数据库进行地理编码。我已经为这个脚本工作了几天,我想总有一天我会向专家请教一些建议。 所以,我想让脚本访问谷歌地图的url,并找到纬度和经度值。我设法从本地XML文档中提取了这些信息,但我无法使用从GoogleMaps服务器读取的XML。为我工作的代码如下: Sub XMLread() Dim odc As DOMDocument Dim nde As IXMLDOMNode Dim lat As IXMLDOMElement Dim url As

我正在尝试创建一个VBA脚本,让我可以对我的地址数据库进行地理编码。我已经为这个脚本工作了几天,我想总有一天我会向专家请教一些建议。 所以,我想让脚本访问谷歌地图的url,并找到纬度和经度值。我设法从本地XML文档中提取了这些信息,但我无法使用从GoogleMaps服务器读取的XML。为我工作的代码如下:

Sub XMLread()
Dim odc As DOMDocument
Dim nde As IXMLDOMNode
Dim lat As IXMLDOMElement
Dim url As String

Set odc = New MSXML2.DOMDocument
url = "C:\~path~\address.xml"
odc.Load (url)

For Each nde In odc.SelectNodes("GeocodeResponse/result/geometry/location")
    Set lat = nde.SelectSingleNode("lat")
    Debug.Print lat.Text
Next
End Sub
这段代码的作用是打开一个xml文件,找到“lat”的值并在调试窗口中打印它。我计划将结果放在电子表格中,但这不是问题。问题在于直接从服务器提取数据。我使用以下代码:

Sub XMLerverRead()
Dim odc As DOMDocument
Dim nde As IXMLDOMNode
Dim lat As IXMLDOMElement
Dim url As String
url="https://maps.googleapis.com/maps/api/geocode/xml?address=1+Infinite+Loop,+Cupertino,+Santa+Clara,+California+95014&sensor=false"

Set odc = New MSXML2.DOMDocument
odc.async = False
odc.Load (url)

For Each nde In odc.SelectNodes("GeocodeResponse/result/geometry/location")
    Set lat = nde.SelectSingleNode("lat")
    Debug.Print lat.Text
Next
End Sub
上面的代码不返回任何内容,甚至不返回错误。你能不能帮我一下,告诉我如何修复这个代码?先谢谢你

另外,我是VBA新手,但我在这个问题上做了很好的研究。

试试这个:

Sub XMLerverRead()
   Dim odc As DOMDocument
   Dim url As String
   Dim lat As String

   url="https://maps.googleapis.com/maps/api/geocode/xml?address=1+Infinite+Loop,+Cupertino,+Santa+Clara,+California+95014&sensor=false"

   Set odc = New MSXML2.DOMDocument
   odc.async = False
   odc.Load (url)

   If odc Is Nothing Then
      MsgBox "Odc is not loaded with the Xml."

   Else
      lat= vbNullString       'This is to assure that the variable lat has no value.'       
      On Error Resume Next    'We dont want to show the user a system msgbox if the node does not exist'
      lat = odc.SelectSingleNode("GeocodeResponse/result/geometry[location_type='ROOFTOP']/location/lat").Text
      On Error Goto 0

      If lat=vbNullString Then   'Here you can show the user some useful info or do something with your code instead'
         MsgBox "There is no Latitude value for a 'ROOFTOP' node in the given XML"
      End If
   End If        

End Sub
编辑:

我对代码做了一些修改,以帮助回答您的问题

注: 出于示例的考虑,我使用了节点“屋顶”。如果您对找到的第一个lat值满意,可以使用以下任何选项

 odc.SelectSingleNode("GeocodeResponse/result/geometry/location/lat")
 odc.SelectSingleNode("//lat")

对Xpath的了解越多,任务就越容易完成。重要的是要注意,VBA仅适用于Xpath 1.0(不支持Xpath 2)。

我测试了您的代码,效果良好。下面是。。。事实上,我把它复制到了一个新的工作表上,它成功了。但它返回两个值-37.3317055和37.331820。这可能是因为For循环执行了两次。我能摆脱那个循环吗?当然可以。使用Xpath来定义所需的示例。谢谢。我试着用一行代码来替换每一行代码,但我没有做到这一点——我唯一得到的是错误:)因此我想我会照原样生活。太棒了!非常感谢。实际上,我刚开始收到一个错误——“对象变量或块变量未设置”。调试器高亮显示我为lat:lat=odc赋值的行。选择SingleNode(“GeocodeResponse/result/geometry[location\u type='Roadtop']/location/lat”)。text如果我想将代码的最后一行赋值给“lat”变量,我必须以某种特殊方式声明该变量吗?或者我必须使用“设置”来处理错误。这可能是因为没有“位置类型”等于“屋顶”的“几何体”节点。在这种情况下,“SelectSingleNode”将返回
Nothing
,因此返回错误。这也可能是因为
odc
没有加载XML。检查两种可能性。