MS-Office-Forum
Google
   

Zurück   MS-Office-Forum > Microsoft Office > Microsoft Excel
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads Der Renner, 11 Entwicklertools für Access, Tipps & Trick und offene Datenbanken zum einzigartigen Preis.
Themen-Optionen Ansicht
Alt 21.01.2018, 17:29   #1
WS-53
MOF Koryphäe
MOF Koryphäe
Standard VBA - Routenplanung mit Google

Hallo,

mit der Referenz: http://www.clever-excel-forum.de/Thr...rechnen?page=9 Post #74

habe ich einen VBA-Code gefunden, den ich an meine Bedürfnisse und Tabellenstruktur angepasst habe. Das klappt auch soweit ganz gut.

Wenn ich mir dann aber die Liste der nicht gefundenen Routen anschaue, dann liegt es zum Teil an nicht korrekten Adressen.

Zum Teil sind es aber auch Adressen, die von Google.de/maps als richtig erkannt werden, aber von: maps.googleapis.com/maps/api/distancematrix/xml?origins= mit den Meldungen:

INVALID_REQUEST Invalid request. Invalid 'destinations' parameter. bzw.
INVALID_REQUEST Invalid request. Invalid 'origins' parameter.

je nach dem, ob die nicht erkannte Adresse als Start oder Ziel übermittelt wurde, zurückgewiesen wird.

Hiier ein Beispiel einer Adresse, die von Goggle Maps als korrekt erkannt wird, aber die Makroabfrage den genannten Fehlertext generiert.

64859 Eppertshausen, Röntgenstraße 2

Hier noch der komplette Makrocode:

Code:

Public Sub Google_Distanzen_berechnen()

'Referenz: http://www.clever-excel-forum.de/Thread-Entfernung-zwischen-zwei-PLZ-mit-GoogleMaps-berechnen?page=9
'          Post #74

'Variablendeklarastionen
'Objekt - Late Binding
Dim objXML As Object 'fuer XML-"String"
Dim xmlDoc As Object
Dim xmlNod As Object
Dim xml_duration As Object
Dim dauer As String
Dim error_counter As Long
Dim counter As Long
Dim session_limit As Long
Dim strOAddr$, strDAddr
Dim iCnt1 As Long, iCnt2%, iCnt3%, iCnt4%

On Error GoTo errorhandler

'Flackern aus
'Application.ScreenUpdating = False

iCnt3 = Sheets("Prog-info").Range("B13").Value

'XML-Objecte instanzieren
Set objXML = CreateObject("Msxml2.XMLHTTP")
Set xmlDoc = CreateObject("MSXML2.DOMDocument")
'Wenn Instanzierung nicht nichts gebracht hat, dann
If Not objXML Is Nothing Then

session_limit = Sheets("Cover").Range("K19")

If session_limit > 5000 Then
   session_limit = 5000
End If

Do While Sheets("Strecken").Range("A" & iCnt3) <> ""
 
'  Berechnung nur, wenn noch keine Distanz vorhanden ist
   If Sheets("Strecken").Range("G" & iCnt3) = "" Then
    strOAddr = Sheets("Strecken").Range("D" & iCnt3)
    strDAddr = Sheets("Strecken").Range("E" & iCnt3)
   
    objXML.Open "POST", "http://maps.googleapis.com/maps/api/distancematrix/xml?origins=" & strOAddr & ",germany&&destinations=" & strDAddr & ",germany&&language=de-DE&sensor=false", False
    objXML.setRequestHeader "Content-Type", "content=text/html; charset=UTF-8"
   
   'Abfrage senden
    objXML.send

'    On Error GoTo 0
   
   'Abfrageergebnis (Text) aufnehmen
    xmlDoc.LoadXML objXML.responseText
   
    If Err.Number = 0 Then
'      Entfernung auslesen /Value=Meter /Text = Kilometer mit Angabe "km"
       Set xmlNod = xmlDoc.SelectSingleNode("//row/element/distance/value")

'      Entfernung in km zelle eintragen, Rueckgabewert / 1000
       If xmlNod Is Nothing Then
          Sheets("Strecken").Range("G" & iCnt3) = 9999
          Sheets("Strecken").Range("K" & iCnt3) = xmlDoc.Text
          error_counter = error_counter + 1
       Else
          Sheets("Strecken").Range("L" & iCnt3) = xmlDoc.Text
          Sheets("Strecken").Range("G" & iCnt3) = xmlNod.Text / 1000
'         Dauer ermitteln
          Set xml_duration = xmlDoc.SelectSingleNode("//row/element/duration/value")
          dauer = xml_duration.Text
          Sheets("Strecken").Range("H" & iCnt3) = dauer / 86400
          Sheets("Strecken").Range("I" & iCnt3) = Now
          counter = counter + 1
       End If
    Else
       error_counter = error_counter + 1
'      Distanz füllen, damit nicht beim nächsten Durchlauf automatisch neu ermittelt wird.
       Sheets("Strecken").Range("G" & iCnt3) = 9999
       Sheets("Strecken").Range("I" & iCnt3) = Now
       Sheets("Strecken").Range("J" & iCnt3) = Err.Number
       Sheets("Strecken").Range("K" & iCnt3) = Err.Description
    End If
   End If

   If error_counter > 99 Then
      MsgBox "Abbruch nach 100 Fehlermeldungen " & vbLf & _
             "Siehe Fehlertexte im Tabellenblatt ""STRECKEN"" " & vbLf & _
             "Wenn Fehler behoben, ""9999"" in Spalte G löschen, " & vbLf & _
             "damit Zeil beim nächsten Lauf berücksichtigt wird!" & vbLf
      GoTo while_exit
   End If
   
   'Endzaehler hochsetzen
   iCnt3 = iCnt3 + 1
  'Ende Tue solange Zellinhalt nicht leer

   If counter >= session_limit Then
      GoTo errorhandler
   End If
   
  Loop
'Ende Wenn Instanzierung nicht nichts gebracht hat, dann
End If

'Fehlerbehandlung / Programmende
errorhandler:
'Flackern ein
Application.ScreenUpdating = True

'Wenn Fehlernummer <> 0, dann Ausgabe Fehlermeldung
If Err.Number <> 0 Then
   MsgBox "Fehler: " & Err.Number & vbLf & Err.Description
   GoTo ende
End If

while_exit:
Application.ScreenUpdating = True

ende:
'XML-Objecte zuruecksetzen
 Set xmlNod = Nothing
 Set xmlDoc = Nothing
 Set objXML = Nothing
 
End Sub
Das besondere an diesem Code ist, dass bei jedem Durchlauf immer nur die Routenermittlung für die von/nach-Kombinationen durchgeführt wird, für die bisher noch keine Routenermittlung durchgeführt wurde.

Denn so kann, auf mehrere Tage aufgeteilt, für bspw. 100 (z.B. AD-Mitarbeiter) Ziele, zu denen ich alle von/nach-Kombinationen benötige, die gesamte Liste aufgebaut werden.

Aber die Frage ist, wer hat eine Erklärung für das unterschiedliche Verhalten und eventuell auch eine Idee, wie das Problem behoben werden kann.

__________________

VG, WS-53


>>> Ein Spezialist kann nicht viel, dies aber gut. Die Steigerung ist, noch weniger noch besser zu können. Die Krönung ist, nichts zu können, aber darin perfekt zu sein! Es gibt aber auch Naturtalente, die überspringen die Ersten beiden Stufen. <<<

Übrigens, Feedback, egal welcher Art, ist immer hilfreich. Und erledigte Beiträge sollten auch den Status "erledigt" erhalten.
WS-53 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 25.01.2018, 10:04   #2
WS-53
Threadstarter Threadstarter
MOF Koryphäe
MOF Koryphäe
Standard

Hallo,

die genannte Referenz war insofern falsch, da der von mir als Basis verwendete Code unter #8 zu finden ist.

Aber eigentlich will ich nur mitteilen, dass ich das Problem lösen konnte. Mir war zwar aufgefallen, dass in der genannten Adresse ein Umlaut enthalten ist, aber ohne es zu prüfen, war ich mir sicher, dass in einigen der anderen Adressen, mit denen die Distanzberechnung einwandfrei funktionierte, auch Umlaute enthalten waren.

Aber in meinem Datenbestand von rund 130 Adressen sind tatsächlich nur 3 Adressen mit Umlauten oder "ß" enthalten. Und nur mit diese Adressen gab es Probleme bei der Verwendung der
maps.googleapis.com/maps/api/distancematrix
Durch Einbindung der Funktion

Code:

Function ReplaceUmlaute(ByVal strText As String) As String
'Funktion ersetzt deutsche Umlaute
'Variablendeklaration
'Integer
Dim iCnt%

'Array
Dim arrRep
'Array mit Umlauten und Replacements definieren
arrRep = Array("Ö", "Oe", "ö", "oe", "Ä", "Ae", "ä", "ae", "Ü", "Ue", "ü", "ue", "ß", "ss")
'Schleife von 0 bis Ende vom Array, Schrittweite 2
For iCnt = 0 To UBound(arrRep) Step 2
  'Umlaut mit Replacement ersetzen
  strText = Replace(strText, arrRep(iCnt), arrRep(iCnt + 1))
'Ende Schleife von 0 bis Ende vom Array, Schrittweite 2
Next

ReplaceUmlaute = strText

End Function
Konnte ich das Problem somit lösen.

Die Befüllung der Übergabeparameter habe ich dann von

Code:

    strOAddr = Sheets("Strecken").Range("D" & iCnt3)
    strDAddr = Sheets("Strecken").Range("E" & iCnt3)
In

Code:

    strOAddr = ReplaceUmlaute(Sheets("Strecken").Range("D" & iCnt3))
    strDAddr = ReplaceUmlaute(Sheets("Strecken").Range("E" & iCnt3))
geändert. Wobei ich es schon als genial empfinde, dass ich eine Funktion aufrufen und zugleich als Rückgabewert verwenden kann.

Das war mir neu. Aber nachdem ich mir die Funktion angeschaut hatte, hatte ich keine andere Möglichkeit des Aufrufs gesehen und es deshalb einfach einmal so versucht.

Da ich zwischenzeitlich auch einige andere offene Baustellen schließen konnte, bin ich mit meinem Hobbyprojekt "Tourenoptimierung" (Mehrere Ziele in optimaler Reihenfolge anfahren), erheblich weitergekommen.

__________________

VG, WS-53


>>> Ein Spezialist kann nicht viel, dies aber gut. Die Steigerung ist, noch weniger noch besser zu können. Die Krönung ist, nichts zu können, aber darin perfekt zu sein! Es gibt aber auch Naturtalente, die überspringen die Ersten beiden Stufen. <<<

Übrigens, Feedback, egal welcher Art, ist immer hilfreich. Und erledigte Beiträge sollten auch den Status "erledigt" erhalten.
WS-53 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:49 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

Copyright ©2000-2010 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günther Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.
Beachten Sie bitte auch unsere Nutzungsbedingungen.