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.

Bing Entfernungsrechner / Fahrzeit
#11
Hallo nochmals,

bin mit luftlinie.org ziemlich schnell gescheitert ... Excel hängt sich auf ... bei 

Do
        Sleep 100
        Set oN‌ode = Nothing
        Set oN‌ode = .getElementById("strck")
        If Not oNode Is Nothing Then
          If Not oNode.outerText Like "*--*" Then Exit Do
        End If
        DoEvents


Weiß nicht woran das liegt.

Jemand eine Idee?

Lg. Elmar
Antworten Top
#12
Technisch ist es sicherlich nicht das Tollste.

Ich könnte mir auch vorstellen, dass der Server die Abfrage irgendwann ablehnt. Denn da könnte ja jeder kommen und Entfernungen für lau ermitteln wollen.

Man muss jedenfalls immer mal wieder Hand anlegen, z.B. den Code manuell beenden, wenn er stecken geblieben ist. Wer weiß: Vielleicht müsste auch die aufgerufene Sub eine Function sein?
Antworten Top
#13
Hallo zusammen,

ich denke mal, wenn die Orte nicht gefunden werden (z.B. falsch geschrieben, nicht existent) ändert sich der Outertext nicht und die Do-Schleife wird nicht verlassen.
Setzen wir doch einfach einen Mitzähler ein, der z.B. nach 5 Sec die Do-Schleife beendet. Hoffe mal, dass der Fehler damit behoben ist.
Code in die Zwischenablage[+][-]
Sub GetDistance(tDist As DIST_STRUCT)
Dim oNode As Object, i As Integer
With CreateObject("InternetExplorer.Application")
  .navigate "http://www.luftlinie.org"      'Zur Url surfen
  While Not .readyState = 4: DoEvents: Wend 'Warten bis Seite geladen ist
  With .document
  Set oN‌ode = .getElementById("start")
  If Not oNode Is Nothing Then
    oNode.value = tDist.Start
    Set oN‌ode = .getElementById("end")
    On Error Resume Next
    If Not oNode Is Nothing Then
      oNode.value = tDist.Ziel
      Set oN‌ode = .getElementById("calcDistance")
      If Not oNode Is Nothing Then oNode.Click
      Do
        Sleep 100: i = i + 1
        Set oN‌ode = Nothing
        Set oN‌ode = .getElementById("strck")
        If Not oNode Is Nothing Then
          If Not oNode.outerText Like "*--*" Then Exit Do
        End If
        If i > 50 Then Exit Do
        DoEvents
      Loop
      tDist.LDist = .getElementsByClassName("value km")(0).outerText
      tDist.FDist = .getElementById("strck").outerText
      tDist.Start = tDist.Start & " " & .getElementsByClassName("regions")(0).outerText
      tDist.Ziel = tDist.Ziel & " " & .getElementsByClassName("regions")(2).outerText
    End If      'End
  End If      'Start
  End With
  .Quit        'IE schließen
End With
End Sub
viele Grüße aus Freigericht
Karl-Heinz
Antworten Top
#14
Hallo LCohen,

da die Rückgabe der Ergebnisse über die Variable tDist erfolgt und diese per Referenz und nicht als Value übergeben wird, ist das mit der Sub m.E. schon in Ordnung.
Hierbei werden die original übergebenen Werte als Rückgabe ggf. geändert.

Auch wenn Rückgaben in der Regel über die Function erfolgen. Dann bleiben die übergebenen Werte unbehelligt und erhalten, während die Function die neuen Werte liefert.

viele Grüße
Karl-Heinz
Antworten Top
#15
Hallo zusammen,

hier noch die etwas abweichende Get-Version, bei der Start und Ziel über den Link mitgegeben werden. Ist kürzer und könnte etwas schneller sein.
Sub GetDistance(tDist As DIST_STRUCT)
'Get-Methode
Dim oDoc As Object, i As Integer
With CreateObject("InternetExplorer.Application")
  .navigate "http://www.luftlinie.org/" _
          & tDist.Start & "/" & tDist.Ziel  'Zur Url surfen
  While Not .readyState = 4: DoEvents: Wend  'Warten bis Seite geladen ist
  On Error Resume Next
  Set oDoc = .document
  With tDist
  If Not .Start Like "#####*" Then .Start = ""
  If Not .Ziel Like "#####*" Then .Ziel = ""
  Do
    Sleep 100: i = i + 1
    .FDist = oDoc.getElementById("strck").outerText
    If Not .FDist Like "*--*" Then Exit Do
    If i > 50 Then Exit Do
  Loop
  .LDist = oDoc.getElementsByClassName("value km")(0).outerText
  .Start = Trim$(.Start & " " & oDoc.getElementsByClassName("regions")(0).outerText)
  .Ziel = Trim$(.Ziel & " " & oDoc.getElementsByClassName("regions")(2).outerText)
  End With
  .Quit                                      'IE schließen
End With
End Sub
viele Grüße aus Freigericht
Karl-Heinz
Antworten Top
#16
Ich habe mir nun mal das Preismodell von Google angeschaut. Demnach kann die Distance Matrix API bis zu 40.000 mal im Monat kostenlos genutz werden.

Wenn das bei dir nicht reicht, dann kann es daran liegen, dass du diese in einer Benutzerdefinierten Funktion verwendest. Ich bin zwar nicht der große VBA-Experte, aber da ist ja dann wohl so, dass wenn du auf einem Tabelleblatt Neuberechnungen (F9) durchführst, oder durch Excel automatisch durchgeführt werden, dann werden ja vermutlich auch die Distanzen neu berechnet und verringern somit das Freikontingent.

Ich hatte deshalb mir mal, noch bevor ein API-Key notwendig war, es allerdings schon ein Tageslimit eingestellt war, so beholfen, dass ich für einen AD-Mitarbeiter für seine Kunden alle von-/an Kombinationen ermittelt und gespeichert habe. Zu diesen habe ich dann in täglichen Intervallen von 2.000 die Distanzen und Fahrzeiten ermittelt und mir dazu das Ermittlungsdatum jeder einezelnen Entfernung in der Tabelle gespeichert.

Darüber habe ich dann eine formelbasierte Tagesplanung gelegt, um die Wegstrecke/-Zeit der täglichen Kundenbesuche zu optimieren. Habe ich dabei von-/an Kobinationen gefunden, für die noch keine Distanz berechnet war, dann habe ich diese berechnet und gespeichert. Für alle anderen wurde immer auf die bereits berechneten zurückgegriffen.

Und da ich ja das Datum der Distanzberechnung in der Tabelle aller Kombinationen gespeichert hatte. konnte ich auch immer wieder die neu berchenen lassen, die ein frei definiertes Alter erreicht hatten.

Auch wenn es zu dieser Zeit noch nicht kostenpflichtig war, konnte ich auf diese Art und Weise jedoch das Problem mit dem täglichen Limit umgehen. Allerdings hat diese Excelanwendung das Teststadium nie verlassen, weil zum einen, als die Berechnungen funktionierten, noch ein bedienfreundliches Benutzerinterface gefeht hat und zum anderen, die mir nahestehende Person, für die ich mich ins Zeug gelegt hatte, bis dahin ihre Kunden so gut kannte und bei der Tagesplanung auch noch Zeitfenter beachten musste, die von Kunden vorgegeben wurden. Ich hatte auch erst mal keine Idee, wie ich vorgegebene Zeitfenster in einer Formellösung hätte berücksichitgen können und das komplett auf VBA umzustellen, ging über meine VBA-Erfahrungen hinaus.

Wenn du nun schreibst:

Zitat:... allerdings sind mir die angefallenen Kosten bei Google zu hoch geworden, ...


dann würde mich mal interessieren, wie viele Aufrufe du monatlich getätigt hast, um am Ende bezahlen zu müssen.In dem verlinkten Preismodell wird übrigens auch darauf hingewiesen, dass du Nutzungslimits einstellen kannst, um negative Überraschungen zu vermeiden.

Und im übrigen ist es wohl generell empfehlenswert, soweit als möglich auf früher schon mal ermittelte Werte zurückzugreifen, weil es schneller geht und weil vermutlich auch andere, wenn die Serveranfragen zu viel werden, sich Preismodelle oder sonst etwas ausdenken, um die Flut der Anfragen Herr zu werden.
VG, wisch
Wer Hilfe nimmt, sollte auch Hilfe geben! Auch wenn dies auf einem ganz anderem Gebiet geschieht.
Antworten Top
#17
Das ist schlau, wisch.

Bei der GOOGLEFINANCE-Abfrage achte ich auch immer darauf, dass Kursabfragen im Blatt nur einmal stattfinden. Vermutlich ist Google das egal, da sie die Abfragen sowieso bündeln, aber Vorsicht ist immer gut.

Außerdem tut man gut daran, die Tabelle nicht übermäßig oft zu nutzen.
Antworten Top
#18
Zitat:Ich sollte hier für eine größere Anzahl von Dienstnehmern, die gefahrenen Kilometer ermitteln, welche sie im Laufe eines Tages für Kundenbesuche aufgewendet haben


100 Dienstnehmer, die an 20 Arbeitstagen je 10 Kunden besuchen, sind im Monat 20.000 Strecken gefahren, zu denen du die Kilometer ermitteln möchtest. Damit hättest du dein monatliches Freikontingent erst zu 50% ausgeschöpft.

Wenn es bei dir nicht ausreicht, dann machst du wohl etwas falsch, oder auf der Seite von Google stehen falsche Angaben.
VG, wisch
Wer Hilfe nimmt, sollte auch Hilfe geben! Auch wenn dies auf einem ganz anderem Gebiet geschieht.
Antworten Top
#19
Hallöchen,

Wenn eine API bzw. Funktion in Formeln verwendet wird, dann erfolgen die Abfragen per Berechnung ggf. bei jedem Öffnen usw.
Wenn da nicht nur eine Adresse / Route in der Datei steht, erfolgen ggf. eine ganze Menge Berechnungen resp. Abfragen.
Dann sind es ja auch zwei Funktionen, die da verwendet werden. ...

Wenn das so ist sollte man vielleicht gezielt nur ausgewählte, neue oder geänderte Datensätze berechnen - egal ob man temporär Formel setzt oder das gleich VBA erledigen lässt - und bei der Formelvariante selbige anschließend in Werte wandeln.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#20
Gute Idee!

Bei GDocs muss man sich dafür mit der dortigen Sprache befassen, die es seit einigen Jahren gibt.

Bei Excel fällt das leichter, da Aufzeichnung möglich.
Antworten Top


Gehe zu:


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