Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Entfernung zwischen zwei PLZ mit GoogleMaps berechnen! (mit API-Key)
#11
Hallo Tobias,

wenn du Entfernungen und Fahrzeiten berechnen möchtest, dann ist Ditance Matrix API das Richtige. Wie ich das bei meinem Konto aber gesehen habe, bekommt man damit wohl auch automatisch Zugriff auf Geolocation und Geocoding; die funktionieren zumindestens mit meinem Ditance Matrix API.

Viel Erfolg!
Herzliche Grüße aus dem Rheinland
Jörg

[Windows 10, Microsoft 365]
[-] Folgende(r) 1 Nutzer sagt Danke an LuckyJoe für diesen Beitrag:
  • Drolln
Antworten Top
#12
Hallo zusammen,

wollte mal eine Rückmeldung über den augenblicklichen Stand abgeben.

Ich habe die Lösung von @schauan von Beitrag #9 ausprobiert. Da funktioniert aber dann nur die erste Zeile (=Zeile Nr. 6) bei der ein Ergebnis (Spalte K Fahrstrecke) ausgegeben wird. Auch wird nur ein Ergebnis bei Spalte K Fahrstrecke ausgegeben. Die Spalten Breitengrad1, Längengrad1, Breitengrad2, Längengrad2 sowie Luflinie bleiben auch bei Zeile 6 ohne "Zwischenergebnis".

Den API-Key habe ich so verwendet wie in Beitrag #11 vorgeschlagen. Der sollte also da zumindest ein Ergebnis richtig ist auch stimmen.

Aktuell lasse ich über den Google Account noch prüfen wie viele Abfragen bisweilen aufgelaufen sind bei Google mit dem API-Key.
Ich hab so die Vermutung das bei jeder "Enter"-Bestätigung alles neu berechnet wird und somit bei jeder "Enter"-Betätigung einige Abrufe getätigt werden.
Hat sich ja vor der Umstellung zum API-Key ja auch selbständig bei Neueingabe immer aktualisiert.


Gruß
Tobias
Antworten Top
#13
Hallo Tobias,

wenn du mit sich wiederholenden Abfragen arbeitest, bietet sich Lösung #5 bzw. Teilen davon an. Dort werden die Abfragen und Ergebnisse lokal im temp-Verzeichnis abgespeichert. Vor einer Abfrage bei Google wird geprüft, ob die Abfrage schon einmal gemacht wurde und das Ergebnis dann eben aus dem lokalen Speicher genommen.

Der Code stammt aber nicht von mir, die Quelle ist im Kopf angegeben.
Herzliche Grüße aus dem Rheinland
Jörg

[Windows 10, Microsoft 365]
Antworten Top
#14
Hallo zusammen,
hallo @LuckyJoe,

ich habe die Exceldatei (die den Code von Beitrag #5 enthält) zusammen mit meinem API Key abgespeichert.
Code:
Option Explicit
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' zuletzt geändert: 22.10.18                                                                                '
' Sammlung von Funktionen für Google's Geocoding-API                                                        '
' original: http://oco-carbon.com/2012/03/29/google-maps-and-excel-download/                                '
'                                                                                                           '
' Folgende 6 Funktionen stehen zur Verfügung:                                                               '
'   G_Adresse(Ortsangabe)    :  Adresse   des übergebenen Ortes                                             '
'   G_LAT(Ortsangabe)        :  Latitude  des übergebenen Ortes                                             '
'   G_LNG(Ortsangabe)        :  Longitude des übergebenen Ortes                                             '
'   G_LATLNG(Ortsangabe)     :  "Latitude, Longitude" des übergebenen Ortes                                 '
'   G_Dauer(Start, Ziel)     :  Dauer der Reise                                                             '
'   G_Entfernung(Start, Ziel):  Entfernung zwischen Start und Ziel                                          '
' Parameter                                                                                                 '
' Ortsangabe: Kann ein Ortsname, eine PLZ oder ein LAT/LNG-Paar sein                                        '
' Requery   : optionaler Parameter, um eine Nachschau über die API zu erzwingen ohne im Cache nachzusehen   '
' Windows API call, um Excel zu einer bestimmten Ausführungspause (ms) zu zwingen                           '
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#If VBA7 Then
   ' wenn 64bit-Version von Excel
   Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
   ' wenn 32bit-Version von Excel
   Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

' Konstante als Basis für Google API calls
Public Const WAIT_TIME = 50                 ' Millisekunden

' Google-Maps API-Key (ab 08/2018 verpflichtend!)                       '
Public Const GoogleAPIKey = ""

Function G_Adresse(InputLocation As Variant, Optional Requery = False)

   Dim Wait As Long
   Wait = WAIT_TIME

   ' Beim ersten Aufruf nicht warten
   G_Adresse = G_LATLNG(InputLocation, 4)

   ' Bei Verzögerungen Zeitintervall vergrößern
   While (G_Adresse = "OVER_QUERY_LIMIT") And (Wait > 4000)
       G_Adresse = G_LATLNG(InputLocation, 4, Wait)
       Wait = Wait * 2
   Wend

   ' wenn weiterhin Fehlermeldungen, dann ist das Limit der Anfragen für diese IP-Adresse für heute erreicht
   If G_Adresse = "OVER_QUERY_LIMIT" Then
       G_Adresse = "OVER_HARD_QUERY_LIMIT"
   End If

End Function

Function G_LAT(InputLocation As Variant, Optional Requery = False)
' Gibt die Latitude einer Ortsangabe durch Googles Geocoding-API zurück

   Dim Wait As Long
   Wait = WAIT_TIME

   ' Beim ersten Aufruf nicht warten
   G_LAT = G_LATLNG(InputLocation, 2)

   ' Bei Verzögerungen Zeitintervall vergrößern
   While (G_LAT = "OVER_QUERY_LIMIT") And (Wait > 4000)
       G_LAT = G_LATLNG(InputLocation, 2, Wait)
       Wait = Wait * 2
   Wend

   ' wenn weiterhin Fehlermeldungen, dann ist das Limit der Anfragen für diese IP-Adresse für heute erreicht
   If G_LAT = "OVER_QUERY_LIMIT" Then
       G_LAT = "OVER_HARD_QUERY_LIMIT"
   End If

End Function

Function G_LNG(InputLocation As Variant, Optional Requery = False)
' Gibt die Longitude einer Ortsangabe durch Googles Geocoding-API zurück

   Dim Wait As Long
   Wait = WAIT_TIME

   ' Beim ersten Aufruf nicht warten
   G_LNG = G_LATLNG(InputLocation, 3)

   ' Bei Verzögerungen Zeitintervall vergrößern
   While (G_LNG = "OVER_QUERY_LIMIT") And (Wait > 4000)
       G_LNG = G_LATLNG(InputLocation, 3, Wait)
       Wait = Wait * 2
   Wend

   ' wenn weiterhin Fehlermeldungen, dann ist das Limit der Anfragen für diese IP-Adresse für heute erreicht
   If G_LNG = "OVER_QUERY_LIMIT" Then
       G_LNG = "OVER_HARD_QUERY_LIMIT"
   End If

End Function

Function G_LATLNG(InputLocation As Variant, Optional N As Long = 1, Optional Wait As Long, Optional Requery As Boolean = False) As Variant
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' Aufruf aus  : unterschiedlichen Zellen (Funktion!)                                                        '
' Aufruf über :                                                                                             '
' Vorbereitung: Referenz zu Microsoft XML, v6.0 erforderlich (vgl. VBA-Editor: "Extras - Verweise")!        '
' Beschreibung: Der Parameter "N" gibt folgende Rückgabetypen an:                                           '
'               N = 1 -> gibt Latitude, Longitude als "string"                                              '
'               N = 2 -> gibt Latitude            als "double"                                              '
'               N = 3 -> gibt Longitude           als "double"                                              '
'               N = 4 -> gibt die Addresse        als "string"                                              '
'               Update vom 30.10.12                                                                         '
'               - gibt "#N/A error" zurück, wenn ein Fehler auftaucht                                       '
'               - Cache nur verwenden, wenn notwendig                                                       '
'               - prüfen und versuchen, Fehler zu korrigieren                                               '
'               - funktioniert auf Systemen mit Komma als Dezimaltrenner                                    '
' geändert    : 22.10.18                                                                                    '
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   Dim myRequest   As XMLHTTP60
   Dim myDomDoc    As DOMDocument60
   Dim addressNode As IXMLDOMNode
   Dim latNode     As IXMLDOMNode
   Dim lngNode     As IXMLDOMNode
   Dim statusNode  As IXMLDOMNode
   Dim CachedFile  As String
   Dim NoCache     As Boolean
   Dim V()         As String       ' im original als "Variant"

   On Error GoTo exitRoute
   G_LATLNG = CVErr(xlErrNA)    ' gibt "#N/A Fehler" im Falle irgendeines Fehlers
   ReDim V(1 To 4)

   ' Prüfen und Eingabe löschen
   If WorksheetFunction.IsNumber(InputLocation) Or IsEmpty(InputLocation) Or InputLocation = "" Then GoTo exitRoute
   Sleep (Wait)

   InputLocation = URLEncode(CStr(InputLocation), True)

   ' Prüfe, ob eine "gecachte" Datei existiert
   CachedFile = Environ("temp") & "\" & InputLocation & "_LatLng.xml"
   NoCache = (Len(Dir(CachedFile)) = 0)

   Set myRequest = New XMLHTTP60

   If NoCache Or Requery Then  ' wenn kein Cache oder wenn Anfrage an Google erzwungen, dann Google fragen
       Sleep (Wait)

       ' XML-Daten von Google Maps API auslesen
       ' Alte Version bis 07/2018:
       ' myRequest.Open "GET", "http://maps.googleapis.com/maps/api/geocode/xml?address=" & InputLocation & "&sensor=false", False
       ' Neue Version ab 08/2018:
       myRequest.Open "GET", "https://maps.googleapis.com/maps/api/geocode/xml" & _
           "?address=" & InputLocation & _
           "&key=" & GoogleAPIKey & _
           "&sensor=false", False
       myRequest.Send

       ' XML lesbar machen durch "XPath"
       Set myDomDoc = New DOMDocument60
       myDomDoc.LoadXML myRequest.responseText

   Else ' ansonsten Anfrage im Cache recherchieren
       myRequest.Open "GET", CachedFile
       myRequest.Send

       ' XML lesbar machen durch "XPath"
       Set myDomDoc = New DOMDocument60
       myDomDoc.LoadXML myRequest.responseText

       ' Prüfe den Status-Code der gecachten XLM-Datei (bei früheren Fehlern)
       Set statusNode = myDomDoc.SelectSingleNode("//status")
       If statusNode Is Nothing Then                           ' eine fehlerhafte Datei wurde möglicherweise gecached
           G_LATLNG = G_LATLNG(InputLocation, N, True)         ' rekursiv untersuchen, um Fehler zu finden
           Exit Function
       ElseIf statusNode.Text <> "OK" Then                     ' eine Datei ohne Resultat wurde gecached
           G_LATLNG = G_LATLNG(InputLocation, N, True)         ' rekursiv versuchen, Fehler zu löschen
           Exit Function
       End If

   End If

   Set statusNode = myDomDoc.SelectSingleNode("//status")
   If statusNode.Text = "OK" Then
       Set addressNode = myDomDoc.SelectSingleNode("//result/formatted_address")   ' Örtlichkeit holen
       Set latNode = myDomDoc.SelectSingleNode("//result/geometry/location/lat")   ' Latitude holen
       Set lngNode = myDomDoc.SelectSingleNode("//result/geometry/location/lng")   ' Longitude holen
       V(1) = latNode.Text & "," & lngNode.Text
       V(2) = latNode.Text                                                         ' im original als double: V(2) = Val(latNode.Text)
       V(3) = lngNode.Text                                                         ' im original als double: V(3) = Val(lngNode.Text)
       V(4) = addressNode.Text
       G_LATLNG = V(N)
       If NoCache Then                                                             ' cache API-Antwort, falls erforderlich
           Call CreateFile(CachedFile, myRequest.responseText)
       End If
   Else
       G_LATLNG = statusNode.Text
   End If

exitRoute:
   Set addressNode = Nothing
   Set statusNode = Nothing
   Set latNode = Nothing
   Set lngNode = Nothing
   Set myDomDoc = Nothing
   Set myRequest = Nothing

End Function

Function G_Entfernung(Origin As String, Destination As String, Optional Requery As Boolean = False) As Variant
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' Aufruf aus  : unterschiedlichen Zellen (Funktion!)                                                        '
' Aufruf über :                                                                                             '
' Vorbereitung: Referenz zu Microsoft XML, v6.0 erforderlich (vgl. VBA-Editor: "Extras - Verweise")!        '
' Beschreibung: Berechnet die Entfernung (km) zwischen "Origin" und "Destination"                           '
' geändert    : 22.10.18                                                                                    '
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   Dim myRequest       As XMLHTTP60
   Dim myDomDoc        As DOMDocument60
   Dim distanceNode    As IXMLDOMNode
   Dim statusNode      As IXMLDOMNode
   Dim CachedFile      As String
   Dim NoCache         As Boolean

   On Error GoTo exitRoute
   G_Entfernung = CVErr(xlErrNA)         ' gibt "#N/A-Fehler" bei irgendeinem Fehler zurück

   ' Prüfen, ob Start/Ziel existieren
   If WorksheetFunction.IsNumber(Origin) Or IsEmpty(Origin) Or Origin = "" Then GoTo exitRoute
   If WorksheetFunction.IsNumber(Destination) Or IsEmpty(Destination) Or Destination = "" Then GoTo exitRoute

   ' Start/Ziel "URL-lesbar" machen
   Origin = URLEncode(CStr(Origin), True)
   Destination = URLEncode(CStr(Destination), True)

   ' Prüfe, ob es eine gecachete Version gibt
   CachedFile = Environ("temp") & "\" & Origin & "_" & Destination & "_Dist.xml"
   NoCache = (Len(Dir(CachedFile)) = 0)

   Set myRequest = New XMLHTTP60

   If NoCache Or Requery Then          ' wenn keine gecachete Version existiert, Anfrage an Google
       ' Alte Version bis 07/2018:
       ' myRequest.Open "GET", "http://maps.googleapis.com/maps/api/directions/xml?origin=" & Origin & "&destination=" & Destination & "&sensor=false", False
       ' Neue Version ab 08/2018:
       myRequest.Open "GET", "https://maps.googleapis.com/maps/api/directions/xml" & _
           "?origin=" & Origin & _
           "&destination=" & Destination & _
           "&key=" & GoogleAPIKey & _
           "&sensor=false", False
       myRequest.Send
   Else                                ' sonst lese die Anfrage aus der Temp-Datei
       myRequest.Open "GET", CachedFile
       myRequest.Send
       Set myDomDoc = New DOMDocument60
       myDomDoc.LoadXML myRequest.responseText
       Set statusNode = myDomDoc.SelectSingleNode("//status")
       If Not statusNode.Text = "OK" Then
           Call G_Entfernung(Origin, Destination, True)                        ' rekursiv versuchen, Fehler zu löschen
       End If
   End If

   ' Macht die XML lesbar mittels XPath
   Set myDomDoc = New DOMDocument60
   myDomDoc.LoadXML myRequest.responseText
   Set statusNode = myDomDoc.SelectSingleNode("//status")

   If statusNode.Text = "OK" Then
       If NoCache Then
           Call CreateFile(CachedFile, myRequest.responseText)                 ' API cachen, wenn erforderlich
       End If
       Set distanceNode = myDomDoc.SelectSingleNode("//leg/distance/value")    ' Entfernung holen
       If Not distanceNode Is Nothing Then
           G_Entfernung = Val(distanceNode.Text) / 1000
       End If
   Else
       G_Entfernung = statusNode.Text
   End If

exitRoute:
   Set statusNode = Nothing
   Set statusNode = Nothing
   Set distanceNode = Nothing
   Set myDomDoc = Nothing
   Set myRequest = Nothing

End Function

Function G_Dauer(Origin As String, Destination As String, Optional Requery As Boolean = False) As Variant
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' Aufruf aus  : unterschiedlichen Zellen (Funktion!)                                                        '
' Aufruf über :                                                                                             '
' Vorbereitung: Referenz zu Microsoft XML, v6.0 erforderlich (vgl. VBA-Editor: "Extras - Verweise")!        '
' Beschreibung: Berechnet die Auto-Fahrzeit (hh:mm) für die Strecke zwischen "Origin" und "Destination"     '
' geändert    : 22.10.18                                                                                    '
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   Dim myRequest       As XMLHTTP60
   Dim myDomDoc        As DOMDocument60
   Dim durationNode    As IXMLDOMNode
   Dim statusNode      As IXMLDOMNode
   Dim CachedFile      As String
   Dim NoCache         As Boolean

   On Error GoTo exitRoute
   G_Dauer = CVErr(xlErrNA)     ' gibt "#N/A-Fehler" bei irgendeinem Fehler zurück

   ' Prüfen, ob Start/Ziel existieren
   If WorksheetFunction.IsNumber(Origin) Or IsEmpty(Origin) Or Origin = "" Then GoTo exitRoute
   If WorksheetFunction.IsNumber(Destination) Or IsEmpty(Destination) Or Destination = "" Then GoTo exitRoute

   ' Start/Ziel "URL-lesbar" machen
   Origin = ConvertAccent(URLEncode(CStr(Origin), True))
   Destination = ConvertAccent(URLEncode(CStr(Destination), True))

   ' Prüfe, ob es eine gecachete Version gibt
   CachedFile = Environ("temp") & "\" & Origin & "_" & Destination & "_Dist.xml"
   NoCache = (Len(Dir(CachedFile)) = 0)

   Set myRequest = New XMLHTTP60

   If NoCache Or Requery Then          ' wenn keine gecachete Version existiert, Anfrage an Google
       ' Alte Version bis 07/2018:
       ' myRequest.Open "GET", "http://maps.googleapis.com/maps/api/directions/xml?origin=" & Origin & "&destination=" & Destination & "&sensor=false", False
       ' Neue Version ab 08/2018:
       myRequest.Open "GET", "http://maps.googleapis.com/maps/api/directions/xml" & _
           "?origin=" & Origin & _
           "&destination=" & Destination & _
           "&key=" & GoogleAPIKey & _
           "&sensor=false", False
       myRequest.Send
   Else                                ' sonst lese die Anfrage aus der Temp-Datei
       myRequest.Open "GET", CachedFile
       myRequest.Send
       Set myDomDoc = New DOMDocument60
       myDomDoc.LoadXML myRequest.responseText
       Set statusNode = myDomDoc.SelectSingleNode("//status")
       If Not statusNode.Text = "OK" Then
           Call G_Dauer(Origin, Destination, True)                             ' rekursiv versuchen, Fehler zu löschen
       End If
   End If

   ' Macht die XML lesbar mittels XPath
   Set myDomDoc = New DOMDocument60
   myDomDoc.LoadXML myRequest.responseText
   Set statusNode = myDomDoc.SelectSingleNode("//status")
   If statusNode.Text = "OK" Then
       If NoCache Then
           Call CreateFile(CachedFile, myRequest.responseText)                 ' API cachen, wenn erforderlich
       End If
       Set durationNode = myDomDoc.SelectSingleNode("//leg/duration/value")    ' Reisedauer holen
       If Not durationNode Is Nothing Then
           G_Dauer = Val(durationNode.Text) / 86400                            ' im original stand hier "1000" (???)
       End If
   End If

exitRoute:
   Set statusNode = Nothing
   Set durationNode = Nothing
   Set myDomDoc = Nothing
   Set myRequest = Nothing

End Function

Public Function URLEncode(StringVal As String, Optional SpaceAsPlus As Boolean = False) As String

   Dim StringLen As Long
   Dim i As Long
   Dim CharCode As Integer
   Dim Char As String
   Dim Space As String

   StringVal = ConvertAccent(StringVal)
   StringLen = Len(StringVal)
   If StringLen > 0 Then
       ReDim result(StringLen) As String
       Space = IIf(SpaceAsPlus, "+", "%20")
       For i = 1 To StringLen
           Char = Mid$(StringVal, i, 1)
           CharCode = Asc(Char)
           Select Case CharCode
               Case 45, 46, 48 To 57, 61, 65 To 90, 95, 97 To 122, 123, 125, 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
       URLEncode = Join(result, "")
   End If

End Function

Function ConvertAccent(ByVal inputString As String) As String
' Code originally from Rick Rothstein, posted on
' http://www.jpsoftwaretech.com/remove-and-replace-special-characters-in-vba/
' Handling of German characters contributed by Gabor

   Dim x As Long
   Dim Position As Long

   Const AccChars      As String = "ߊŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåç©èéêëìíîïðñòóôõößùúûüýÿ©"
   Const RegChars      As String = "sSZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaacceeeeiiiidnooooosuuuuyyc"
   Const DeAccChars    As String = "ÄÖÜäöü"

   For x = 1 To Len(inputString)
       Position = InStr(AccChars, Mid(inputString, x, 1))
       If Position Then
           If InStr("ß", Mid(inputString, x, 1)) Then
               inputString = Left(inputString, x) & "s" & Right(inputString, Len(inputString) - x)
           End If
           If InStr(DeAccChars, Mid(inputString, x, 1)) Then
               inputString = Left(inputString, x) & "e" & Right(inputString, Len(inputString) - x)
           End If
           Mid(inputString, x) = Mid(RegChars, Position, 1)
       End If
   Next
   ConvertAccent = inputString

End Function

Function CreateFile(FileName As String, Contents As String) As String
' Neue Datei erzeugen und Inhalt speichern

   Dim fsT As Object

   Set fsT = CreateObject("ADODB.Stream")
   With fsT
       .Type = 2                   ' Streamtype ermitteln: text/string data speichern
       .Charset = "utf-8"          ' Charset UTF-8 für die Quelltexte
       .Open                       ' Stream öffnen und Binärdaten schreiben
       .WriteText Contents         ' Textdaten schreiben
       .SaveToFile FileName, 2     ' Binärdaten speichern
   End With
   Set fsT = Nothing

End Function

Sub DeleteFile(ByVal FileToDelete As String)
' Datei löschen

   If FileOrDirExists(FileToDelete) Then
       SetAttr FileToDelete, vbNormal
       Kill FileToDelete
   End If

End Sub

Function FileOrDirExists(PathName As String) As Boolean
' Hinweis:  gibt WAHR zurück, wenn Datei oder Pfad existiert, sonst FALSCH

   Dim iTemp As Integer

   On Error Resume Next

   iTemp = GetAttr(PathName)
   Select Case Err.Number
   Case Is = 0
       FileOrDirExists = True
   Case Else
       FileOrDirExists = False
   End Select

   On Error GoTo 0

End Function

Die verschiedenen Spalten die dann Ergebnisse ausspucken sollten haben aber immer noch den gleichen Wert wie vorher.

Mache ich jetzt A) was falsch? Benötigt die Funktion einen Aufruf um zu funktionieren oder geht das komplett selbstständig nach Enter durch Eingabe? Ausführen/Debuggen lässt sich das ja nicht da ich hierfür einen Makronamen benötige.
Oder ist B) der API Key lediglich für diese Anwendung falsch?

Mit der "alten" Exceltabelle habe ich ja auch eine Lösung mit dem API Key erhalten. Aber nur in einer Zeile.


Gruß
Tobias


Angehängte Dateien
.xls   GoogleAPI-Beispiel.xls (Größe: 70,5 KB / Downloads: 87)
Antworten Top
#15
Hallo Tobias,

hast du deinen API-Key an der richtigen Stelle eingefügt? In dem Beispielcode also Zeile 31:

Code:
Public Const GoogleAPIKey = "###"   ' <-- statt "###" dein API-Code

Dann sollte es funktionieren. Probiere mal, in einer der Zellen F2 und anschließend RETURN zu drücken, womit du die Funktionsaufrufe auslöst. Bei mir berechnet er jede Zelle und wirft entsprechende Ergebnisse aus.

Viel Erfolg.
Herzliche Grüße aus dem Rheinland
Jörg

[Windows 10, Microsoft 365]
Antworten Top
#16
Hallo LuckyJoe,

der API Key ist an der richtigen Stelle eingetragen.

F2 und Enter liefert auch kein anderes Ergebnis.
Es steht in jeder Zelle "REQUEST DENIED" und bei Fahrtzeit Start-Ziel "#NV"


Gruß
Tobias
Antworten Top
#17
Hi,

der Hinweis deutet auf einen falschen API-Key hin; da weiß ich nicht mehr weiter - sorry.
Herzliche Grüße aus dem Rheinland
Jörg

[Windows 10, Microsoft 365]
Antworten Top
#18
Hallo zusammen!

Habe jetzt nochmal nachgefragt wie die API erstellt wurde.

Kurze Erklärung zur Erstellung einer API:
Unter Google "Google Maps Platform" eingeben und das erste Ergebnis dann anklicken.
Oben rechts anmelden mit Benutzernamen/gmail.com-Email und Passwort.
Im nächsten Schritt oben rechts links neben Anmelden "Konsole" anklicken.
Nun erscheinen alle möglichen API-Keys (14 Stück) die man aktivieren kann (es nutzen alle den gleichen API-Key)
- Directions API
- Distance Matrix API
- Geocoding API
- Geolocation API
- Maps Elevation API
- Maps Embed API
- Maps JavaScript API
- Maps SDK for Android
- Maps SDK for iOS
- Maps Static API
- Places API
- Roads API
- Street View Static API
- Time Zone API
Ich habe alle aktiviert und dann an der Exceldatei mittels F2 und Enter Abfragen gestellt.
Da nach einer Stunde Aktivität nur Directions API, Distance Matrix API und Geocoding API Abrufe aufweisen konnten habe ich die anderen elf wieder deaktiviert.
Dabei habe ich auch festgestellt, dass Spielereien in der Exceldatei um 9:00 Uhr nach erstmaliger Aktivierung des API-Keys (Directions API und Geocoding API) gegen 10:00 Uhr auch im Protokoll mit erfasst wurden.
Als ersten API-Key hatte ich nur Distance Matrix API genutzt.
Der Hinweis, dass die Geocoding API notwendig ist steht zum Beispiel im Code.
Wenn man alle APIs jedoch nicht kennt kann man schlecht einen Zusammenhang herstellen.

Ergebnis nach jetzigem Stand:
Es stehen teilweise Ergebnisse in den Zellen.
Dies aber nur vereinzelt.
Ich hab die erste Zelle auf weitere Zellen erweitert und mehrere Adressen eingegeben.
Vielleicht könnte dies auch einer versuchen wie es bei ihm mit mehreren Zellen funktioniert.

Ich hatte nach einer Stunde bei...
Direktions API: 153 Abfragen und 145 Fehler
Distance Matrix API: 388 Abfragen und 385 Fehler (von vor paar Wochen aber auch was dabei)
Geocoding API: 514 Abfragen und 494 Fehler
(Sieht man unter der Google Plattform)


Vielleicht probiert jemand die Schritte aus und gibt Rückmeldung.
Wäre dankbar.


Gruß
Tobias
Antworten Top
#19
Hallo zusammen,

ich versuche für eine Freundin, welche noch weniger Ahnung von Excel, hat eine Datei zu erstellen, womit sie durch einfach Eingabe einer Funktion (z.B. =Entfernung) die Entfernung bzw. die Fahrdauer berechnen kann.

Ich habe mich jetzt durch alle möglichen Foren gelesen und hoffe, dass man mir hier helfen kann.

Ich habe den Code aus #14 in VBA in ein Modul eingefügt und meinen eigenen API-Schlüssel eingetragen.

Nun wollte ich Probeweise einfach mal die Entfernung zwischen Berlin und München berechen (A1 und B1). In C1 habe ich die Formel =G_Entfernung eingeben (Origin=A1 und Destination=B1).

Mir wird dann folgender Fehler angezeigt:
[url=
Dateiupload bitte im Forum! So geht es: Klick mich!
]


Ich habe es auch schon mit den Codes auf dieser Seite versucht auch ohne Erfolg, da als Ergebnis immer -1 heraus kommt:
https://analystcave.com/excel-calculate-...addresses/

Nun meine Fragen:

Was mache ich falsch?
Habe ich grundlegende Schritte vergessen?
Brauche ich bestimmte Voraussetzungen?

Bin echt am verzweifeln :29:
Ich hoffe ich auf eure Hilfe und bedanke mich jetzt schon mal Smile


Viele Grüße
bentzer

Hier das Bild des Fehlers:

   
Antworten Top
#20
Hallo,

klicke im Visual-Basic-Fenster (da, wo deine Fehlermeldung erscheint) auf "Extras" und dort auf "Verweise". Klick' dann in dem Fenster an "Microsoft XML, v6.0" und bestätige mit "OK". Dann wiederhole deine Suche noch einmal.

Viel Erfolg.
Herzliche Grüße aus dem Rheinland
Jörg

[Windows 10, Microsoft 365]
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste