Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1612to1616
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Daten aus Webserver
17.03.2018 09:18:38
Thomas
Ich brauche den Rat von Profis. Daten aus einem Webserver ca. jede Sekunde Abfragen.
Konkret habe ich mit einem Arduino und einem Ethernetbord eine Stoppuhr gebaut. Die Ergebnisse schreibt Arduino in seinen Webserver dieser ist ganz einfach über eine IP Adresse vom PC aus einzusehen. Excel bietet ja eine Funktion an Daten aus dem Web zu holen. Leider kann man diese nur auf min. alle 60Sekunden stellen. ich brauchte aber die Daten immer aktuell (alle sek. reicht) kann mir da einer kurz einen VB Code bauen der dies automatisiert?
Besten Dank thomas

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Klingt eher als brauchst du das Raten von Profis
17.03.2018 11:26:05
Profis
Hallo Thomas,
wer soll denn mit den Angaben etwas anfangen? Du musst schon die benötigten technischen Angaben machen. Z.B. mal mindestens in welcher Form Deine Daten auf dem Webserver abgelegt werden und wie sie aufgerufen werden.
Wird da eine HTML-Datei generiert? Aufbau? Ist es eine Text Datei? Aufbau? Wird jeder Messwert in eine eigene Datei geschrieben? Wie werden die benamt? Aufbau? ...
Viele Grüße,
Zwenn
AW: Klingt eher als brauchst du das Raten von Profis
17.03.2018 17:00:18
Profis
Danke für die Antwort. Es sind ca. 20 werte sie immer am gleichen Ort stehen. Das ganze ist eine kleine HTML Seite die immer die gleiche ip Adresse hat und auf die man mit einem Browser (192.168.1.177) ansehen kann. Die Werte stehen immer am Zeilenanfang und werden vom Arduino fortlaufend übertragen. Es sind Zahlen (Rennzeiten) und einige Wahr Falsch (1 oder 0 )Werte. Ich dachte ein kurzer VB-Code der die Abfrage Automatisiert statt nur alle 1 Minuten alle sek. Wenn ich die Daten in Excel habe verarbeite ich diese mit einem Makro weiter also die Werte kommen immer vom selben Ort und müssen immer an die gleiche stelle auf einem Tabellenblatt kopiert werden. Für die weiterverarbeitung habe ich genug Zeit. Ich hänge noch die html Seite so wie sie mir Angezeigt wird als File dran. (Leider noch ohne Daten)
https://www.herber.de/bbs/user/120490.html.
gruss thomas
Anzeige
Das klingt doch schon anders :-)
17.03.2018 21:25:10
Zwenn
Hallo Thomas,
ich habe jetzt mal etwas rumprobiert und den Webserver von meinem RasPi genutzt. Probiere mal folgendes Makro aus. Das liefert jetzt nicht exakt jede Sekunde neue Werte, sollte aber für Deine Zwecke schon wesentlich besser funktionieren denke ich. Zu Testzwecken brauchst Du in einer Excel-Datei eine zweite Tabelle, in der mit meinem Makro die Uhrzeiten hinterlegt werden, an denen ausgelesen wurde. Damit kannst Du mal sehen, ob das alles in dem Zeitrahmen stattfindet, wie Du es brauchst. Manchmal liegt der halt im Bereich von 2 Sekunden, statt von 1 Sekunde. Deine IP Adresse habe ich schon eingetragen.
Das Makro spammt Dir den gesamten Text aus der HTML-Datei einfach immer wieder wie er ist in Spalte A von Tabelle1. (Im vorliegenden Makro wird nach 10 Durchläufen abgebrochen, damit Du sehen kannst, was passiert ist.)

Sub HTMLvomArduinoHolen()
Dim zeile As Long           'Aktuelle Zeile in der Urzeiten-Tabelle
Dim zeitTabelle As String   'Name der Tabelle, in der zu Testzwecken die Urzeiten der  _
Auslesevorgänge geschrieben wird
Dim htmlTabelle As String   'Name der Tabelle, in die der Inhalt der HTML-Datei geschrieben  _
wird
zeitTabelle = "Tabelle2" 'anpassen
htmlTabelle = "Tabelle1" 'anpassen
Do
'Nächste Zeile in der Urzeiten-Tabelle und ihr Eintrag
zeile = zeile + 1
Sheets(zeitTabelle).Cells(zeile, 1).Value = Format(Now, "hh:mm:ss")
'Einlesen der HTML-Datei in die HTML-Tabelle
Application.CutCopyMode = False
With ActiveSheet.QueryTables.Add(Connection:="URL;http://192.168.1.177", _
Destination:=Sheets(htmlTabelle).Range("$A$1"))
.Name = "192.168.1.177"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingNone
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
'Hier das Verarbeitungsmakro starten
'call Verarbeitungsmakro
'Hier wird eine Pause von 1 Sekunde eingelegt.
'Um die Laufzeit des Verarbeitungsmakros auszugleichen
'wird ein Wert unter 1 Sek. benötigt. Dazu braucht man
'ein anderes Vorgehen. Mit dieser Methode ist 1 Sek.
'das kleinste was geht.
Application.Wait (Now + TimeSerial(0, 0, 1))
'Die Spalte, in die der Inhalt der HTML Datei geschrieben wird,
'muss nach jedem Durchlauf gelöscht werden. Sonst werden
'weitere Einlese-Ergebnisse in den Folgespalten abgelegt
Sheets(htmlTabelle).Columns(1).EntireColumn.Delete
'Hier wird die Schleife erneut durchlaufen
'Soll sie unendlich weiterlaufen, das
'"Until zeile = 10" löschen
'Für mehr Testdurchläufe die 10 entsprechend
'hochsetzen
Loop Until zeile = 10
End Sub

Viele Grüße,
Zwenn
Anzeige
AW: Das klingt doch schon anders :-)
19.03.2018 07:53:08
Thomas
Das funktioniert ja super soweit.
Die Daten werden Übertragen! Danke.
Leider ist Excel blockiert solang das Makro läuft? Kann ich das irgendwie im hintergrund laufen lassen. Die Abfragegeschwindikeit ist ok so. Aber ich kann keine Auswertung machen solang das Makro läuft. Wenn ich die Zeile "Until zeile = 10" entferne kann ich nicht mal mehr was stoppen und er hängt in einer endlosschlaufe?
Besten Dank thomas
Anders aber falsch!
19.03.2018 10:33:54
EtoPHG
Hallo Thomas,
Ich rate dir dringend davon ab, das Makro von @Zwenn zu gebrauchen.
Der Grund, mit jedem Durchlauf erhöht sich die Anzahl Query-Objekte um 1, d.h deine Mappe wird immer grösser, ohne offensichtlichen Zuwachs an Nutzdaten. Es ist ein gängiger Fehler (auch von erfahrenen VBA-Anwendern) den aufgezeichneten Code für das erstellen von Datenabfragen ohne grosses Nachdenken 1:1 zu übernehmen.
Wenn ein Query-Objekt 1mal und nur einmal erstellt wurde, kann es wiederverwendet werden, ohne es neu zu addieren. Der Befehl lautet dann ganz einfach, für das Queryobjekt auf dem entsprechen Arbeitsblatt:
Worksheet(x).QueryTables(y).Refresh BackgroundQuery:=False

Damit werden die Daten neu von der Quelle in die Mappe/Blatt geholt.
Wie du richtig erkannt hast, kann die Eigenschaft RefreshPeriod minimal auf 1 Minute gesetzt werden. Damit du aber im Sekundentakt machen kannst, schreibst du ein Application.OnTime Routine, die immer um NOW+1 Sekunde anläuft und nur obigen Befehl + den Befehl für das nächste Starten, ihrer selbst, enthält. Die Sekunde kann aber mit interpretiertem VBA-Code nicht genau eingehalten werden, d.h. hier können je nach Latenzzeit für die Datenübertragung auch grössere Abweichung stattfinden). Für die OnTime-Routing sollte auch ein Button oder Ähnliches vorgesehen werden, um die Repetion zu stoppen.
Beispiel für OnTime-Routinen findes du sowohl in der XL-VBA-Hilfe, wie auch im Forum zuhauf.
Gruess Hansueli
Anzeige
Uiuiui
19.03.2018 11:12:39
Zwenn
Hallo Hansueli,
danke für die Aufklärung über diesen groben Schnitzer von mir. Zwar habe ich den aufgezeichneten Code nicht ganz 1 zu 1 verwendet, weil es da einen Fehler bei der Ausführung gab. Aber mir war nicht bewußt, dass ich munter neue Query Objekte erstelle. Dazu auch danke für die Hintergrund-Erklärung.
Ich habe leider erst heute Abend wieder Zeit, mir das nochmal anzusehen. Ich hatte es so gemacht, um das sekündliche Aufrufen des IE für diese Aufgabe zu verhindern. Nach meiner Erfahrung wird der nämlich sehr instabil, wenn man sehr oft neue Seiten in so kurzen Abständen aufruft. (Habe mal versucht tausende Kurz-URLs aus Twitter aufzulösen. Nach ein paar hundert crasht der IE)
@Thomas
Während ein Makro läuft kannst Du Excel nicht anderweitig verwenden. Aber es handelt sich doch um Rennen. So ein Rennen ist doch irgendwann vorbei. Das bedeutet das man die Schleife beenden könnte, wenn bestimmte Werte auf Null gehen.
Was genau ist denn Dein Ziel? Was willst Du machen? Vielleicht muss man da ganz anders ran gehen.
Viele Grüße,
Zwenn
Anzeige
Aus dem Archiv ein Anfrager mit >10'000 Queries
19.03.2018 11:48:03
EtoPHG
Hallo Zwenn,
Du kannst dir ja mal diesen Thread reinziehen. Am Schluss stellte sich raus, dass der Anfrager über 10'000 Queryobjekt in seiner Mappe hatte. Da hat es auch Codevorschläge zum Bereinigen einer solch 'versauten' Mappe.
Gruess Hansueli
AW: Anders aber falsch!
19.03.2018 13:02:16
Thomas
Danke Hansueli.
Das wäre ja die perfekte Lösung. Die abfragezeit muss nicht genau 1 sek. sein.
Leider bin ich zu unerfahren diesen VBA Code zu verstehen.
Wo "speichert" Excel diese Webabfrage nachdem man sie einmal Aufgerufen hat bleibt sie ja erhalten.
Wäre natürlich perfekt wenn du mir die Zeile mit einer OnTime Routine Now +1 Sekunde schreiben könntest.
Wo müsste ich den VB-Code Einfügen. In die Arbeitsmappe oder in die Tabelle1?
Bin da nicht so erfahren
Besten Dank gruss thomas
Anzeige
AW: Anders aber richtig!
19.03.2018 14:24:15
EtoPHG
Hallo Thomas,
Frage: Wo "speichert" Excel diese Webabfrage...
In der Arbeitsmappe. Du kannst auf verschiedene Arten rausfinden, wie deine QueryTable heisst.
1. Mit dem Dropdown im Addressfeld links in der Zeile in der du Formeln eingibst. Im Dropdown werden dann Namen wie z.B. default oder Tabelle1 oder... Wählst du eine solche aus, wird der Bereich im Blatt markiert, den die Abfrage belegt.
2. Rechtsklick im Datenbereich - Datenbereichseigenschaften. Hier kannst du der Abfrage auch einen neuen Namen verpassen, z.B. "MeineAbfrage".
3. Im Namensmanager; MenüTab "Formeln" - Namens-Manager: Auch hier kannst du per Auswahl und Bearbeiten einen Neuen Namen verpassen. Und du kannst am einfachsten hier alle überflüssigen Queryobjekte wie Tabelle11, Tabelle111 etc löschen.
Diese Codes in ein Modul:
Option Explicit
Dim nextStartTime As Double
Sub AlleAusserEinemQueryLoeschen()
Const sKeepQuery = "MeineAbfrage"
Dim ws As Worksheet
Dim qt As QueryTable
For Each ws In ThisWorkbook.Worksheets
If ws.QueryTables.Count > 0 Then
For Each qt In ws.QueryTables
If qt.Name  sKeepQuery Then qt.Delete
Next qt
End If
Next ws
End Sub
Sub StartQuery()
ThisWorkbook.Worksheets("Tabelle1").QueryTables("MeineAbfrage").Refresh _
BackgroundQuery:=False
nextStartTime = Now + TimeSerial(0, 0, 1)   ' Last Parameter = Sekunden
Application.OnTime Earliesttime:=nextStartTime, Procedure:="StartQuery"
End Sub
Sub StopQuery()
' Sofort stoppen, wenn es noch läuft
If nextStartTime > 0 Then
On Error Resume Next
Application.OnTime Earliesttime:=nextStartTime, Procedure:="StartQuery", _
schedule:=False
nextStartTime = 0
End If
End Sub

Mit der Routine AlleAusserEinemQueryLoeschen bereinigst du deine Mappe von unnötigen Queries. Passe die 1. Zeile an, wenn du den Namen des Query-Objekts identifiziert hast und lass sie laufen.
Mit der Routine StartQuery startest du einen sekündlichen Refresh der Daten. Zum Testen vielleicht einmal auf 10, statt einer Sekunde setzen. Das Stoppen läuft über StopQuery.
Das Starten/Stoppen erledigst du am einfachsten, wenn du einen ActiveX-Togglebutton auf ein Tabellenblatt legst und diesem per Doppelklick diesen Code zuweist:
Private Sub ToggleButton1_Click()
With ToggleButton1
If .Value = False Then
.Caption = "Stop Abfrage"
StartQuery
Else
.Caption = "Start Abfrage"
StopQuery
End If
End With
End Sub

Damit wäre das Fuder gefahren ;-)
Gruess Hansueli
Anzeige
AW: Anders aber richtig!
19.03.2018 15:22:37
Thomas
Das ist es!
Super Danke tausend mal. Ich habe zig Stunden mit der Suche nach einer Lösung verbraucht.
Der Code ist jetzt doch Umfangreicher geworden.
Nicht selbstverstäntlich das einem so geholfen wird.
nochmals vielen Dank
gruss aus der Schweiz Thomas
Dann is ja alles jut und damit geschlossen (owT)
19.03.2018 15:30:39
EtoPHG

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige