Ich versuche, Fondsgrößen mit Morningstar-Website zu aktualisieren. Mein vorheriger Versuch mit IE-Automatisierung hat nicht funktioniert, also wechselte ich zu XML httpRequest (funktioniert auch wesentlich schneller). Jetzt habe ich Schwierigkeiten, die richtigen Zeilen aus dem Dokument, das ich von der Website bekomme, auszudrucken. Ich möchte, dass der Code mir das 3. "td" -Tag innerhalb eines "tr" -Tags gibt, das 1. "td" -Tag heißt "Fund Size (Mil)". Der Code durchläuft also alle Überschriften der "td" -Tags und springt in Aktion, wenn er das "{line heading}" = "Fund Size (Mil)"
findet. Jetzt ist das das Problem. Ich weiß nicht, wie ich mich auf diese Überschriften beziehen soll.HTML-Analyse in VBA
Ich habe versucht, jedes "td" -Tag als Variable zu setzen (es gibt 3 "td" -Tags in einem "tr" -Tag, also hatte ich Variablen row1, row2, row3 für jedes "td-tag"), aber wenn ich versuche, dies jetzt zu tun, erhalte ich ein Laufzeitfehler 438: Objekt nicht diese Eigenschaft oder Methode in Linie
Debug.Print TDElements.getElementsByTagName("tr")(0).Cells(0).innerHTML
Zusätzlich unterstützt, wenn ich Debug.Print TDElement.innerHTML
, ich sehe nicht, die "td" -Tags, die ich brauche. Wenn ich stattdessen am Ende .innerText
setze, sehe ich alle "td" -Tags.
Nun sind die Fragen: 1) Wie kann ich direkt auf die Überschriften verweisen? (Siehe die kommentierten Codezeilen innerhalb For Each
Schleife unten) 2) Was kann der Grund sein, dass ich nicht alle Td-Tags mit .innerHTML sehe, aber ich sehe sie mit .innerText?
URL http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW Excel 2010, IE Version 11.
Sub XMLhttpRequestTest2()
'Microsoft XML, v 6.0
'Microsoft HTML object library, used in parsing HTML
Dim myurl As String
Dim TDElement As Object
Dim TDElements As IHTMLElementCollection
Dim IE As MSXML2.XMLHTTP60
Dim HTMLDoc As MSHTML.HTMLDocument
Dim HTMLBody As MSHTML.HTMLBody
Set IE = New MSXML2.XMLHTTP60
Set HTMLDoc = New MSHTML.HTMLDocument
Set HTMLBody = HTMLDoc.body
myurl = "http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW"
IE.Open "GET", myurl, False
IE.send
HTMLBody.innerHTML = IE.responseText
Set TDElements = HTMLDoc.getElementsByTagName("td")
For Each TDElement In TDElements
Debug.Print TDElement.innerText '.innerText/.innerHTML. Can't see the fund size with .innerHTML??
' If "{line heading}" = "Fund Size (Mil)" Then 'How can I refer to headings in the html document?
' Worksheets("Sheet3").Range("B3") = Split("{line text}", ";")(1) 'reference to line text?
Next
End Sub
h2so4 ist die obige Problem behoben Antwort. Unten ist eine Erweiterung der ersten Frage.
Jetzt wird dem TDElement ein paar Textzeilen zugewiesen (ich habe den Wert von h2so4 auf 10 umgestellt, so dass der Code die nächsten 3 Zeilen anzeigt, wenn fondsize_string gefunden wird). Wie kann ich das weiter analysieren? Aktuelle Zeile Worksheets("helper").Cells(x, 6).Value = Split(TDElement.innerText, " ")(1)
gibt den Wert zurück, den ich brauche (769,28), aber für die Zukunft wäre es hilfreich, wenn ich wirklich verstehen würde, was genau hier passiert.
Also, nur für Übung, wie würde ich alle 3 Zeilen in ihren eigenen Zellen gedruckt bekommen? Die Ausgabe wäre also: Fondsgröße (Mil), 31/08/2017, 769,28 in Zellen (x, 6), (x, 7), (x, 8). Wenn ich die Funktionen "Split" oder "Left" zu TDElement ausprobiere, zielen die Funktionen nur auf die letzte Zeile, nicht auf die anderen Zeilen darüber. Wenn ich jedoch die Debug.Print TDElement.innerText
/.innerHTML
sehe, sehe ich auch die anderen Zeilen. Wie kann ich also auf die Zeilen über der letzten Zeile "zugreifen"?
Ausgabe von Debug.Print TDElement.innerText
:
Fondsvolumen (Mil)
31/08/2017
EUR 769,28
Vielen Dank! Das funktioniert.Ich habe Ihren Code geändert, indem ich eine neue Integer-Variable n deklariert habe und sie auf 3 statt 10 setze (zielt nur auf die Zeilen, die ich brauche). Ich möchte jedoch wissen, warum ich nur die letzte Zeile parsen kann, die der Code zurückgibt. Bitte beachten Sie die ** Erweiterung der ersten Frage ** oben. – Samppa