VBA Code an Seite anpassen, Tabelle auslesen

  • Excel

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von User1964.

    VBA Code an Seite anpassen, Tabelle auslesen

    Guten Tag zusammen,
    mein Kollege hatte mir mal vor zwei Jahren eine Abfrage angepasst um auf einer Webseite eine Tabelle auszulesen, dieses geschieht in Excel wie folgt. In einer Zelle steht der Link zu der Webseite, dieser Link generiert sich automatisch wenn ich ein Spiel auswähle. Durch starten des Makros wird die entsprechende Tabelle ausgelesen und unterhalb des Links eingefügt. Diese Makro wurde speziel für diese Seite erstellt http://de.futbol24.com/team/Germany/RB-Leipzig/#statTR-Table=1&statTR-Limit=0

    Quellcode

    1. Sub Abfrage_Heim_Ausw()Dim IEApp As Object, all As ObjectDim zeile As Long, spalte As Integerzeile = ActiveCell.Row + 1Set IEApp = CreateObject("InternetExplorer.Application")IEApp.Visible = FalseIEApp.Navigate Range(ActiveCell.Address).TextDo While IEApp.Busy Application.Wait DateAdd("s", 1, Now)LoopSet [color=#FF0000]DivStatTR[/color] = IEApp.Document.getElementByID([color=#FF0000]"statTR"[/color])If DivStatTR.Children.Length = 2 Then For Each resultRow In Div[color=#FF0000]StatTR[/color].Children(1).Children(0).Children(0).Childrenspalte = ActiveCell.Column For Each resultColumn In resultRow.Children ' MsgBox resultColumn.innerTextActiveSheet.Cells(zeile, spalte) = resultColumn.innerText spalte = spalte + 1 Next zeile = zeile + 1 NextEnd IfIEApp.QuitSet IEApp = NothingMsgBox "Fertig"End Sub[url='http://de.futbol24.com/team/Germany/RB-Leipzig/#statTR-Table=1&statTR-Limit=0']


    Das funktiniert auch super und nun wollte ich dieses Makro an diese Seite anpassen http://eishockey.wettpoint.com/statistiken/heim-5560.html da es im Quelltext aber keinen Bezug zur ID gibt, hänge ich in der Luft.

    Quellcode

    1. [/color]&nbsp;<table summary="Anaheim Ducks Heimspiele NHL"><tr><td width="130px">20.01.2017. 04:05 Uhr</td><td class="sps1"><a href="http://eishockey.wettpoint.com/spiele/2239857.html"><b>Anaheim Ducks</b> - Colorado Avalanche</a></td><td class="sps1">2:1 (0 : 0) (0 : 1) (2 : 0) </td><td class="sps1">FT (<b>S</b>)</td><td class="sps1"><img src="/images/land/usa.gif" class="lnd" alt="USA Eishockey Ergebnisse" border="0" /></td><td class="sps2">NHL</td></tr><tr><td width="130px">18.01.2017. 04:05 Uhr</td><td class="sps1"><a href="http://eishockey.wettpoint.com/spiele/2239842.html"><b>Anaheim Ducks</b> - Tampa Bay Lightning</a></td><td class="sps1">2:1 (0 : 0) (1 : 1) (0 : 0) n.V. </td><td class="sps1">FT (<b>S</b>)</td><td class="sps1"><img src="/images/land/usa.gif" class="lnd" alt="USA Eishockey Ergebnisse" border="0" /></td><td class="sps2">NHL</td></tr><tr><td width="130px">16.01.2017. 03:05 Uhr</td><td class="sps1"><a href="http://eishockey.wettpoint.com/spiele/2239825.html">Anaheim Ducks - <b>St. Louis Blues</b></a></td><td class="sps1">1:2 (0 : 0) (0 : 1) (1 : 0) n.V. </td><td class="sps1">FT (<b>N</b>)</td><td class="sps1"><img src="/images/land/usa.gif" class="lnd" alt="USA Eishockey Ergebnisse" border="0" /></td><td class="sps2">NHL</td></tr><tr><td width="130px">11.01.2017. 04:05 Uhr</td><td class="sps1"><a href="http://eishockey.wettpoint.com/spiele/2239784.html"><b>Anaheim Ducks</b> - Dallas Stars</a></td><td class="sps1">2:0 (0 : 0) (1 : 0) (1 : 0) </td><td class="sps1">FT (<b>S</b>)</td><td class="sps1"><img src="/images/land/usa.gif" class="lnd" alt="USA Eishockey Ergebnisse" border="0" /></td><td class="sps2">NHL</td></tr><tr><td width="130px">09.01.2017. 02:05 Uhr</td><td class="sps1"><a href="http://eishockey.wettpoint.com/spiele/2239771.html">Anaheim Ducks - <b>Minnesota Wild</b></a></td><td class="sps1">1:2 (1 : 0) (0 : 2) (0 : 0) </td><td class="sps1">FT (<b>N</b>)</td><td class="sps1"><img src="/images/land/usa.gif" class="lnd" alt="USA Eishockey Ergebnisse" border="0" /></td><td class="sps2">NHL</td></tr><tr><td width="130px">07.01.2017. 04:05 Uhr</td><td class="sps1"><a href="http://eishockey.wettpoint.com/spiele/2239750.html"><b>Anaheim Ducks</b> - Arizona Coyotes</a></td><td class="sps1">3:2 (1 : 0) (1 : 1) (0 : 1) n.V. </td><td class="sps1">FT (<b>S</b>)</td><td class="sps1"><img src="/images/land/usa.gif" class="lnd" alt="USA Eishockey Ergebnisse" border="0" /></td><td class="sps2">NHL</td></tr><tr><td width="130px">05.01.2017. 04:35 Uhr</td><td class="sps1"><a href="http://eishockey.wettpoint.com/spiele/2239736.html"><b>Anaheim Ducks</b> - Detroit Red Wings</a></td><td class="sps1">2:0 (1 : 0) (0 : 0) (1 : 0) </td><td class="sps1">FT (<b>S</b>)</td><td class="sps1"><img src="/images/land/usa.gif" class="lnd" alt="USA Eishockey Ergebnisse" border="0" /></td><td class="sps2">NHL</td></tr><tr><td width="130px">02.01.2017. 02:05 Uhr</td><td class="sps1"><a href="http://eishockey.wettpoint.com/spiele/2239717.html"><b>Anaheim Ducks</b> - Philadelphia Flyers</a></td><td class="sps1">4:3 (2 : 1) (1 : 2) (0 : 0) n.P. </td><td class="sps1">FT (<b>S</b>)</td><td class="sps1"><img src="/images/land/usa.gif" class="lnd" alt="USA Eishockey Ergebnisse" border="0" /></td><td class="sps2">NHL</td></tr><tr><td width="130px">28.12.2016. 04:05 Uhr</td><td class="sps1"><a href="http://eishockey.wettpoint.com/spiele/2239677.html">Anaheim Ducks - <b>San Jose Sharks</b></a></td><td class="sps1">2:3 (0 : 1) (1 : 1) (1 : 0) n.V. </td><td class="sps1">FT (<b>N</b>)</td><td class="sps1"><img src="/images/land/usa.gif" class="lnd" alt="USA Eishockey Ergebnisse" border="0" /></td><td class="sps2">NHL</td></tr><tr><td width="130px">11.12.2016. 22:05 Uhr</td><td class="sps1"><a href="http://eishockey.wettpoint.com/spiele/2239560.html"><b>Anaheim Ducks</b> - Ottawa Senators</a></td><td class="sps1">5:1 (3 : 1) (1 : 0) (1 : 0) </td><td class="sps1">FT (<b>S</b>)</td><td class="sps1"><img src="/images/land/usa.gif" class="lnd" alt="USA Eishockey Ergebnisse" border="0" /></td><td class="sps2">NHL</td></tr><tr><td width="130px">10.12.2016. 04:05 Uhr</td><td class="sps1"><a href="http://eishockey.wettpoint.com/spiele/2239547.html"><b>Anaheim Ducks</b> - San Jose Sharks</a></td><td class="sps1">3:2 (2 : 1) (0 : 1) (1 : 0) </td><td class="sps1">FT (<b>S</b>)</td><td class="sps1"><img src="/images/land/usa.gif" class="lnd" alt="USA Eishockey Ergebnisse" border="0" /></td><td class="sps2">NHL</td></tr><tr><td width="130px">08.12.2016. 04:35 Uhr</td><td class="sps1"><a href="http://eishockey.wettpoint.com/spiele/2239528.html"><b>Anaheim Ducks</b> - Carolina Hurricanes</a></td><td class="sps1">6:5 (1 : 1) (1 : 2) (3 : 2) n.P. </td><td class="sps1">FT (<b>S</b>)</td><td class="sps1"><img src="/images/land/usa.gif" class="lnd" alt="USA Eishockey Ergebnisse" border="0" /></td><td class="sps2">NHL</td></tr></table>[color=#000000]


    Was mir auffällt, meinen Link gibt es so im Quelltext oberhalb der Tabelle nicht, über Excel Query kann ich die Webseite und nur die Tabelle auslesen, das ist aber statistisch und nicht dynamisch an meine Zelle gebunden. Bedeutet ich müsste jedesmal im Query zuerst den Link ändern, damit ich die Daten einlesen kann, das ist umständlich und bei max. 40 Abfragen jeden Tag auch lästig. Was ich geschafft habe, die Links in den Abfragen werden automatisch geändert und man klickt dann eben 40mal auf aktualisieren. Lieber wäre mir natürlich das über mein VBA die Daten in Excel aktulasiert werden, denn dazu muss ich nur ein Button anklicken und dann dauert es zwei Minuten und alles ist so wie man es für die Weiterverarbeitung benötigt.

    Hätte ich den kompletten Quellcode einspielen müssen? Dann bitte eine Rückinfo geben :P ich werde versuchen mich zu bessern.

    Ich habe mir einige Themen angeschaut Daten aus HTML-Tabelle auslesen. auch dieses hier, aber ich komme nicht weiter, weil ich wahrscheinlich einfach zu blöde bin, das ganze als Laie zu interpretieren.


    Set DivStatTR = IEApp.Document.getElementByID("statTR") hier in diesem Teil wird doch das Element festgeslegt nach dem im WQuelltext gesucht werden soll? Richtig?

    If DivStatTR.Children.Length = 2 Then
    For Each resultRow In DivStatTR.Children(1).Children(0).Children(0).Children Was hier ganz genau passiert ist mir nicht klar, aber soweit ich das verstehe sucht er in dem angegeben Bereich "StatTR" und gibt dann das Ergebnis zurück oder?

    Was muss ich wie und wo einbauen, damit die vorhanden Tabelle abgerufen wird?

    Als Beispieldatei habe ich mal eine Test-Excel-Datei hochgeladen mit dem alten Makro, vllt. hilft das weiter und jemand könnte mir zeigen wie ich da was an welcher Stelle verändern muss.

    Was ich auch nicht verstanden habe, im Makro wird zuerst nach der ID gesucht, wenn es aber keine ID gibt, muss man nach td und tr suchen oder? Was aber ist wenn dieses mehrfach vorkommt?

    Vielen Dank für eine Hilfestellung oder Lösungsvorschläge für einen alten Dummi wie mich.

    Gruß User1964 Vielen Dank fufu für die Info, aber beim Einfügen meines Makros als Code wurde automatisch nun im neuen Beitrag von mir bestimmte Zeichen rot markiert,
    das kann ich nicht ändern leider. Was habe ich falsch gemacht?

    PS: Habe ich etwas falsch gemacht bei der Beschreibung? Wie kann ich etwas verbessern, damit ich vllt. ein Antwort oder Hilfestellung erhalte oder ist das zwecklos?

    EDIT: Die Farbe rot sollte nur von Mods verwendet werden, um moderative Eingriffe leicht ersichtlich zu kennzeichnen. ~fufu

    Dateien

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „User1964“ ()

    Hi und Willkommen.

    also als erstes braucht man den Code.
    Das was du oben gepostet hast kann man ja nur sehr schwer lesen. Es gibt hier im Editor einen Button rechts über dem Textbereich da steht VB 6.0 bzw VB.net

    Am besten du postet den Code in diesem Block.
    Dein angehängtest Workbook ist xlsx und enthält nicht das komplette.

    Deine Überlegungen sind soweit korrekt. Das was ich in der Exceldatei als Script sehe geht über die ID statTR auf die Tabelle und duchläuft dann alle Children der Div, welches dann genau die Tabelle ist.

    Ich kann mir die Eishockey Seite leider nicht ansehen, da ich in der Arbeit bin.
    Das ist meine Signatur und sie wird wunderbar sein!
    Vielen Dank Mono für diese Antwort, ich wollte xlsm hochladen, aber das Format ist nicht zulässig, daher hatte ich den VBA-Code in das Tabellenblatt geschrieben.

    Ja das stimmt der Quellcode ist unübersichtlich und ich habe nach den Vorgaben nur das kopiert was was vllt. notwendig ist, aber ich erkenne eben im Quellcode nicht wie ich hier diesen VBA-Code ändern kann, damit mir die vorhandene Tabelle eingelesen wird. Der Code der Seite ist recht lang und ich dachte ich hätte genau den Abschnitt erwischt den man benötigt.
    Und es ist egal ob Eh , Fussbal oder Handball die Seite ist immer gleich aufgebaut -> Jeder Mannschaft hat eine feste Nummer nur der im Link änder sich halt Heim/Auswärts/Gesamt ect. den ich aber im Link schon abfange.

    Leider kann ich nicht erkennen ob es VB 6.0 ist oder VB.net wie sieht man das?

    Ich denke mein Problem liegt daran, das die Tabelle nicht mit einer ID im Quelltext versehen ist, somit kann ich nach "Beispiel "5560" auch nicht suchen, denn der Wert ist nicht vorhanden.
    Oberhalb der Tabelle steht folgendes:

    Quellcode

    1. <td class="content-leer1">&nbsp;</td>
    2. <td valign="top" class="content-normal">
    3. <div class="inhalt">
    4. <div class="inhalt1">Heimspiele Team Anaheim Ducks Statistiken und Ergebnisse NHL</div>


    der Code fängt dann von neuen am

    Quellcode

    1. <div style="float:right;"><a href="http://wpg.wettpoint.com/wettbonus100.html" target="_blank" rel="nofollow"><img src="http://wpg.wettpoint.com/wettbonus100.png" width="95" height="80" border="0" alt="Bonus Sportwetten gratis" /></a></diV>

    und geht dann weiter
    aber Endet eben in dieser langen Kette.
    Je mehr Spiele vorhanden sind um so mehr Einträge wird es geben.

    Was ich aber erkenne ist dieses im Code "&nbsp" nur was das zu bedeuten hat? Das tauscht mehrmal ab Zeile 69 bis 87 auf und irgenwo steckt die Tabelle drin.

    Wenn mit MS Query anzeigen würde wie es die Tabelle erkennt, dann könnte ich wohl auch einfacher das selektieren, aber es wird mir nicht angezeigt :(

    Hilfe ich Laie verstehe die Welt nicht mehr und wirklich Laie in VBAm aber Excel reicht für die Arbeit als Controller :)

    Vielen Dank
    LG User 1964
    Vermutlich muss man hier Regex verwenden und hat keine wirklich andere Wahl.
    Ich kann mir die Seite hier wie gesagt nicht anschauen weil die Firewall sie blockt, daher kann ich dir nicht konkret weiterhelfen leider.
    Vielleicht schaut es sich ja noch jemand anderes an oder ich komm zu Hause noch mal dazu.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!

    Mono schrieb:

    Vermutlich muss man hier Regex verwenden und hat keine wirklich andere Wahl.
    Ich kann mir die Seite hier wie gesagt nicht anschauen weil die Firewall sie blockt, daher kann ich dir nicht konkret weiterhelfen leider.
    Vielleicht schaut es sich ja noch jemand anderes an oder ich komm zu Hause noch mal dazu.

    LG

    Verstehe ich nicht wirklich Mono, ich rufe die Seite ohne PW und KW auf und erhalte dann die Werte, habe das gerade eben für 10 Spiele in der EH BHL gemacht, wieso sollte die geschützt sein?

    mein kleines Problem ist doch eigentlich das Excel Query die Seite auslesen kann, aber VBA nicht weil ich das entsprechende "Suchkriterium" im Quelltext nicht erkenne, das es für die Tabelle keine ID gibt. Wenn ich diesen Link anklicke gelange ich automatisch auf die Werte von Anaheim " eishockey.wettpoint.com/statistiken/heim-5560.html " kein PW oder BN notwendig.
    habe es gerade mit dem Link nochmals versucht und ich erhalte in der Anzeige alles was ich sehen möchte.

    Schade das das nich klappt aber mein EDV Leiter ist bald wieder gesund, vllt. hat der eine Idee, solange muss ich wohl warten, da ich Laie eben das Kriterium nicht erkenn. Was ich aber gefunden habe, ein VBA-Code liest die ganze Seite aus, aber eben alles, was ich aber nicht benötige. Und da dann die Zeilenanzahl stark abweicht kann ich Excel auch nicht dazu bringen nur die Tabelle auszu lesen. :(

    Hilfe
    Wir haben in der Arbeit eine Firewall nach draußen und Wettseiten sind gesperrt ;)
    Und ja, es gibt keine ID. Daher muss man vermutlich entweder über Regex gehen und die Stelle suchen oder über einen fixen Anfangspunkt (zum Beispiel immer das 3. Div Element ist es oder so)
    Das ist meine Signatur und sie wird wunderbar sein!

    Eierlein schrieb:

    Was ich aber erkenne ist dieses im Code "&nbsp" nur was das zu bedeuten hat?


    Das ist der HTML-Code für ein geschütztes Leerzeichen.

    Vielen Dank Eierlein für die Erklärung.

    Ich habe Google mal nach Regexp gesucht und Antworten erhalten, die mich aber nicht weiter bringen, denn wie soll ich nach o.g. Beispiel den Teil selektieren der die Tabelle enthält? Ich finde keine eindeutige Bezeichnung :( kann mir wirklich keiner helfen?

    Danke der Laie gibt dann an diesem Punkt auf und hofft das mein EDV-Leiter bald wieder Gesund ist.
    Hallo zusammen ich nochmal, weil ich bis jetzt keine optimale Lösung gefunden habe. Aber ich habe mir etwas selber geholfen in dem ich die Abfrage nun direkt im VBA ausführe, hat zwar mit dem Code oben dann nichts mehr zu tun, aber ich habe es nicht geschafft die Tabelle aus dem Quellcode zu filtern.

    Visual Basic-Quellcode

    1. Sub Heim_Ergebnisse()
    2. '
    3. ' Heim_Ergebnisse Makro
    4. '
    5. '
    6. ActiveWorkbook.Queries.Add Name:="Table 0", Formula:= _
    7. "let" & Chr(13) & "" & Chr(10) & " Quelle = Web.Page(Web.Contents(""http://eishockey.wettpoint.com/statistiken/heim-5564.html""))," & Chr(13) & "" & Chr(10) & " Data0 = Quelle{0}[Data]," & Chr(13) & "" & Chr(10) & " #""Geänderter Typ"" = Table.TransformColumnTypes(Data0,{{""Column1"", type text}, {""Column2"", type text}, {""Column3"", type text}, {""Column4"", type text}, {""Column5"", type text}, {""Column6"", type text}})," & Chr(13) & "" & Chr(10) & " #""Entfer" & _
    8. "nte Spalten"" = Table.RemoveColumns(#""Geänderter Typ"",{""Column5"", ""Column6""})," & Chr(13) & "" & Chr(10) & " #""Spalte nach Position teilen"" = Table.SplitColumn(#""Entfernte Spalten"",""Column4"",Splitter.SplitTextByPositions({0, 4}, false),{""Column4.1"", ""Column4.2""})," & Chr(13) & "" & Chr(10) & " #""Geänderter Typ1"" = Table.TransformColumnTypes(#""Spalte nach Position teilen"",{{""Column4.1"", type te" & _
    9. "xt}, {""Column4.2"", type text}})," & Chr(13) & "" & Chr(10) & " #""Spalte nach Position teilen1"" = Table.SplitColumn(#""Geänderter Typ1"",""Column4.2"",Splitter.SplitTextByPositions({0, 1}, true),{""Column4.2.1"", ""Column4.2.2""})," & Chr(13) & "" & Chr(10) & " #""Geänderter Typ2"" = Table.TransformColumnTypes(#""Spalte nach Position teilen1"",{{""Column4.2.1"", type text}, {""Column4.2.2"", type text}})," & Chr(13) & "" & Chr(10) & " #" & _
    10. """Entfernte Spalten1"" = Table.RemoveColumns(#""Geänderter Typ2"",{""Column4.1"", ""Column4.2.2""})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & " #""Entfernte Spalten1"""
    11. With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
    12. "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""Table 0""" _
    13. , Destination:=Range("$A$6")).QueryTable
    14. .CommandType = xlCmdSql
    15. .CommandText = Array("SELECT * FROM [Table 0]")
    16. .RowNumbers = False
    17. .FillAdjacentFormulas = False
    18. .PreserveFormatting = True
    19. .RefreshOnFileOpen = False
    20. .BackgroundQuery = True
    21. .RefreshStyle = xlInsertDeleteCells
    22. .SavePassword = False
    23. .SaveData = True
    24. .AdjustColumnWidth = True
    25. .RefreshPeriod = 0
    26. .PreserveColumnInfo = True
    27. .ListObject.DisplayName = "Table_0"
    28. .Refresh BackgroundQuery:=False
    29. End With
    30. End Sub


    Das einzige was ich nicht geschafft habe mit der Aufzeichnung des Makros sind zwei Dinge:
    a.) der Link wurde beim Aufzeichnen leider fest eingebrannt und nicht wie von mir vorgegeben aus der Zelle darüber (A5) kopiert und eingefügt
    b.) im Abfragebereich von Query werden die Abfragen nicht gelöscht, beim Aufzeichnen im Makro wird nicht erkannt was ich da mache

    In einem zweiten Teil lösche ich die Tabellen und die beiden Verbindungen dazu, um das nächste Spiel zu analysieren.

    Nun meine zwei Frage zu dem ersten Makro und nur der Teil der eigentlich das macht was ich möchte

    Visual Basic-Quellcode

    1. Sub Abfrage_Heim_Ausw()
    2. Dim IEApp As Object, all As Object
    3. Dim zeile As Long, spalte As Integer
    4. zeile = ActiveCell.Row + 1
    5. Set IEApp = CreateObject("InternetExplorer.Application")
    6. IEApp.Visible = False
    7. IEApp.Navigate Range(ActiveCell.Address).Text
    8. Do While IEApp.Busy
    9. Application.Wait DateAdd("s", 1, Now)
    10. Loop


    Wie kann man nun den erste Code so anpassen, das der Link aus der Zelle A5 genommen wird so wie es im zweiten Makro funktioniert?
    Was müsste man hinzufügen, damit auch die Abfrage im Query gelöscht wird?
    In Excel 2016 geht man über Daten und Abfragen anzeigen, dann blendet Excel auf der rechten Seite die vorhanden Abfragen ein.

    Zur Zeit reicht meine Notlösung für mich, da ich Spiel für Spiel begutachte und nicht alle 12 Favoriten neben einander stelle.

    Vielen Dank
    Mfg User 1964
    Wie kann ich das Thema als erledigt einstufen, auch wenn es das nicht ist, weil ichkeine Antworten oder Hilfe bekomme? Ich finde keine Button mit dem ich das machen könnte.
    Sorry aber wenn es einer kann dann bitte auf erledigt stellen meine Notlösung reicht mir zur Zei! Erklärt zwar nicht wieso weshalb aber damit kann ich zur Zeit in meinem Stadium leben.

    Vielen Danl an Mono und Eierlein :)

    Gruß User 1964 der alte Mann un VBA