Как я могу заставить скрипт ждать, прежде чем продолжить?

Я нашел этот фантастический сценарий 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

любая помощь будет быть высоко оценили, вы-лучшие!

8
задан CharlieRB
04.12.2022 19:37 Количество просмотров материала 3594
Распечатать страницу

3 ответа

код, который вы разместили просто говорит Excel, как запросить Google Maps, это на самом деле не сделать это-вам нужно вызвать MyGeocode функция и скажите Excel, какие адреса вы хотите запросить.

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

для запуска этого кода Вы нужно добавить ссылку Microsoft XML, v6.0 библиотека. В VBE нажмите Tools > ссылки прокрутите вниз и установите флажок рядом с библиотекой. нажимать OK.

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

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

enter image description here

в столбце E объединить все поля адреса, чтобы получить весь адрес в одном клетка:

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

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

=MyGeocode(E2)

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

чтобы быть безопасным, это не более 2 500 строк в день, чтобы соответствовать Google, T&Cs (спасибо Сету), если вы готовы потратить немного денег, чтобы увеличьте количество звонков до 100 000 в день.

1
отвечен Andi Mohr 2022-12-06 03:25

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

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

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

0
отвечен CallumDA 2022-12-06 05:42

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

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

С условиями использования:

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

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

0
отвечен Seth 2022-12-06 07:59

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх