我有一个很大的位置列表,我需要找到在另一个应用程序中使用的纬度和经度。我已经创建了一些代码来访问网站并检索这些信息。大多数时候第一个坐标都很好。但是,并非所有地址都记录在excel中。有时我会得到空单元格。我似乎无法弄清楚出了什么问题。这是代码:
Sub GetCoordinates()
Dim IE As New InternetExplorer
Dim Doc As HTMLDocument
Dim rowNum As Integer
Dim lastRow As Integer
Dim tURL As String
Dim coordinates As String
IE.Visible = True
'This will be the number of rows with an address (5 is for testing purposes)
lastRow = 5
For rowNum = 1 To lastRow
'The URL is determined by the address in a cell (ex. in C2)
tURL = "http://dbsgeo.com/latlon/?" & Cells(rowNum, "C").Value
IE.navigate tURL
Do
'Wait until the page loads
Loop Until IE.readyState = READYSTATE_COMPLETE
Set Doc = IE.document
coordinates = Trim(Doc.getElementById("latlon").innerText)
Cells(rowNum, "B").Value = coordinates
Next rowNum
IE.Quit
End Sub
不是代码不运行;问题是我会以随机顺序获得8个地址中的3个坐标。甚至有时会记录错误的坐标。我不知道为什么会这样。有人能告诉我我的代码有什么问题吗?
答案 0 :(得分:1)
问题似乎是那些字段"latlon
"例如,正在被一些javascript函数填充,这些函数在 页面加载之后才会被执行,因此在这种情况下依赖IE.document.readyState
是不可靠的。
通常,我说使用WinAPI睡眠功能(把它放在模块的顶部):
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
然后,做你的等待"循环如:
Do
Sleep 250
Loop Until IE.ReadyState = READYSTATE_COMPLETE And Not IE.Busy
但是,对于这个特定的网站,这仍然不适合我,尽管如果我做Sleep 1000
似乎有效,时间将根据流量,网络速度,连接性,可用系统资源等而有所不同。 ,即便这样也不是100%可靠。
我还试图找到一种模拟XMLHTTPRequest的方法(比直接使用浏览器更快),但这也没有用。
我看了另一个网站。在大多数情况下,可以使用VBA在网站上填写表单和提交/点击控件,但我从未发现那些非常可靠并且没有尝试过该网站。
我花了太多时间试图强迫该解决方案工作,但这是一个糟糕的解决方案,因为它是一个糟糕的网站,被一些第三方使用谷歌的地理编码API。
您应该直接使用Google的API
文档:
https://developers.google.com/maps/articles/geocodingupgrade
您可以构建如下的网址:
http://maps.googleapis.com/maps/api/geocode/xml?address=Paris,+France
您可以将其加载到XML / DOM解析器(使用对我推荐的Microsoft XML,v6.0(又名MSXML2)的vba引用。这不使用浏览器,它是一个能够使用的流在内存中直接从URL(如上所述)加载XML。
使用DOM解析器,使用DOMDocument' .GetElementsByTagName("location")(0)
,然后从子节点拉出lat / lon。
如果您在实施该问题时遇到问题,请与我们联系。