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 CreateIEApp '// 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 Else '// do nothing End If Else '// 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 '// CAUSES PROBLEM AS SPECIFIED BELOW appIE.Navigate sLocationData Do While appIE.Busy Application.StatusBar = "Contacting Google Maps API..." Loop 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
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!
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 xHttp.send 'wait until it's done Do DoEvents 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