Live-Forum - Die aktuellen Beiträge
Datum
Titel
19.04.2024 12:23:24
19.04.2024 11:45:34
Anzeige
Archiv - Navigation
1492to1496
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

Webabfrage

Webabfrage
08.05.2016 18:28:16
Hans
Hallo zusammen,
ich habe vor einiger Zeit schon diesen Beitrag geschrieben und leider erst jetzt die Antwort gesehen. Leider kann ich auf diesen Beitrag nicht mehr antworten, bzw. finde die Funktion nicht... Hoffe Peter Kloßek findet meinen Beitrag noch einmal.
Websiten können sein:
http://www.flashscore.de/basketball/usa/nba/
http://basketball.wettpoint.com/liga/nba-usa.html
Es ist eigentlich egal aus welcher Website dies ausgelesen wird. Es geht mir nur um die Ergebnisse, bin also nicht an eine Seite gebunden.
Vielen Dank schon im Voraus.
Hey liebe Community,
ich möchte gerne Basketball-Ergebnisse direkt aus dem Internet aktualisieren (also eine Webabfrage), um die Ergebnisse nicht mehr manuell eintragen/ nachschauen zu müssen.
Unten ist meine Datei, wie die Ergebnisse dargestellt werden sollen.
In der ersten Tabelle sollten die Ergebnisse nach dem Spieltag aktualisiert werden, damit das finale Ergebnis so wie dargestellt eingetragen wird. In der unteren Tabelle der nächste Spieltag angezeigt werden.
Sobald der Nächste Spieltag gespielt wurde sollen einfach die Daten überschrieben werden, also der neue Spieltag wird mitsamt Ergebnis in die obere Tabelle geschrieben werden, die nächsten Begegnungen wieder unten hinein geschrieben.
Leider schaffe ich dies nicht alleine, da meine Excel -Kenntnisse zu beschränkt sind und ich verzweifle schon nahezu an der automatischen aktualisierung :(
Ich freue mich über Tipps, Lösungen und Erklärungen jeglicher Art :)
Vielen Dank schon im Voraus.
Gruß Hans
https://www.herber.de/bbs/user/104902.xlsx
Hallo Hans,
es besteht zwar Klarheit über den Output (Deine Tabelle), aber nicht über den Input (die zugrundeliegende WEB-Site). Ich habe die Erfahrung gemacht (Wertpapierkurse), dass nicht alle WEB-Seiten ohne weiteres nach Excel zu importieren sind. Es wäre daher schön, wenn Du mehrere WEB-Seiten, in welchen die benötigten Inhalte stehen, nennen würdest. Da Du die Daten bislang von Hand überträgst, müsste Dir zumindest eine WEB-Seite bekannt sein. Sobald mir die noch fehlende Information vorliegt, kann ich mich gerne mal um eine Lösung bemühen.
Mit freundlichem Gruß
Peter Kloßek

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Webabfrage
09.05.2016 19:04:04
Michael
Hallo Hans,
der Quelltext des oberen Links ist mit Javascript "verschlüsselt", und beim unteren Link führt das Skript
Sub WinHttp()
Dim sErg$, sStat$, sURL$
sURL = "http://basketball.wettpoint.com/liga/nba-usa.html"
With CreateObject("WinHttp.WinHttpRequest.5.1")
.Open "GET", sURL, False
.Send
sStat = .Status & " - " & .StatusText
sErg = .ResponseText
End With
MsgBox sStat
If Mid(sStat, 1, 3)  "200" Then Exit Sub
MsgBox Mid(sErg, 1, 100)
End Sub
zu einer Servermeldung "Forbidden", d.h. die Seite erkennt, daß man "maschinell" darauf zugreifen will.
Ein weiterer Versuch mit dem IE funktionierte auch nicht - auf die Schnelle fällt mir dazu nix mehr ein.
Schöne Grüße,
Michael

Anzeige
AW: Webabfrage
09.05.2016 21:03:42
Hans
Hallo Michael,
vielen vielen Dank für die schnelle Antwort und deine Hilfe!:)
Ohje das hört sich nicht gut an ;(
Kann ich beliebige Seiten mit dem obigen Quelltext durchprobieren bis eine funktioniert oder muss ich noch etwas beachten?
10000 Dank schon im Voraus :)
Gruß Hans

Webabfrage - Alternativen?
10.05.2016 21:24:21
Michael
Hi Hans,
sieh Dir den Quelltext der Seiten an - meines Erachtens kannst Du es vergessen.
Ich setze nochmal auf offen, vielleicht fällt jemand noch was Besseres ein.
Excels "Webabfrage" (die findet sich unter "Daten") funktioniert übrigens auch nicht - habe jetzt allerdings nur den sportstats-Linke getestet.
Schöne Grüße,
Michael

Anzeige
Das funktioniert übers DOM des IE
13.05.2016 02:15:39
Zwenn
Hallo Hans,
man kann die Ergebnisse automatisch holen. Ich habe das jetzt nicht mehr fertig bekommen, es fehlen noch ein paar String-Operationen. Aber wenn Du noch Interesse daran hast, stelle ich dir eine Funktion zur Verfügung, an der Du nachvollziehen kannst, wie man Daten von Webseiten auslesen kann. Das wird natürlich kein vollständiger "Kurs", aber gewährt Dir einen Einblick in den Umgang mit dem DOM (Document Object Model) des Internet Explorers.
Ich habe mich für die Seite http://basketball.wettpoint.com/liga/nba-usa.html entschieden und kann Dir jetzt schon versichern, dass sie sich völlig problemlos auslesen lässt.
Viele Grüße,
Zwenn

Anzeige
AW: Das funktioniert übers DOM des IE
13.05.2016 14:51:14
Michael
Hi Zwenn,
das würde mich auch interessieren, da ich von Fall zu Fall an derartigen Sachen scheitere.
Wenn Du sowieso schon angefangen hast, zeig uns doch bitte den Code.
Schöne Grüße,
Michael

Die Lösung im Detail
13.05.2016 17:30:49
Zwenn
Hallo Hans,
hallo Michael,
schön dass das noch jemand liest hier. Ist ja doch schon recht weit runter gerutscht in der Liste. Ich habe mir trotzdem viel Mühe gegeben und wenn wenigstens einer davon einen Nutzen hat, um so besser :-)
Vorbemerkung
Grundsätzlich ist mir noch keine HTML-Seite untergekommen, die sich nicht auslesen lässt. Michael, Du schreibst in einer Antwort dieses Threads, die Seite erkennt, das maschinell zugegeriffen wird. Nun habe ich ja den gleichen Link wie Du ausgewählt, um die Ergebnistabelle in Excel zu importieren. Ich habe Dein Script nicht getestet, dazu aber folgendes:
Das automatisiert (maschinell, wie Du es nanntest) zugegeriffen wird, kann ein Server nur feststellen, wenn er eine Routine implementiert hat, die erkennt, dass vom gleichen Client in kurzer Abfolge viele gleichartige Seitenaufrufe kommen. Ich weiß dass eBay das mindestens vor einigen Jahren noch gemacht hat. Man bekam nach etwa 400 Zugriffen nicht mehr die angesurfte Seite angezeigt, sondern ein Captcha. Auch Google hat das, zumindest zu gleicher Zeit, entsprechend abgefangen. Es gibt auch dafür eine Lösung, die ich hier aber nicht veröffentlichen möchte.
Ein weiteres Mal ist mir eine Seitensperre passiert, als der Betreiber vermutlich seine LogFiles ausgewertet hat und feststellte, dass pro Tag etwa 4.000 Zugriffe von der gleichen IP kamen. Das war ein Webshop der etwas dubioseren Art, auf dem wir für einen Kunden bestimmte Produkte beobachteten, die dort nix zu suchen hatten. Die Lösung des Shopbetreibers war, unsere IP zu sperren. Die Lösung für uns bestand dann darin, die IP vor jedem Auslesevorgang zu ändern.
Für das, was Hans möchte, brauchen wir aber nur einen einzigen Zugriff auf die Seite. Diesen erreichen wir durch das "Fernsteuern" des Internet Explorers, den auch der normale Anwender benutzt. Deshalb ist es nach meinem Dafürhalten in diesem Fall absolut unmöglich, dass der Server erkennt, ob ein Mensch die Adresse in den Browser eingegeben hat, oder ein Script.
Aufbau des Makros
In der angehängten Arbeitsmappe befindet sich das Modul NBA_Ergebnisse_holen. In diesem gibt es ein Sub NBA_Ergebnisse_Holen() als Makro, welches jedoch lediglich dazu dient, die eingelesenen Werte auszugeben. Die eigentliche Arbeit erledigt die Funktion ErgebnisArrayFuellen().
Diese Funktion liest alle verfügbaren Informationen der Ergebnistabelle in ein dynamisches Array ein. Ich habe es dynamisch gemacht, weil ich nicht weiß, ob immer 20 Datensätze geholt werden, wenn das Makro verwendet wird. Sollten noch nicht alle Spiele eines Spieltages beendet sein, könnten es ja auch weniger sein. Für ein Array habe ich mich entschieden, weil man damit für die Ausgabe in eine Tabelle komplett unabhängig vom Einlesen der Daten ist. Dazu mehr in den Kopf-Kommentaren des Makros.
Vorarbeit, um das Makro programmieren zu können
Um unser Ziel zu erreichen, die Ergebnistabelle von http://basketball.wettpoint.com/liga/nba-usa.html nach Excel zu importieren, müssen wir den HTML-Code der Seite dahingehend analysieren, ob sich der Bereich mit der Tabelle eindeutig identifizieren lässt. Heutige Internetseiten halten sich glücklicherweise inzwischen an den Grundsatz die Struktur einer Seite vom Design zu trennen. Deshalb findet man in vielen der verwendeten HTML-Abschnitte zur Gliederung des Seitenaufbaus eindeutige IDs (einmalige Namen im Dokument), Namen von CSS Vorgaben und jede Menge Attribute mit zugehörigen Werten.
So ist es auch hier. Die Ergebnistabelle steht in einer HTML-Tabelle, die mit folgender Zeile eingeleitet wird (Tag-Klammerung habe ich durch Eckige Klammern ersetzt, weil die Darstellung hier sonst nicht funktioniert:
[table summary="NBA Ergebnisse USA"]
Nach einem kurzen Test (kopieren und im Quelltext suchen) stellen wir fest, das Attribut "summary" mit dem zugehörigen Wert "NBA Ergebnisse USA" ist auf der Seite nur einem einzigen table-Tag zugeordnet, wobei es 12 table-Tags gibt. Diesen Umstand nutzen wir aus.
Ich habe im Makro sehr viel kommentiert und bitte euch dort nachzusehen, wie diese Informationen in der Programmierung verwendet werden. An dieser Stelle möchte ich nur zwei Adressen angeben, die einem das Leben extrem vereinfachen, wenn man Webseiten auslesen will:
1. http://jsbeautifier.org/
In diese Seite kann man HTML-Code und Javascript-Code einfügen, der sich sonst nicht entziffern lässt. Nach einem Klick auf den Beautify-Button bekommt man sehr schön strukturierten Code. Ich habe das mit dem HTML-Teil gemacht, der die Ergebnistabelle enthält:

[table summary="NBA Ergebnisse USA"]
[tr]
[td width="120px"]14.04.16, 04:30 Uhr[/td]
[td class="sps1"][b]L.A. Lakers[/b] - Utah Jazz[/td]
[td class="sps1"][b]101 : 96[/b]  (19:21) (23:36) (24:18) (35:21) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]14.04.16, 04:30 Uhr[/td]
[td class="sps1"][b]Golden State Warriors[/b] - Memphis Grizzlies[/td]
[td class="sps1"][b]125 : 104[/b]  (37:23) (33:27) (32:31) (23:23) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]14.04.16, 04:30 Uhr[/td]
[td class="sps1"][b]Portland Trail Blazers[/b] - Denver Nuggets[/td]
[td class="sps1"][b]107 : 99[/b]  (27:31) (31:25) (29:23) (20:20) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]14.04.16, 04:30 Uhr[/td]
[td class="sps1"][b]Phoenix Suns[/b] - L.A. Clippers[/td]
[td class="sps1"][b]112 : 105[/b]  (25:27) (37:28) (23:20) (27:30) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]14.04.16, 02:00 Uhr[/td]
[td class="sps1"]Cleveland Cavaliers - [b]Detroit Pistons[/b][/td]
[td class="sps1"][b]110 : 112[/b]  (24:29) (20:29) (28:24) (31:21) n.V. [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]14.04.16, 02:00 Uhr[/td]
[td class="sps1"][b]Boston Celtics[/b] - Miami Heat[/td]
[td class="sps1"][b]98 : 88[/b]  (13:35) (25:27) (25:5) (35:21) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]14.04.16, 02:00 Uhr[/td]
[td class="sps1"]Dallas Mavericks - [b]San Antonio Spurs[/b][/td]
[td class="sps1"][b]91 : 96[/b]  (27:20) (25:14) (15:31) (24:31) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]14.04.16, 02:00 Uhr[/td]
[td class="sps1"][b]Washington Wizards[/b] - Atlanta Hawks[/td]
[td class="sps1"][b]109 : 98[/b]  (33:33) (24:26) (27:17) (25:22) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]14.04.16, 02:00 Uhr[/td]
[td class="sps1"][b]Chicago Bulls[/b] - Philadelphia 76ers[/td]
[td class="sps1"][b]115 : 105[/b]  (16:32) (35:28) (35:13) (29:32) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]14.04.16, 02:00 Uhr[/td]
[td class="sps1"][b]Minnesota Timberwolves[/b] - New Orleans Pelicans[/td]
[td class="sps1"][b]144 : 109[/b]  (40:23) (32:27) (34:29) (38:30) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]14.04.16, 02:00 Uhr[/td]
[td class="sps1"][b]Houston Rockets[/b] - Sacramento Kings[/td]
[td class="sps1"][b]116 : 81[/b]  (34:18) (30:26) (28:20) (24:17) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]14.04.16, 02:00 Uhr[/td]
[td class="sps1"]Brooklyn Nets - [b]Toronto Raptors[/b][/td]
[td class="sps1"][b]96 : 103[/b]  (26:16) (21:33) (19:29) (30:25) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]14.04.16, 02:00 Uhr[/td]
[td class="sps1"][b]Charlotte Hornets[/b] - Orlando Magic[/td]
[td class="sps1"][b]117 : 103[/b]  (38:22) (28:28) (20:29) (31:24) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]14.04.16, 02:00 Uhr[/td]
[td class="sps1"]Milwaukee Bucks - [b]Indiana Pacers[/b][/td]
[td class="sps1"][b]92 : 97[/b]  (20:37) (26:25) (24:16) (22:19) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]13.04.16, 04:30 Uhr[/td]
[td class="sps1"][b]L.A. Clippers[/b] - Memphis Grizzlies[/td]
[td class="sps1"][b]110 : 84[/b]  (29:22) (32:21) (23:21) (26:20) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]13.04.16, 02:00 Uhr[/td]
[td class="sps1"][b]San Antonio Spurs[/b] - Oklahoma City Thunder[/td]
[td class="sps1"][b]102 : 98[/b]  (21:32) (22:21) (31:19) (19:21) n.V. [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]13.04.16, 01:30 Uhr[/td]
[td class="sps1"]Detroit Pistons - [b]Miami Heat[/b][/td]
[td class="sps1"][b]93 : 99[/b]  (17:19) (33:31) (19:21) (24:28) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]13.04.16, 01:30 Uhr[/td]
[td class="sps1"][b]Toronto Raptors[/b] - Philadelphia 76ers[/td]
[td class="sps1"][b]122 : 98[/b]  (32:23) (23:38) (32:13) (35:24) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]13.04.16, 01:00 Uhr[/td]
[td class="sps1"][b]Indiana Pacers[/b] - New York Knicks[/td]
[td class="sps1"][b]102 : 90[/b]  (29:36) (24:18) (26:16) (23:20) [/td]
[td class="sps1"]FT[/td]
[/tr]
[tr]
[td width="120px"]12.04.16, 04:00 Uhr[/td]
[td class="sps1"]Phoenix Suns - [b]Sacramento Kings[/b][/td]
[td class="sps1"][b]101 : 105[/b]  (22:26) (27:30) (23:31) (29:18) [/td]
[td class="sps1"]FT[/td]
[/tr]
[/table]
So sieht man sehr schön den gleichmäßigen Aufbau der Tabelle. Jeder Datensatz (also jedes Spiel) wird durch tr-Tags begrenzt. Innerhalb dieser Tags gibt es jedesmal 4 td-Tags, die die Informationen enthalten, die wir wollen. Wie wir da nun ran kommen, schaut bitte im Quellcode der Funktion ErgebnisArrayFuellen() nach. Leider läßt er sich nicht lesen, wenn ich ihn hier rein kopiere, weil sich sehr viele Zeilenumbrüche ergeben, die das Ganze unübersichtlich machen. Schaut also bitte in die hochgeladene Arbeitsmappe.
2. http://software.hixie.ch/utilities/js/live-dom-viewer/
In diese Seite kann man den Quelltext einer HTML Seite kopieren und sie gibt einen den kompletten DOM-Baum aus. Für ganze Seiten wird das allerdings sehr unübersichtlich, deshalb empfehle ich nur die Codeabschnitte einzufügen, die für Euer Vorhaben relevant sind. Mit Hilfe der Baumdarstellung kann man sich in vielen Fällen besser erschließen, wie eine bestimmte Seite funktioniert.
Etwas zum DOM (Document Object Model)
Im Makro verwende ich die Überprüfung auf ein Attribut in allen table-Tags, um den benötigten HTML-Abschnitt zu identifizieren:

'Alle table-Tags durchlaufen und die Schleife verlassen, wenn das richtige anhand des
'Attributs "summary" mit dem Wert "NBA Ergebnisse USA" gefunden wurde
For Each oKnotenAst In oBrowser.document.getElementsByTagName("table")
If oKnotenAst.getAttribute(sErkennungsAttribut) = sErkennungsString Then
Exit For
End If
Next oKnotenAst
Im Bezug auf das DOM sind hier die Folgenden beiden Code-Abschnitte relevant:

oBrowser.document.getElementsByTagName("table")
oKnotenAst.getAttribute(sErkennungsAttribut)
Wie man sich leicht denken kann, wird über die erste Zeile auf HTML Tags zugegriffen, die einfach mit ihrem Namen angegeben werden. Wir benötigen "table". Es kommt mitunter vor, dass man genau weiß, das wievielte Tag man benötigt. In diesem Fall kann man sich ForEach sparen und direkt auf das Tag zugreifen. Dazu muss man wissen, dass gleiche Tags im DOM mit Inizes beginnend mit 0 durchnummeriert sind. Um auf einen bestimmten Index zuzugreifen, wird er einfach in runden Klammern hinter dem Tag-Namen angegeben:
Z.B.
oBrowser.document.getElementsByTagName("table")(0)

würde auf die erste verfügbare Tabelle der HTML-Seite zugreifen.
Attribute hingegen lassen sich nicht direkt anwählen. Deshalb muss man alle Indizes zu einem Tag mit einer Schleife durchlaufen, wie ich es in der Funktion mache.
Neben diesen beiden Möglichkeiten des Zugriffs auf das DOM, gibt es unter anderem noch die Befehle:

getElementById(ID)               'Direkter Zugriff auf einen Ast des DOM über einen eindeutigen  _
Namen
getElementsByClassName(CSS-Name) 'Zugriff auf die MENGE aller HTML-Elemente, mit dem  _
angegebenen Namen
Zu beachten ist, das eine ID nur einmal im HTML Code vorkommen darf und wir deshalb keinen Index brauchen, um auf das identifizierte Element zuzugreifen. getElementByTagName und getElementByClassName hingegen bilden immer Arrays, auf deren Elemente wir ausschließlich über ihren Index zugreifen können. Auch wenn die gefundene Menge von Elementen in einem Dokument 1 ist.
Wie kommt man aber weiter, wenn die zuvor genannten Möglichkeiten scheitern, weil die benötigten Informationen einfach nicht von der gewünschten Seite verwendet werden? In dem Fall gibt es die Möglichkeit sich direkt durch den DOM-Baum zu hangeln. Dafür gibt es vor allem die beiden Befehle:

firstChild   'Springt in der Baumhirarchie eine Ebene nach unten
nextSibling  'Springt in der Baumhirarchie zum nächsten Geschwister auf der gleichen Ebene
Aus diesen beiden Befehlen lassen sich Ketten aufbauen, die durch den DOM-Baum navigieren und an einem Zielknoten ankommen. Aus diesem Zielknoten kann dann der gewünschte Wert ausgelesen werden.
Z.B.

document.firstChild.firstChild.nextSibling.firstChild..nextSibling.nextSibling.value
document.firstChild.nextSibling.firstChild.nextSibling.innerText
document.firstChild.firstChildfirstChild.nextSibling.outerHTML
Um rauszufinden, welchen Pfad man angeben muss, empfielt sich der Link Nr.2, den ich weiter oben empfohlen habe.
Aber Achtung:
Benutzt diese Möglichkeit außerst sparsam und möglichst nicht für lange Pfade durch den Baum. Sobald etwas am Aufbau der HTML-Seite verändert wird, müssen sämtliche Pfade geprüft und angepasst werden. Deshalb so viel wie möglich mit den get-Befehlen arbeiten. Auch da muss man anpassen. Aber das ist viel viel einfacher.
Schlussbemerkung
Ich möchte hier nicht weiter ins Detail gehen. Auch wenn ich weiß, dass die gegebene Info nur an der Oberfläche kratzt und auch viele Lücken enthält. Aber probiert damit zunächst mal rum und schaut, was passiert. Mit Euren vorhandenen VBA Kenntnissen könnt Ihr Euch ja einfach mal die Zwischenergebnisse als Text ausgeben lassen.
Das DOM unterstützen übrigens alle modernen Browser. Allerdings lässt sich nur der IE direkt aus Excel heraus mit VBA für DOM benutzen, weil Excel nur mit COM Anwendungen umgehen kann. Deshalb hier noch der Link zur MS DOM-Dokumentation:
https://msdn.microsoft.com/en-us/library/hh771916%28v=vs.85%29.aspx
Klickt Ihr z.B. Methods an, so findet Ihr in der sich öffnenden Seite unter anderem die Beschreibung zum Befehl getElementByID.
Ich hoffe Ihr seid jetzt nicht noch verwirrter als vorher ;-)
Hier ist noch der Donloadlink für das Makro:

Die Datei https://www.herber.de/bbs/user/105550.xlsm wurde aus Datenschutzgründen gelöscht


Viele Grüße,
Zwenn

Anzeige
wow, das fetzt
13.05.2016 20:04:15
Michael
Hi Zwenn,
ich klicke mal kurz auf absenden und melde mich gleich noch mal - habe 1 neuen Rechner installiert und will sehen, ob das mit dem Herber-Cookie klappt.
Bis gleich,
Michael

Also jetzt
13.05.2016 22:46:07
Michael
Hi Zwenn,
das Ding bleibt bei meiner alten Maschine bei "oBrowser.ReadyState = 4" hängen (irgendwas mit unbekannter Eigenschaft, wohl vom "nie" benutzten IE), auf der Neuen geht es klaglos.
Herzlichen Dank für die viele Mühe und die Erklärungen.
Ich habe "meinen" Quellcode nochmal getestet, da kommt "403-forbidden", aber: ich habe eben noch die Variante mit "Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")" getestet, die gibt 200 (also ok) zurück.
Irgendwann setze ich mal nen Webserver auf und lese aus, was welche Objekte als Browser-ID weitergeben; das gute WinHttpRequest zickt jedenfalls häufig.
Meine Idee war, die Tabelle aus dem Rückgabestring von XMLHTTP auszuschneiden und in die Zwischenablage zu kopieren, von wo aus sie in die Tabelle eingefügt werden kann bzw. wird:
Sub NochEinTest()
'Quelle:
' https://www.herber.de/forum/archiv/1304to1308/1306802_MSXML2XMLHTTPObjekt_parsen_GetElementByID.html
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
Dim von As Long, bis As Long
Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
sURL = "http://basketball.wettpoint.com/liga/nba-usa.html"
objXMLHTTP.Open "GET", sURL, False
objXMLHTTP.Send
MsgBox "Status: " & objXMLHTTP.Status
sResult = objXMLHTTP.ResponseText
Set objXMLHTTP = Nothing
von = InStr(sResult, "<table summary=")
bis = InStr(von + 10, sResult, "</table>") + 7
sResult = Mid(sResult, von, bis - von + 1)
With oData
.SetText sResult
.PutInClipboard
End With
Sheets(2).Activate
Range("B2").Select
ActiveSheet.PasteSpecial Format:="Unicode-Text", Link:=False, _
DisplayAsIcon:=False
With Sheets(2).Range("B2").CurrentRegion
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Sheets(2).Columns("B:E").Select
Sheets(2).Columns("B:E").EntireColumn.AutoFit
End Sub
So, das hat mich jetzt interessiert.
Natürlich werde ich mir Deine Variante noch intensiv zu Gemüte führen: nochmal herzlichen Dank dafür!
Und jetzt endlich ab zum Rest vom "Tatort",
schöne Grüße,
Michael

Anzeige
AW: Also jetzt
13.05.2016 23:33:40
Zwenn
Hi Michael,
die Erfahrung mit "alten Kisten" kenne ich. Gut dass es mit dem neuen Equipment funktioniert. Grundsätzlich ist es so, dass manche Methoden erst ab dem IE 10 funktionieren. (Mal 'DOM Level' googeln) Deine "neuere Kiste" dürfte den IE 11 installiert haben. Damit geht alles, was ich programmiert habe. Warum das Makro jetzt ausgerechnet bei Ready State hängen bleibt kann ich mir allerdings nicht erklären. Das gibt es schon ewig und fragt nur ab, wie weit der Ladestatus des IE ist. 4 bedeutet, 'complete loaded' der abgefragten URL. (https://msdn.microsoft.com/de-de/library/ms534361%28v=vs.85%29.aspx)
Dein Script habe ich ausprobiert. Es wirft leider mehrere Fehlermeldungen bei mir und ich weiß nicht, wie ich die alle beheben kann. Alerdings kommt es nach der ersten Fehlerbehebung bis zur Abfrage des Serverstatus. Das finde ich schon echt gut, weil ich das so nicht kannte :-)
Freut mich, wenn mein Makro jetzt bei Dir läuft und Du daraus zusammen mit meinen Erklärungen lernen kannst.
Viele Grüße,
Zwenn

Anzeige
AW: Also jetzt
14.05.2016 13:15:35
Michael
Hallo Zwenn,
stimmt, die neue hat IE 11.
Ich habe das Makro mal leicht geändert und insbesondere das Sheets(2) rausgenommen, derweil ich festgestellt habe, daß das neue XL2013 standardmäßig nur ein Blatt (bei einer neuen Datei) anlegt, keine 3 wie "früher".
Ich hab's für Dich mal in eine Datei verpackt, die laufen müßte: https://www.herber.de/bbs/user/105559.xlsm
Falls es weiterhin Fehler produzieren sollte, teil sie mir doch bitte mit: wir müßten das schon zum Laufen bringen.
Die Zeit investiere ich gerne - gerade bei Dir! Mit dem DOM hatte ich mich bislang nie beschäftigt.
Schöne Grüße,
Michael
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige