Hallo Winny, ich könnte deine Hilfe gebrauchen bei der Berechnung.
1. Ich müsste noch als Ziel eine Strasse und Hausnummer angeben. 2. Bei einer Anzahl von 5000 Datensätzen bricht die Berechnung bei ca. 1000 ab. (Das könnte ich ggf. beheben indem ich die Tabelle aufteile.)
da der Thread relativ lang ist und auch mehrere user Beispiele in verschiedenen Versionen eingestellt haben, wäre es vorteilhaft, wenn Du einen Link zu der von Dir gewählten Version postest.
In der von mir in Beitrag #6 geposteten ersten Lösung waren nur die Straßen des Ausgangsortes enthalten. Von mir und Winny kamen in Folge noch Codekorrekturen dazu. Meinst Du diese Version?
ich habe mir die Datei Entfernungen_GoogleMaps_V3 runtergeladen, jedoch öffnet sich nur Googlemaps wenn ich ein Feld klicke. Wisst ihr was ich fallsch mache?
07.03.2017, 11:49 (Dieser Beitrag wurde zuletzt bearbeitet: 07.03.2017, 11:49 von RPP63.)
Moin! In einem anderen Forum wurde kürzlich ein ähnliches Problem diskutiert. Dort ging es jedoch um die Entfernung zwischen zwei Postleitzahlen, welches in der Regel als Anhaltspunkt völlig ausreicht. Der Vorteil ist, dass der Code extrem kompakt ist. Er stammt von snb :19:
In der Datei im Anhang gibt es eine "intelligente" Tabelle. Makro M_snb starten.
Modul Modul2
OptionExplicitSub M_snb()
Dim sn, j#
sn = Tabelle1.ListObjects(1).DataBodyRange
With CreateObject("MSXML2.XMLHTTP")
For j = 1To Tabelle1.ListObjects(1).DataBodyRange.Rows.Count
.Open "GET", "http://maps.googleapis.com/maps/api/directions/xml?origin=Deutschland," & _
Format(sn(j, 1), "00000") & "&destination=Deutschland," & _
Format(sn(j, 3), "00000") & "&sensor=false", False
.send
sn(j, 5) = .responseXML.SelectSingleNode("//leg/distance/text").Text
NextEndWith
Tabelle1.ListObjects(1).DataBodyRange = sn
EndSub
Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
erstmal Danke für die Klasse Tabelle die du da gestrickt hast.
Jetzt bräuchte ich noch eine primitive Luftlinienberechnung zwischen zwei Orten die ich gleich mit in diese Tabelle mit integrieren kann. Ergebnis ist dann zum Beispiel in Zeile 1 die Fahrtzeit mit 35km und in Zeile 2 die Luftlinie mit 28km. Wenn die Luftlinie auch noch mit Maps darstellbar wäre ist alles TOP.
(07.03.2017, 11:49)RPP63 schrieb: Der Vorteil ist, dass der Code extrem kompakt ist.
Da hätte ich zur Info noch ein paar Bemerkungen dazu: Der große Nachteil ist, dass bei jeder Ausführung alle Zeilen neu berechnet werden und man somit sehr schnell das kostenlose Tageslimit erreicht. Es ist besser nur auf geänderte Zeilen zu reagieren und somit das Tageslimit zu schonen.
Weiterhin werden nur die Postleitzahlen an Google geschickt und nicht die Orte. Das hat zwei Konsequenzen, erstens werden somit die Eingaben PLZ/Ort nicht automatisch auf Stimmigkeit überprüft und zweitens nimmt Google dann einfach die Mitte des PLZ-Bereiches an, was auch einige Kilometer Differenz bedeuten kann. Um bessere und verständlichere Ergebnisse zu erzielen, sollte man die Spalten mit den Orten in die Abfrage einbeziehen und gleichzeitig im 'responseXML' weitere SingleNodes auswerten. - Die Infos sind vorhanden.
15.03.2017, 11:46 (Dieser Beitrag wurde zuletzt bearbeitet: 15.03.2017, 11:46 von RPP63.)
Hi Carsten! Ich schrieb aber auch:
Zitat:Dort ging es jedoch um die Entfernung zwischen zwei Postleitzahlen, welches in der Regelals Anhaltspunkt völlig ausreicht.
Überlassen wir es doch einfach dem geneigten User, die für ihn sinnvollste Variante zu wählen. Ich habe hier schließlich keine bestehenden Lösungen kritisiert, sondern eine Alternative angeboten.
Noch etwas: Dies dient doch normalerweise dazu, seine bereits vorhandene Adressen-Datenbank um die Entfernung zu erweitern. Obiges Makro hat den großen Vorteil gegenüber einer UDF, dass es erheblich schneller abläuft, da nicht pro Datensatz eine Verbindung aufgebaut und geschlossen wird, sondern in einer Session abgefrühstückt wird.
Dennoch ist es natürlich einfach, für eine Erweiterung einer bestehenden Datenbank eine UDF auf Basis des obigen Makros zu schreiben.
Two Cents und Grüße
Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
ich verstehe Deinen Post und ich habe auch nicht kritisiert, sondern nur geschrieben:
(15.03.2017, 11:05)DbSam schrieb: Da hätte ich zur Info noch ein paar Bemerkungen dazu: ...
Ich hätte jetzt eher folgende Antwort von Dir erwartet:
Lieber Carsten, mit ein paar kleinen Änderungen ist der kompakte Code effizienter und schont das Limit:
Code:
Option Explicit
Sub M_snb() Dim sn, j# sn = Tabelle1.ListObjects(1).DataBodyRange
With CreateObject("MSXML2.XMLHTTP") For j = 1 To Tabelle1.ListObjects(1).DataBodyRange.Rows.Count If Len(sn(j, 5)) = 0 Then .Open "GET", "http://maps.googleapis.com/maps/api/directions/xml?origin=Deutschland," & _ Format(sn(j, 1), "00000") & "&destination=Deutschland," & _ Format(sn(j, 3), "00000") & "&sensor=false", False .send sn(j, 5) = .responseXML.SelectSingleNode("//leg/distance/text").Text End If Next End With
Tabelle1.ListObjects(1).DataBodyRange = sn End Sub
... und dann die Url noch um die Orte erweitert, schon hätte ich nichts mehr zu nörgeln. Außer, dass es nur für Deutschland funktioniert ... :32: