Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1960to1964
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
Inhaltsverzeichnis

Internetseite aufrufen, aktualisieren, koppieren, einfügen

Internetseite aufrufen, aktualisieren, koppieren, einfügen
27.01.2024 14:04:18
Aton
Hallo
Ich habe dieses Makro gefunden.
Es kopiert die Links dieser Seite in ein Arbeitsblatt.

Kann man es so ändern, daß es die Seite aktualisiert, alles mackiert, kopiert und einfügt
Dachte da an die Befehle Strg+r, Strg+a, Strg+c auf der Webseite.
Zum einfügen dann Blatt aktivieren und mit:
ActiveSheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:=False, NoHTMLFormatting:=True
einfügen. Dann meine Bearbeitung mit Application.Run "Datenaktualisieren" starten.
Mit Application.Wait (Now + TimeValue("0:06:10")) ' 6 Min warten und das gleiche noch mal.

Option Explicit
Public Sub test()
Dim objIE As Object
Dim objLinks As Object
Dim objLink As Object
Dim lngCount As Long
Set objIE = CreateObject("InternetExplorer.Application")
With objIE
.navigate "https://www.tankstellenpreise.de/benzinpreise-bad-schoenborn.html"
Do While .busy
Do While .busy
DoEvents
Loop
Loop
.Visible = True
Set objLinks = .Document.Links
For Each objLink In objLinks
lngCount = lngCount + 1
Cells(lngCount, 1) = objLink.href
Cells(lngCount, 2) = "'" & objLink.outertext
Next
.Quit
End With
Set objIE = Nothing
End Sub

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Internetseite aufrufen, aktualisieren, koppieren, einfügen
27.01.2024 15:27:18
Zwenn
Hallo Aton,

der IE sollte nicht mehr verwendet werden, da er veraltet ist. Dein Anliegen habe ich ehrlich gesagt nicht wirklich verstanden. Aber man kommt an alle Daten auch mit einer Technologie namens xhr (XML HTTP Request). Hier ist ein Beispiel, dass die Daten der ersten Seite der Tankstellen in grober Form in die ersten beiden Spalten der Tabelle schreibt, aus der das Makro aufgerufen wird. Die Daten lassen sich beliebig weiter granulieren, ist aber etwas tipparbeit. Es lassen sich auch alle 7 Seiten mit Tankstellen zum verlinkten Ort durchlaufen.


Sub GetTankstellenPreise()

Const url As String = "https://www.tankstellenpreise.de/benzinpreise-bad-schoenborn.html"
Dim doc As Object
Dim nodeAllTs As Object
Dim oneTs As Long
Dim currRow As Long

Set doc = CreateObject("htmlFile")
currRow = 2

With CreateObject("MSXML2.XMLHTTP.6.0")
.Open "GET", url, False
.send

If .Status = 200 Then
doc.body.innerHTML = .responseText
Set nodeAllTs = doc.getElementsByClassName("ts")

For oneTs = 1 To nodeAllTs.Length() - 1
ActiveSheet.Cells(currRow, 1) = nodeAllTs(oneTs).getElementsByClassName("tankstelle")(0).innertext
ActiveSheet.Cells(currRow, 2) = nodeAllTs(oneTs).getElementsByClassName("preis")(0).innertext
currRow = currRow + 1
Next oneTs
Else
MsgBox "Page not loaded. HTTP status " & .Status
End If
End With
End Sub


Viele Grüße,

Zwenn
Anzeige
AW: Internetseite aufrufen, aktualisieren, koppieren, einfügen
27.01.2024 16:04:47
Aton
Hallo
Fehler bei: Set nodeAllTs = doc.getElementsByClassName("ts")
Objekt unterstützt diese Eigenschaft oder Methode nicht
Mein Ziel ist:
Bei Microsoft Edge:
Die Tastaturbefehle Strg+r, Strg+a, Strg+c auf der Webseite ausgeführt,
erlauben mir beim Wechsel auf das Tabellenblatt mit einem Makro
den Inhalt einzufügen. Der Befehl dazu ist:
ActiveSheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:=False, NoHTMLFormatting:=True
Das funktioniert sehr gut.
Webseite ist auf, das Makro soll nun Schritt 1 bis 5 machen. 6 funktioniert.
1. Schritt den ich brauche; Webseite aktivieren
2. = aktualisieren der Webseite
3. = Alles makieren auf der Webseite
4. = kopieren der Webseite
5. = Wechsel zum Excel Blatt
6. = einfügen mit:
ActiveSheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:=False, NoHTMLFormatting:=True
da funktioniert dann.
Anzeige
AW: Internetseite aufrufen, aktualisieren, koppieren, einfügen
27.01.2024 19:39:19
Oberschlumpf
Hi,

ich hab eben...
- Excel geöffnet
- auf "neue Datei"-Symbol geklickt, was das Erstellen einer neuen Excel-Datei zur Folge hat
- dann den VBE geöffnet
- im VBE ein allgemeines Modul hinzugefügt
- Zwenn's Code hier in seiner Antwort markiert + kopiert
- im VBE, im Modul eingefügt
- Code gestartet

Ergebnis = null Fehler, in Tabelle werden die Zellen A2:B11 mit Daten der Seite gefüllt = Adresse + Preise

Da musst dann wohl du noch was falsch gemacht haben.

Und...du schreibst was vom MS Edge...in deinem Code wird aber der MS Internetexplorer gestartet; das steht ja sogar in der Zeile

Set objIE = CreateObject("...

...nur ma so zur Info.

Wenn ich mich richtig erinner, kann der MS Edge (noch) nicht per VBA gesteuert werden.
Unabhängig davon find ich Zwenn's Idee eh besser, weil sauberer, als zu versuchen, mit n paar Befehlen einen Web-Browser "fernzusteuern".

Ciao
Thorsten
Anzeige
AW: Internetseite aufrufen, aktualisieren, koppieren, einfügen
27.01.2024 21:23:25
Zwenn
Hallo zusammen,

danke für das Ausprobieren Thorsten. Ich hatte den Code auch getestet und mich gewundert, dass es bei Dir Aton einen Fehler gibt. Dann habe ich gesehen, Du arbeitset noch mit Excel 2010. Allein daran kann es eigentlich nicht liegen, aber kann es sein, dass Du auch noch Windows 7 am Start hast? In irgend einer älteren Implementierung von xhr wird die Methode getElementsByClassName() nicht unterstützt, soweit ich mich erinnere.

Ich habe den Code so umgeschrieben, dass er ohne die Methode auskommt. Ich hoffe die getAttribute() Methode läuft so. Er wird dadurch etwas unübersichtlicher und es werden nun oben und unten noch ein paar mehr Infos in die Tabelle geschrieben, als gewünscht. Es geht mir aber erstmal nur darum rauszufinden, welche Daten Du eigentlich brauchst und was Du mit ihnen machen willst Aton. Denn dass ist meine eigentliche Frage, die ich so eindeutig allerdings nicht gestellt hatte.

So wie Du die Seite im Moment nach Excel reinholen willst, macht es keinen Sinn. Denn Du musst dann ja immer noch rausholen, was Du wirklich willst. So ähnlich waren vor etlichen Jahren auch meine ersten Gehversuche mit Web Scraping. Es geht aber viel besser.
Probiere mal folgendes aus:

Sub GetTankstellenPreise()

Const url As String = "https://www.tankstellenpreise.de/benzinpreise-bad-schoenborn.html"
Dim doc As Object
Dim nodeAllTs As Object
Dim nodeAllInnerDivs As Object
Dim nodeOnelInnerDiv As Object
Dim oneTs As Long
Dim currRow As Long

Set doc = CreateObject("htmlFile")
currRow = 2

With CreateObject("MSXML2.XMLHTTP.6.0")
.Open "GET", url, False
.send

If .Status = 200 Then
doc.body.innerHTML = .responseText
Set nodeAllTs = doc.getElementsByTagName("div")

For oneTs = 1 To nodeAllTs.Length() - 1
If nodeAllTs(oneTs).getAttribute("class") = "ts" Then
Set nodeAllInnerDivs = doc.getElementsByTagName("div")
For Each nodeOnelInnerDiv In nodeAllInnerDivs
If nodeOnelInnerDiv.getAttribute("class") = "tankstelle" Then
ActiveSheet.Cells(currRow, 1) = nodeOnelInnerDiv.innertext
End If
If nodeOnelInnerDiv.getAttribute("class") = "preis" Then
ActiveSheet.Cells(currRow, 2) = nodeOnelInnerDiv.innertext
currRow = currRow + 1
End If
Next nodeOnelInnerDiv
End If
Next oneTs
Else
MsgBox "Page not loaded. HTTP status " & .Status
End If
End With
End Sub

Viele Grüße,

Zwenn
Anzeige
AW: Internetseite aufrufen, aktualisieren, koppieren, einfügen
27.01.2024 23:17:35
Aton
Hallo
https://www.herber.de/bbs/user/166469.xlsm
Dein 2. Makro leuft, bis oneTs 263 ist.
Keine Daten auf der Seite der Arbeitsmappe zufinden.
Das mit IE stimmt, aber Seite ist gleich wie mit Windows Edge.
Arbeite mit Windows 10 Pro.
Wenn ich die Daten über Tasten in Excel einkopiere,
werden sie in die Spalte A kopiert und über Makro hole ich
dann was ich brauche. Um eine Tabelle mit Diagramm damit zu
erstellen.
alle 6 Minuten wird diese Seite neu erstellt.
Es ging natürlich auch mit anderen Seiten, wenn es geht.
meine Datei habe ich hochgeladen.
Linkes Textfeld 1. versuch mit Fehlermeldung
Rechtes Textfeld 2. Versuch Leuft bis onets=263 ist, aber keine Daten zu finden.
in Einzelschritten Bewegung nur im Makro, Tabelle ändert sich nichts.

Keine Idee woran das Liegt, sehe ja daß nichts geht.
Anzeige
AW: Internetseite aufrufen, aktualisieren, koppieren, einfügen
28.01.2024 00:07:27
Aton
Hallo

Habe mich mit der 2. Version noch etwas beschäftigt und herausgefunden:
Wenn ich alle IF Then Abfragen lösche werden Daten in Spalte A und B geschrieben.
Diese enthalten aber viele Leerzeilen in der Celle.
und das Makro endet nur mit ESC oder mit schließen der Datei
Hilft euch dieser Hinweis weiter.

Frage: Wo ist da die Webadresse verborgen ?

Habe kein Schimmer wie das funktioniert.
Anscheinend wird kein Browser gestartet.
Leere Zeilen in einer Celle damit komme ich nicht zurecht.

Eine Liste von Oben nach unten wie beim Werte einfügen wäre optimal für mich.

Gruß Aton

P.S. Danke für euren Einsatz bei der Sache

Anzeige
AW: Internetseite aufrufen, aktualisieren, koppieren, einfügen
28.01.2024 10:27:42
ralf_b
Const url As String = "https://www.tankst.....
das ist doch die url / Webadresse

Es sind keine leeren Zeilen, sondern Zeilenumbrüche(unsichtbare Zeichen), die man auch entfernen kann.

Ein Browser interpretiert die Daten, die über eine Anfrage an einen Server zurück gegeben werden und erzeugt daraus eine sichtbare Webseite. Die nötigen Daten befinden sich dann schon auf deiner Festplatte und werden dann vom Browser in eine sichtbare Form gebracht.
Wenn man die Daten nicht zwingend visualisieren(Browser) muß, reicht es aus sie unsichtbar zu verarbeiten.
Anzeige
AW: Internetseite aufrufen, aktualisieren, koppieren, einfügen
28.01.2024 19:50:54
Zwenn
Hallo Aton,

Ralf hat Dir ehrlich gesagt sehr gute Infos gegeben. Mir ist klar, Du suchst eine Lösung. Aber bitte behalte immer im Auge, wir sind hier keine Dienstleister. Es geht in Foren wie diesem im Kern um Hilfe zur Selbsthilfe.

Da ich noch einen älteren Rechner rumstehen habe, auf dem genau Deine Software Konstellation mit Win 10 Pro und Excel 2010 installiert ist, habe ich den mal wieder eingeschaltet. Nach einer Menge Updates für's System und sonstiger Software, habe ich verschiedene Dinge ausprobiert. Alles, was mit dem Zugriff auf die verwendeten CSS Klassen von HTML-Tags zu tun hat, funktioniert unter Excel 2010 nicht mit xhr. Ein Satz, von dem Du vermutlich kein Wort verstehst. Egal, denn ich habe zähneknirschend eine Internet Explorer Lösung geschrieben, die genau das in die Tabelle schreibt, was ich mit meinem ersten Makro ohne Browser zeigen wollte. Du bist gut beraten, ein moderneres Excel zu verwenden.

In den Spalten A und B stehen grob verteilt Infos zu Tankstellen, Adressen, Spritsoten, Preisen und Zeitstemplen, von wann die Preise sind. Wie bereits erwähnt, kann das alles direkt feiner aufgeteilt in einzelne Spalten geschrieben werden. Die eigentliche Frage ist jetzt, was genau davon brauchst Du und wo genau? Also in welchen Spalten?

Heute verwende ich sogar wieder die richtige Code Formatierung ;-)


Sub GetTankstellenPreiseIE()
Const url = "https://www.tankstellenpreise.de/benzinpreise-bad-schoenborn.html"
Dim nodeAllTs As Object
Dim nodeAllInnerDivs As Object
Dim nodeOnelInnerDiv As Object
Dim nodeTest As Object
Dim oneTs As Long
Dim currRow As Long

currRow = 2

With CreateObject("InternetExplorer.Application")
.Visible = True 'Um den IE nicht anzuzeigen, auf False setzen
.navigate url
While .readyState > 4: DoEvents: Wend
'Cookie annehmen wenn angezeigt
'
On Error Resume Next
.document.getElementByID("c-p-bn").Click
On Error GoTo 0

Set nodeAllTs = .document.getElementsByClassName("ts")
For oneTs = 1 To nodeAllTs.Length() - 1
Set nodeTest = nodeAllTs(oneTs).getElementsByClassName("tankstelle")
ActiveSheet.Cells(currRow, 1) = nodeAllTs(oneTs).getElementsByClassName("tankstelle")(0).innertext
ActiveSheet.Cells(currRow, 2) = nodeAllTs(oneTs).getElementsByClassName("preis")(0).innertext
currRow = currRow + 1
Next oneTs
.Quit
End With
End Sub

Viele Grüße,

Zwenn
Anzeige
AW: Super das ist das was ich erwartet habe
28.01.2024 22:49:32
Aton
Hallo Zwenn

Vielen Dank das funktioniert Super

Gruß Aton
AW: Super das ist das was ich erwartet habe
29.01.2024 13:03:23
Wolfgang
Hallo,
das Makro von Zwenn funktioniert doch einwandfrei. Bin nun am Rätseln, wie das mit PowerQuery funktioniert, wie es Aton hier anzeigt. Bin zwar nicht der "Master of PowerQuery", aber irgendwie komme ich nicht zu Recht mit der Datei bzw. Ergebnis.
Kann auch daran liegen, dass ich mich mich PowerQuery noch nicht so befasst habe und es für mich nicht so interessant gefunden habe.

Grüße
Wolfgang
AW: Super das ist das was ich erwartet habe
30.01.2024 21:20:36
Jan
Hallo

Wo hängt es denn??
Zeig deine Versuche mal in der Datei und zeige auch dein Wunschergebnis dann kann man schauen.
Anzeige
AW: Internetseite aufrufen, aktualisieren, koppieren, einfügen
28.01.2024 14:50:07
Aton
Hallo
Das unten sehende Makro geht bis zum ende durch.
in Cells(1, 6) steht dann die zahl 263.
so weit so gut, aber keine daten in spalte a und b, das nütz mir also gar nichts.

mit einzelschritten habe ich festgestellt daß das innere der 3 if then abfragen nicht bearbeitet werden.
deshalb keine daten als ergebnis

If nodeAllTs(oneTs).getAttribute("class") = "ts" Then was bedeutet "ts"
nodeAllTs in der Excelhilfe keinen Eintrag

If nodeOnelInnerDiv.getAttribute("class") = "Tankstellenpreise" Then
nodeOnelInnerDiv.getAttribute in der Excelhilfe keinen Eintrag

Kann es sein daß ich da etwas in Excel nachladen und installieren muss,
damit diese if then abfragen funktionieren.

Habe Excel 10 und Windows 10 Pro

Gruß Aton

PS. Bei der Webadresse war ich blind, da das makro diese zeile nicht ansprang.

Sub GetTankstellenPreise()
Const url As String = "https://www.tankstellenpreise.de/benzinpreise-bad-schoenborn.html"
Dim doc As Object
Dim nodeAllTs As Object
Dim nodeAllInnerDivs As Object
Dim nodeOnelInnerDiv As Object
Dim oneTs As Long
Dim currRow As Long
Set doc = CreateObject("htmlFile")
currRow = 2
With CreateObject("MSXML2.XMLHTTP.6.0")
.Open "GET", url, False
.send
If .Status = 200 Then
doc.body.innerHTML = .responseText
Set nodeAllTs = doc.getElementsByTagName("div")
For oneTs = 1 To nodeAllTs.Length() - 1
If nodeAllTs(oneTs).getAttribute("class") = "ts" Then
Set nodeAllInnerDivs = doc.getElementsByTagName("div")
For Each nodeOnelInnerDiv In nodeAllInnerDivs
If nodeOnelInnerDiv.getAttribute("class") = "Tankstellenpreise" Then
ActiveSheet.Cells(currRow, 1) = nodeOnelInnerDiv.innertext
End If
If nodeOnelInnerDiv.getAttribute("class") = "preis" Then
ActiveSheet.Cells(currRow, 2) = nodeOnelInnerDiv.innertext
currRow = currRow + 1
End If
Next nodeOnelInnerDiv
End If
Next oneTs
Else
MsgBox "Page not loaded. HTTP status " & .Status
End If
End With
Cells(1, 6) = oneTs
End Sub
AW: Internetseite aufrufen, aktualisieren, koppieren, einfügen
28.01.2024 15:36:26
ralf_b
alles was oben zu Beginn des Makros mit Dim geschrieben steht, wird dort erst erzeugt. Das sind Variablen.
Die bekommen ihren Inhalt im Verlaufes des Programmes.

"ts" ist ein Text ,der in den Daten der Webseite gesucht wird.
nodeAllTs sind 263 stück es sind die Div Elemente der webseite ( doc.getElementsByTagName("div"))


Wenn du Code postest ,dann nutze die Code Tags des Forums. Hier über dem Editorfenster zu sehen.
versuche mal das auf einem neuen leeren Blatt.
Option Explicit



Sub GetTankstellenPreise()
Const url As String = "https://www.tankstellenpreise.de/benzinpreise-bad-schoenborn.html"
Dim doc As Object
Dim nodeAllTs As Object
Dim nodeAllInnerDivs As Object
Dim nodeOnelInnerDiv As Object
Dim oneTs As Long
Dim currRow As Long
Dim splititems

Set doc = CreateObject("htmlFile")
currRow = 2
With CreateObject("MSXML2.XMLHTTP.6.0")
.Open "GET", url, False
.send
If .Status = 200 Then
doc.body.innerHTML = .responseText
Set nodeAllTs = doc.getElementsByTagName("div")

For oneTs = 1 To nodeAllTs.Length() - 1

If nodeAllTs(oneTs).getAttribute("class") = "ts" Then

Set nodeAllInnerDivs = nodeAllTs(oneTs).getElementsByTagName("div")

For Each nodeOnelInnerDiv In nodeAllInnerDivs
If nodeOnelInnerDiv.getAttribute("class") = "tankstelle" Then
splititems = Split(Replace(nodeOnelInnerDiv.innertext, vbCrLf & vbCrLf, vbCrLf), vbCrLf)
ActiveSheet.Cells(currRow, 1) = splititems(0)
ActiveSheet.Cells(currRow, 2) = splititems(1) & vbLf & splititems(2)
End If
If nodeOnelInnerDiv.getAttribute("class") = "preis" Then

ActiveSheet.Cells(currRow, 3) = Replace(Replace(nodeOnelInnerDiv.innertext, vbCrLf & vbCrLf & vbCrLf, vbLf), vbCrLf, "")
currRow = currRow + 1
End If
Next nodeOnelInnerDiv

End If
Next oneTs
Else
MsgBox "Page not loaded. HTTP status " & .Status
End If
End With
Cells(1, 6) = oneTs
End Sub
AW: Internetseite aufrufen, aktualisieren, koppieren, einfügen
28.01.2024 16:01:07
Aton
Hallo ralf_b

Wie denkst du, was mir bei deiner Antwort hilft.

---- Bei der Frage warum der Inhalt der 3 IF THEN nicht abgearbeitet werden. --- Da ist das Problem
das Makro springt immer von IF Then - zu - End IF

Sie unterdrücken bei mir das ausgeben der Daten und ich habe keine IDEE wie sie k o r r i g i e r t
werden müssen, damit es zur Datenausgabe kommt.

Wenn es bei dir geht, warum bei mir nicht? - Als Daten bekomme ich nur in Cells(1, 6) steht dann 263.
Der Rest der Tabelle ist leer.

Gruß Aton

AW: Internetseite aufrufen, aktualisieren, koppieren, einfügen
28.01.2024 18:36:04
ralf_b
ich hab an dem Code etwas angepasst.
Natürlich sehe ich nicht was du siehst. Das bekomme ich mit dem Code angezeigt.
Userbild

Wenn du das nicht erhälst, wird es wohl an deiner uralt Excelversion liegen oder der Server sperrt dich aus, weil du den alle 6 Minuten nervst.

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige