3

Я нашел этот фантастический скрипт vba, который берет адрес и возвращает широту и долготу, используя Google Maps API. Тем не менее, Google имеет функции ограничения скорости, и я хочу сделать это для большого количества адресов (около 3 мил). Сценарий, с другой стороны, не имеет ограничения скорости, что делает их довольно несовместимыми. Можно ли отредактировать этот скрипт так, чтобы он не переходил к следующей ячейке, пока не будет выполнен предыдущий запрос?

    Function MyGeocode(address As String) As String
  Dim strAddress As String
  Dim strQuery As String
  Dim strLatitude As String
  Dim strLongitude As String
  strAddress = URLEncode(address)
  'Assemble the query string
  strQuery = "http://maps.googleapis.com/maps/api/geocode/xml?"
  strQuery = strQuery & "address=" & strAddress
  strQuery = strQuery & "&sensor=false"
  'define XML and HTTP components
  Dim googleResult As New MSXML2.DOMDocument60
  Dim googleService As New MSXML2.XMLHTTP60
  Dim oNodes As MSXML2.IXMLDOMNodeList
  Dim oNode As MSXML2.IXMLDOMNode
  'create HTTP request to query URL - make sure to have
  'that last "False" there for synchronous operation
  googleService.Open "GET", strQuery, False
  googleService.send
  googleResult.LoadXML (googleService.responseText)
  Set oNodes = googleResult.getElementsByTagName("geometry")
  If oNodes.Length = 1 Then
    For Each oNode In oNodes
      strLatitude = oNode.ChildNodes(0).ChildNodes(0).Text
      strLongitude = oNode.ChildNodes(0).ChildNodes(1).Text
      MyGeocode = strLatitude & "," & strLongitude
    Next oNode
  Else
    MyGeocode = "Not Found (try again, you may have done too many too fast)"
  End If
End Function
Public Function URLEncode(StringVal As String, Optional SpaceAsPlus As Boolean = False) As String
  Dim StringLen As Long: StringLen = Len(StringVal)
  If StringLen > 0 Then
    ReDim result(StringLen) As String
    Dim i As Long, CharCode As Integer
    Dim Char As String, Space As String
    If SpaceAsPlus Then Space = "+" Else Space = "%20"
    For i = 1 To StringLen
      Char = Mid$(StringVal, i, 1)
      CharCode = Asc(Char)
      Select Case CharCode
      Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
        result(i) = Char
      Case 32
        result(i) = Space
      Case 0 To 15
        result(i) = "%0" & Hex(CharCode)
      Case Else
        result(i) = "%" & Hex(CharCode)
      End Select
    Next i
    URLEncode = Join(result, "")
  End If
End Function

Любая помощь будет принята с благодарностью, вы, ребята, лучшие!

3 ответа3

1

Размещенный вами код просто сообщает Excel, как запрашивать Карты Google, на самом деле он этого не делает - вам нужно вызвать функцию MyGeocode и сообщить Excel, какие адреса вы хотите запросить.

Сначала нажмите Alt+F11 для доступа к редактору Visual Basic (VBE). Щелкните правой кнопкой мыши имя вашей книги на левой панели и выберите « Вставка» > « Модуль». Вставьте VBA в этот новый модуль.

Для запуска этого кода необходимо добавить ссылку на библиотеку Microsoft XML v6.0 . В VBE щелкните Инструменты > Ссылки, прокрутите вниз и установите флажок рядом с библиотекой. Нажмите ОК.

Теперь вернемся к самому Excel.

Допустим, у вас есть подмножество ваших 3 миллионов адресов в столбцах A:D.

В столбце E объедините все поля вашего адреса, чтобы вы получили полный адрес в одной ячейке:

=A2&" "&B2&" "&C2&" "&D2

Тогда в столбце F мы можем вызвать координаты из Google следующим образом:

=MyGeocode(E2)

Нет необходимости указывать Excel делать паузу между вызовами - вы контролируете это тем, сколько раз вы говорите Excel выполнить =MyGeocode() - т.е. сколько строк в Excel вы копируете формулу вниз.

Чтобы быть в безопасности, выполняйте это не более чем на 2500 линиях в день в соответствии с Условиями использования Google (спасибо Сету), если только вы не готовы потратить немного денег, чтобы увеличить количество звонков, которые вы можете совершать, до 100 000 в день.

0

Если у вас есть три миллиона адресов, возможно, вы захотите получить коммерческий доступ, который позволит вам использовать сервис без ограничения скорости. В противном случае используйте что-то вроде:

Msgbox "Click to go on", , "Example"

Начиная с Условий использования:

д. Ограничения API

Google устанавливает и применяет ограничения на использование вами API (например, ограничение количества запросов API, которые вы можете сделать, или количества пользователей, которых вы можете обслуживать), по нашему собственному усмотрению. Вы соглашаетесь и не будете пытаться обойти такие ограничения, документированные с каждым API. Если вы хотите использовать какой-либо API, выходящий за пределы этих ограничений, вы должны получить явное согласие Google (и Google может отклонить принятие такого запроса или условия по вашему соглашению до дополнительных условий и / или сборов за такое использование). Чтобы получить такое одобрение, свяжитесь с соответствующей командой API Google для получения информации (например, с помощью консоли разработчиков Google).

0

Вы можете заставить VBA остановить программу, скажем, на 5 секунд следующим образом:

Application.Wait(Now + TimeValue("0:00:05")) 

Который может работать для вас

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .