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