Home » excel » excel – How to use appIE.Document.Body.innerHTML

excel – How to use appIE.Document.Body.innerHTML

Posted by: admin April 23, 2020 Leave a comment


So I’m trying to retrieve the latitude and longitude of a given postal code, and am trying to use VBA to place this into an excel worksheet. My code is as follows:

Private appIE As Object

Function GeoCode(sLocationData As String) As String
'//Dont want to open and close all day long - make once use many
If appIE Is Nothing Then
    '// Creates a new IE App
    '// if = nothing now then there was an error
    If appIE Is Nothing Then
        GeoCode = "Sorry could not launch IE"
        Exit Function
        '// do nothing
    End If
    '// do nothing
End If
'//clearing up input data
'sLocationData = Replace(sLocationData, ",", " ")
sLocationData = Replace(sLocationData, " ", "+")
sLocationData = Trim(sLocationData)

'//Build URL for Query
sLocationData = "http://maps.google.com/maps/geo?q=%20_" & sLocationData

'// go to the google web service and get the raw CSV data
appIE.Navigate sLocationData

Do While appIE.Busy
    Application.StatusBar = "Contacting Google Maps API..."

Application.StatusBar = False
On Error Resume Next

'// Parsing
GeoCode = appIE.Document.Body.innerHTML
GeoCode = Mid(GeoCode, InStr(GeoCode, ",") + 1, InStr(GeoCode, "/") - InStr(GeoCode, ",") - 2)

appIE = Nothing
End Function

The Google Maps API then returns a JSON formatted value, as per this link:


I then attempt to retrieve this value using
and parsing that value for the data I want. However, the moment the code hits appIE.Navigate sLocationData,
I’m prompted to save a file called “geo”. When saved and opened as a .txt file, I get the exact same JSON formatted value, but I need the values within my worksheet itself.

Is there a way to do this?

Thanks in advance!

How to&Answers:

That link didn’t work for me in Firefox – response 610. If I remove the space and the underscore, it works. I don’t know why IE wants to download, probably some setting that tells it to always download JSON rather than render it. In any case, consider using MSXML’s http request rather than automating IE.

Set a reference to Microsoft XML, v6.0 or similar (VBE – Tools – References).

Function GeoCode(sLocData As String) As String

    Dim xHttp As MSXML2.XMLHTTP
    Dim sResponse As String
    Dim lStart As Long, lEnd As Long

    Const sURL As String = "http://maps.google.com/maps/geo?q="
    Const sCOOR As String = "coordinates"": " 'substring that we'll look for later

    'send the http request
    Set xHttp = New MSXML2.XMLHTTP
    xHttp.Open "GET", sURL & sLocData

    'wait until it's done
    Loop Until xHttp.readyState = 4

    'get the returned data
    sResponse = xHttp.responseText

    'find the starting and ending points of the substring
    lStart = InStr(1, sResponse, sCOOR)
    lEnd = InStr(lStart, sResponse, "]")

    GeoCode = Mid$(sResponse, lStart + Len(sCOOR), lEnd - lStart - Len(sCOOR) + 1)

End Function

Sub Test()

    Dim sTest As String

    sTest = GeoCode("400012")

    Debug.Assert sTest = "[ 103.9041520, 1.3222160, 0 ]"

End Sub