Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1532to1536
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

Tabelle aus HTML Dokument auslesen

Tabelle aus HTML Dokument auslesen
14.01.2017 15:24:56
Mirco
Hallo Zusammen
Vornweg -> Ich besitze lediglich rudimentäre Kenntnisse zu VBA
Mein Ziel -> Ich möchte ein Fach aus einem Online-Stundenplan in Excel einlesen. Dieser ist sehr verschachtelt. D.h. es sind mehrere Tabellen in Tabellen (siehe URL: https://www.hafl.bfh.ch/fileadmin/stundenplaene/hs/P3/f/f00001.htm). Ich habe versucht den Inhalt einzelner Tabellen, Tabellenzeilen und Tabellenobjekte auszulesen(
,,
). Dies hat funktionniert, nur leider ist die Tabelle sehr kompliziert organisiert. Es gibt nicht wirklich eine Logik wo man sagen kann dass z.B. jeweils in der 3. Zeile eine neue Stunde anfängt.
Der HTML-code ist jedoch glückicherweise so, dass jedes Fach eine Farbe hat (bgcolor=).
Meine Frage -> Wie kann ich in dem HTML-Dokument genau nach diesem Begriff suchen, die Tabelle wo er drinsteht einlesen und in der HTML-Tabelle einer Zeit zuordnen?
Ich hoffe ich habe mich verständlich ausgedrückt
Vielen Dank im Voraus und Gruss
Hier mein VBA-Script:
Option Explicit

Public Sub pbsubstundenplan()
Dim IE As InternetExplorer
Dim HTML As HTMLDocument
Dim intzaehler As Integer
Dim strname As String
intzaehler = 0
Set IE = New InternetExplorer
IE.Visible = False
IE.navigate "https://www.hafl.bfh.ch/fileadmin/stundenplaene/hs/P3/c/c00022.htm"
Do While IE.readyState  READYSTATE_COMPLETE
DoEvents
Loop
Set HTML = IE.document
Do
intzaehler = intzaehler + 1
strname = Trim(HTML.getElementsByTagName("table")(intzaehler).innerText)
If Not IsEmpty(strname) Then
Me.Range("A" & intzaehler).Value = intzaehler
Me.Range("B" & intzaehler).Value = strname
Else: Exit Do
End If
Loop
End Sub
P.S.: das Script gibt einen Laufzeitfehler 91 aus. Ich verstehe leider auch nicht ganz warum..
HTML sehr wirr
Michael

Hi Mirco,
ich habe mir das Original mal angesehen: der HTML-Code ist ziemlich wirr; alleine die Werte auszulesen bringt eigentlich nichts, weil die Position innerhalb der Tabelle entscheidend für die Zuweisung von Wochentag & Zeit ist.
D.h., man müßte die ganze Table-Arithmetik (mit den ganzen col- & rowspans) auswerten.
Machbar ist ja immer alles; die Frage ist nur, mit welchem Aufwand. Wenn es Dir darum geht, einen Stundenplan mit Deinen eigenen Kursen zu erstellen, ist es wahrscheinlich schneller händisch erledigt als programmiert.
Hm, hm. Lies die Pläne mal damit ein (Makro in ein allg. Modul, z.B. Modul1, das sind die Dinger, die automatisch erzeugt werden, wenn Du den Makrorekorder benutzt):
Option Explicit
Sub NochEinTest()
'Mirco Ackermann
'Tabelle aus HTML Dokument auslesen
Dim oData As New DataObject
's. a.:
' http://www.online-excel.de/ _
excel/singsel_vba.php?f=28
Dim objXMLHTTP As Object
Dim sURL As String, sResult As String, ausCP$
Dim pLi As Long, pRe As Long
Dim mC&, i& ' max. Spalte, i &=as long
Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
'sURL = "https://www.hafl.bfh.ch/fileadmin/stundenplaene/hs/P3/c/c00022.htm"
sURL = "https://www.hafl.bfh.ch/fileadmin/stundenplaene/hs/P3/f/f00001.htm"
objXMLHTTP.Open "GET", sURL, False
objXMLHTTP.Send
If objXMLHTTP.Status  200 Then
MsgBox "Status  200: " & objXMLHTTP.Status
Exit Sub
End If
sResult = objXMLHTTP.ResponseText
Set objXMLHTTP = Nothing
ActiveSheet.Cells.Clear
pLi = InStr(sResult, " 0 Then
pRe = InStrRev(sResult, "
") If pRe 0 Then ausCP = Mid(sResult, pLi, pRe - pLi + 1) & "/TABLE>" MsgBox Right(ausCP, 50) ' stimmt das Ende? With oData .SetText ausCP .PutInClipboard End With Range("B3").Select ActiveSheet.PasteSpecial Format:="Unicode-Text", Link:=False, _ DisplayAsIcon:=False Stop mC = Cells(3, Columns.Count).End(xlToLeft).Column Range("B2").Resize(, mC).FormulaLocal = "=Anzahl2(B3:B500)" For i = mC To 5 Step -1 If Cells(2, i) = 0 Then Columns(i).Delete Next End If End If End Sub

Es kopiert die komplette Tabellenstruktur in das gerade aktive Tabellenblatt, schreibt die Formel = Anzahl2 in die Zeile 2, die ermittelt, ob in der Spalte Daten stehen, und löscht selbige, wenn nichts vorhanden ist.
Du hast ja zwei unterschiedliche Links angegeben; der im Makro erzeugt eine einzelne Tabelle, der andere drei untereinander.
Jedenfalls stellt Dir das Makro eine "geraffte" Ansicht zur Verfügung, die sich innerhalb von Excel sicher leichter auswerten läßt als das eklige HTML.
Wenn Du genau beschreibst, wie die Ausgabe aussehen soll, wird sich's mit vertretbarem Aufwand machen lassen.
Schöne Grüße,
Michael
P.S.: Das Makro verwendet die Zwischenablage, die nicht ohne Weiteres funktioniert (Infos dazu im eingestreuten link auf online-Excel).
Damit Du damit keinen Ärger hast, anbei doch eine Datei mit leicht geändertem Makro: https://www.herber.de/bbs/user/110564.xlsm
AW: HTML sehr wirr
Mirco

Hallo Michael
Vielen Dank für deine super Antwort!
Die HTML-Tabelle ist wirklich sehr wirr. Wahrscheinlich ist aus diesem Grund unsere Schule nicht fähig, benutzerdefinierte Stundenpläne zu generieren. Ich finde den Ansatz aber sehr gut von dir, erst einmal alle Stundenpläne in Excel zu integrieren und anschliessend zu bearbeiten (auch wenn ich den code nicht vollständig lesen kann).
Ich versuche mal etwas zu schreiben, das die integrierten Pläne bearbeitet und werde bestimmt bald weitere Fragen posten! ;-)
Gruss Mirco
AW: HTML sehr wirr
Michael

Hi Mirco,
ich sehe grad, daß die Forumssoftware ein paar Zeilen verhackstückt hat, z.B.
pLi = InStr(sResult, " 0 Then

Das liegt wohl an den enthaltenen ">" usw.
Wenn Du mir mitteilst, was Du nicht verstehst, erkläre ich's Dir gerne.
Happy Exceling,
Michael
AW: HTML sehr wirr
Mirco

Hallo Michael
Den folgenden Part begreife ich nicht ganz. Man zählt zuerst von links bis das gesuchte Element vorkommt, dann von rechts. Aber was macht man dann mit diesen Zahlen?

If pLi  0 Then
pRe = InStrRev(sResult, "
") If pRe 0 Then ausCP = Mid(sResult, pLi, pRe - pLi + 1) & "/TABLE>" ' MsgBox Right(ausCP, 50) ' stimmt das Ende?
Ich habe jetzt versucht alle Stundenpläne die aus dem Internet gesogen wurden zusammenzufügen und ein bisschen schön zu machen. Dies ging nicht schlecht. Nur weiss ich noch nicht ganz wie ich es mit den Überschneidungen regeln soll.
Ein weiterer Punkt ist jedoch die automatische Generierung der links. Dazu müssten die "Elemente" von diesem Frame geladen werden: https://www.hafl.bfh.ch/fileadmin/stundenplaene/hs/frames/navbar.htm
Ich weiss nicht genau wie ich dieses Frame ansteuern soll. Es ist ja keine id vorhanden. Und auch wenn sie vorhanden wäre: wie kriegt man alle Elemente aus option /option heraus?
Hier das File, wie es jetzt steht https://www.herber.de/bbs/user/110695.xlsm
Vielen Dank nochmals für deine kompetente Hilfe!
Gruss Mirco

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
HTML sehr wirr
15.01.2017 14:50:52
Michael
Hi Mirco,
ich habe mir das Original mal angesehen: der HTML-Code ist ziemlich wirr; alleine die Werte auszulesen bringt eigentlich nichts, weil die Position innerhalb der Tabelle entscheidend für die Zuweisung von Wochentag & Zeit ist.
D.h., man müßte die ganze Table-Arithmetik (mit den ganzen col- & rowspans) auswerten.
Machbar ist ja immer alles; die Frage ist nur, mit welchem Aufwand. Wenn es Dir darum geht, einen Stundenplan mit Deinen eigenen Kursen zu erstellen, ist es wahrscheinlich schneller händisch erledigt als programmiert.
Hm, hm. Lies die Pläne mal damit ein (Makro in ein allg. Modul, z.B. Modul1, das sind die Dinger, die automatisch erzeugt werden, wenn Du den Makrorekorder benutzt):
Option Explicit
Sub NochEinTest()
'Mirco Ackermann
'Tabelle aus HTML Dokument auslesen
Dim oData As New DataObject
's. a.:
' http://www.online-excel.de/ _
excel/singsel_vba.php?f=28
Dim objXMLHTTP As Object
Dim sURL As String, sResult As String, ausCP$
Dim pLi As Long, pRe As Long
Dim mC&, i& ' max. Spalte, i &=as long
Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
'sURL = "https://www.hafl.bfh.ch/fileadmin/stundenplaene/hs/P3/c/c00022.htm"
sURL = "https://www.hafl.bfh.ch/fileadmin/stundenplaene/hs/P3/f/f00001.htm"
objXMLHTTP.Open "GET", sURL, False
objXMLHTTP.Send
If objXMLHTTP.Status  200 Then
MsgBox "Status  200: " & objXMLHTTP.Status
Exit Sub
End If
sResult = objXMLHTTP.ResponseText
Set objXMLHTTP = Nothing
ActiveSheet.Cells.Clear
pLi = InStr(sResult, "
0 Then pRe = InStrRev(sResult, "
") If pRe 0 Then ausCP = Mid(sResult, pLi, pRe - pLi + 1) & "/TABLE>" MsgBox Right(ausCP, 50) ' stimmt das Ende? With oData .SetText ausCP .PutInClipboard End With Range("B3").Select ActiveSheet.PasteSpecial Format:="Unicode-Text", Link:=False, _ DisplayAsIcon:=False Stop mC = Cells(3, Columns.Count).End(xlToLeft).Column Range("B2").Resize(, mC).FormulaLocal = "=Anzahl2(B3:B500)" For i = mC To 5 Step -1 If Cells(2, i) = 0 Then Columns(i).Delete Next End If End If End Sub

Es kopiert die komplette Tabellenstruktur in das gerade aktive Tabellenblatt, schreibt die Formel = Anzahl2 in die Zeile 2, die ermittelt, ob in der Spalte Daten stehen, und löscht selbige, wenn nichts vorhanden ist.
Du hast ja zwei unterschiedliche Links angegeben; der im Makro erzeugt eine einzelne Tabelle, der andere drei untereinander.
Jedenfalls stellt Dir das Makro eine "geraffte" Ansicht zur Verfügung, die sich innerhalb von Excel sicher leichter auswerten läßt als das eklige HTML.
Wenn Du genau beschreibst, wie die Ausgabe aussehen soll, wird sich's mit vertretbarem Aufwand machen lassen.
Schöne Grüße,
Michael
P.S.: Das Makro verwendet die Zwischenablage, die nicht ohne Weiteres funktioniert (Infos dazu im eingestreuten link auf online-Excel).
Damit Du damit keinen Ärger hast, anbei doch eine Datei mit leicht geändertem Makro: https://www.herber.de/bbs/user/110564.xlsm
Anzeige
AW: HTML sehr wirr
16.01.2017 16:14:42
Mirco
Hallo Michael
Vielen Dank für deine super Antwort!
Die HTML-Tabelle ist wirklich sehr wirr. Wahrscheinlich ist aus diesem Grund unsere Schule nicht fähig, benutzerdefinierte Stundenpläne zu generieren. Ich finde den Ansatz aber sehr gut von dir, erst einmal alle Stundenpläne in Excel zu integrieren und anschliessend zu bearbeiten (auch wenn ich den code nicht vollständig lesen kann).
Ich versuche mal etwas zu schreiben, das die integrierten Pläne bearbeitet und werde bestimmt bald weitere Fragen posten! ;-)
Gruss Mirco
AW: HTML sehr wirr
16.01.2017 17:11:07
Michael
Hi Mirco,
ich sehe grad, daß die Forumssoftware ein paar Zeilen verhackstückt hat, z.B.
pLi = InStr(sResult, " 0 Then

Das liegt wohl an den enthaltenen ">" usw.
Wenn Du mir mitteilst, was Du nicht verstehst, erkläre ich's Dir gerne.
Happy Exceling,
Michael
Anzeige
AW: HTML sehr wirr
19.01.2017 09:16:31
Mirco
Hallo Michael
Den folgenden Part begreife ich nicht ganz. Man zählt zuerst von links bis das gesuchte Element vorkommt, dann von rechts. Aber was macht man dann mit diesen Zahlen?

If pLi  0 Then
pRe = InStrRev(sResult, "

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige