提取地址列表的地理坐标(VBA EXCEL)

时间:2014-05-14 00:47:11

标签: vba excel-vba excel

我有一个很大的位置列表,我需要找到在另一个应用程序中使用的纬度和经度。我已经创建了一些代码来访问网站并检索这些信息。大多数时候第一个坐标都很好。但是,并非所有地址都记录在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个坐标。甚至有时会记录错误的坐标。我不知道为什么会这样。有人能告诉我我的代码有什么问题吗?

1 个答案:

答案 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。

如果您在实施该问题时遇到问题,请与我们联系。