Wie kann ich ein Skript warten lassen, bevor es fortfährt?

Wie kann ich ein Skript warten lassen, bevor es fortfährt?

Ich habe dieses fantastische VBA-Skript gefunden, das eine Adresse entgegennimmt und den Breiten- und Längengrad mithilfe der Google Maps-API zurückgibt. Google verfügt jedoch über geschwindigkeitsbegrenzende Funktionen, und ich möchte dies für eine große Anzahl von Adressen (ca. 3 Mio.) tun. Das Skript hingegen verfügt über keine geschwindigkeitsbegrenzenden Funktionen, was sie ziemlich inkompatibel macht. Ist es möglich, dieses Skript so zu bearbeiten, dass es nicht zur nächsten Zelle übergeht, bis die vorherige Anforderung abgeschlossen ist?

    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

Ich wäre für jede Hilfe sehr dankbar, ihr seid die Besten!

Antwort1

Der von Ihnen gepostete Code teilt Excel lediglich mit, wie Google Maps abgefragt werden soll. Er führt die Abfrage jedoch nicht tatsächlich aus. Sie müssen die MyGeocodeFunktion aufrufen und Excel mitteilen, welche Adressen Sie abfragen möchten.

Drücken Sie zunächst Alt+, F11um auf den Visual Basic Editor (VBE) zuzugreifen. Klicken Sie mit der rechten Maustaste auf den Namen Ihrer Arbeitsmappe im linken Bereich und wählen SieEinfügen>Modul. Fügen Sie das VBA in dieses neue Modul ein.

Um diesen Code auszuführen, müssen Sie einen Verweis auf dieMicrosoft XML, v6.0Bibliothek. Klicken Sie in der VBE aufWerkzeuge>Verweise, scrollen Sie nach unten und aktivieren Sie das Kontrollkästchen neben der Bibliothek. Klicken Sie auf „OK“.

Nun zurück zu Excel selbst.

Nehmen wir an, Sie haben eine Teilmenge Ihrer 3 Millionen Adressen in den Spalten A:D.

Bildbeschreibung hier eingeben

Verketten Sie in Spalte E alle Ihre Adressfelder, sodass Sie die gesamte Adresse in einer Zelle erhalten:

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

In Spalte F können wir dann die Koordinaten von Google wie folgt abrufen:

=MyGeocode(E2)

Sie müssen Excel nicht anweisen, zwischen den Aufrufen eine Pause einzulegen. Dies steuern Sie durch die Häufigkeit, =MyGeocode()mit der Sie Excel anweisen, die Formel nach unten zu kopieren.

Führen Sie dies zur Sicherheit auf nicht mehr als 2.500 Zeilen pro Tag aus, um dieAGB von Google(danke, Seth), es sei denn, Sie sind bereit, etwas Geld auszugeben, um die Anzahl der Anrufe, die Sie tätigen können, auf 100.000 pro Tag zu erhöhen.

Antwort2

Sie können VBA dazu bringen, ein Programm beispielsweise für 5 Sekunden anzuhalten, indem Sie es wie folgt vorgehen:

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

Was für Sie funktionieren könnte

Antwort3

Wenn Sie über drei Millionen Adressen verfügen, sollten Sie einen kommerziellen Zugang in Betracht ziehen, der Ihnen die Nutzung des Dienstes ohne Ratenbegrenzung ermöglicht. Andernfalls verwenden Sie etwas wie:

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

Ab demNutzungsbedingungen:

d. API-Einschränkungen

Google legt nach eigenem Ermessen Beschränkungen für Ihre Nutzung der APIs fest und setzt diese durch (z. B. Begrenzung der Anzahl der API-Anfragen, die Sie stellen können, oder der Anzahl der Benutzer, die Sie bedienen können). Sie stimmen diesen mit jeder API dokumentierten Beschränkungen zu und werden nicht versuchen, diese zu umgehen. Wenn Sie eine API über diese Beschränkungen hinaus verwenden möchten, müssen Sie die ausdrückliche Zustimmung von Google einholen (und Google kann eine solche Anfrage ablehnen oder Ihre Zustimmung von Ihrer Zustimmung zu zusätzlichen Bedingungen und/oder Gebühren für diese Nutzung abhängig machen). Um eine solche Genehmigung einzuholen, wenden Sie sich für weitere Informationen an das entsprechende Google API-Team (z. B. über die Google-Entwicklerkonsole).

verwandte Informationen