Excel VBA e HTML DOM: imansible fare clic sulla scheda

In Excel 2003 VBA, sto cercando di sfogliare questa pagina web …

https://www.google.com/finance?q=NYSE%3AWSO&fstype=ii&ei=cy30UrCEI8KKiALOPw

… e fai clic su queste due tabs:
– "Stato patrimoniale"
– "Dati annuali"

Ecco come sembra l'HTML per quelle tabs:
<a class=t><b class=t><b class=t>Balance Sheet</b></b></a>
e
<a id=annual class="id-annual nac">Annual Data</a>

Trovare i dati annuali con getElementById, e cliccandolo su di esso, ha funzionato bene.

Tuttavia, il bilancio non ha alcun ID. L'utilizzo di getElementByClass sarebbe ambiguo con più di un elemento che ha la class " t ". E non sembra essere un getElementByInnerText o getElementByInnerHTML.

Così ho passato attraverso tutti gli elementi, cercando il nome di class " t ", e poi cerco "conto bilancio" di innerText. Sono in grado di trovare l'elemento (tre di loro, che suppongo è previsto dato la sua struttura), ma cliccando che non ha alcun effetto (ho provato cliccando tutti e tre).

Ma quando ho provato questo metodo con i dati annuali, ha funzionato bene.

Cosa devo fare per poter fare clic sulla scheda "Stato patrimoniale"? Sono abbastanza sicuro che lo trovo; semplicemente non cliccando con successo su di esso.

Ecco il mio codice:

 Option Explicit Sub TestMain() Dim strURL As String strURL = "https://www.google.com/finance?q=NYSE%3AWSO&fstype=ii&ei=cy30UrCEI8KKiALOPw" Call Main(strURL) End Sub Function Main(url_string As String) Dim oIE As Object, oDoc As Object, oElem As Object Set oIE = CreateObject("InternetExplorer.Application") oIE.Visible = True oIE.Navigate url_string Do While oIE.Busy Application.Wait DateAdd("s", 1, Now) Loop Set oDoc = oIE.document 'Annual Data tab: Set oElem = GetElementsByClassNameAndInnerText(oDoc, "id-annual", True, "Annual Data", False) oElem.Click 'this works. 'Quarterly Data: Set oElem = GetElementsByClassNameAndInnerText(oDoc, "id-interim", True, "Quarterly Data", False) oElem.Click 'this works. 'Balance Sheet: Set oElem = GetElementsByClassNameAndInnerText(oDoc, "t", False, "Balance Sheet", True) oElem.Click 'does NOT work. 'Income Statement: Set oElem = GetElementsByClassNameAndInnerText(oDoc, "t", False, "Income Statement", True) oElem.Click 'does NOT work. oIE.Quit Set oIE = Nothing End Function Public Function GetElementsByClassNameAndInnerText(html_doc As Object, _ class_name As String, is_classname_partial As Boolean, _ inner_text As String, is_innertext_partial As Boolean) As Object Dim oElem As Object Dim bClassNameIsMatch As Boolean, bInnerTextIsMatch As Boolean For Each oElem In html_doc.All ' Debug.Print oElem.GetAttribute("class"), oElem.innertext bClassNameIsMatch = False 'init for each oElem. If is_classname_partial Then If InStr(oElem.GetAttribute("class"), class_name) > 0 Then bClassNameIsMatch = True End If Else 'classname is exact: If oElem.GetAttribute("class") = class_name Then bClassNameIsMatch = True End If End If If bClassNameIsMatch Then bInnerTextIsMatch = False 'init for each oElem. If is_innertext_partial Then If InStr(oElem.innertext, inner_text) > 0 Then bInnerTextIsMatch = True End If Else 'innertext is exact: If oElem.innertext = inner_text Then bInnerTextIsMatch = True End If End If If bInnerTextIsMatch Then If oElem.innertext = inner_text Then Set GetElementsByClassNameAndInnerText = oElem Exit For End If End If End If Next oElem End Function 

Grazie,

Greg

Non riesco a trovare un modo per fare clic su quelle tabs in modo programmato. I dati, alless le tabelle finora, possono essere scaricati anche se le tabs vengono utilizzate solo per select la divisione visibile, tutti i dati sono sulla pagina. Nella seguente function le 6 divisioni vengono copiate in un file (potrebbe essere ripulito scrivendo una function per farlo). IE viene quindi reindirizzato a questo file.

Se questo è il tipo di cosa che stai cercando di fare, potrebbe essere meglio guardare Microsofts HTML Object Library o XML in sostituzione di IE e utilizzando get ot post per get i dati.

Ho usato i riferimenti alla libreria di oggetti Microsoft HTML, ai controlli Internet Microsoft e al runtime di script di Microsoft per questa function.

 Function main(url_string As String) Dim oIE As InternetExplorer Dim oDivElement As HTMLDivElement Dim fsoObject As Scripting.FileSystemObject Dim FileHandle As Scripting.TextStream Set oIE = CreateObject("InternetExplorer.Application") oIE.Visible = True oIE.navigate url_string Do While oIE.Busy Application.Wait DateAdd("s", 1, Now) Loop Set fsoObject = New FileSystemObject Set FileHandle = fsoObject.CreateTextFile((ThisWorkbook.Path & "\Output.html"), True) Set oDivElement = oIE.document.getElementById("incinterimdiv") FileHandle.WriteLine ("Quarterly income") FileHandle.WriteLine ("<BR>&nbsp;<BR>") FileHandle.WriteLine (oDivElement.innerHTML) Set oDivElement = oIE.document.getElementById("incannualdiv") FileHandle.WriteLine ("<BR>&nbsp;<BR>") FileHandle.WriteLine ("Annual income") FileHandle.WriteLine ("<BR>&nbsp;<BR>") FileHandle.WriteLine (oDivElement.innerHTML) Set oDivElement = oIE.document.getElementById("balinterimdiv") FileHandle.WriteLine ("<BR>&nbsp;<BR>") FileHandle.WriteLine ("Quarterly balance") FileHandle.WriteLine ("<BR>&nbsp;<BR>") FileHandle.WriteLine (oDivElement.innerHTML) Set oDivElement = oIE.document.getElementById("balannualdiv") FileHandle.WriteLine ("<BR>&nbsp;<BR>") FileHandle.WriteLine ("Annual balance") FileHandle.WriteLine ("<BR>&nbsp;<BR>") FileHandle.WriteLine (oDivElement.innerHTML) Set oDivElement = oIE.document.getElementById("casinterimdiv") FileHandle.WriteLine ("<BR>&nbsp;<BR>") FileHandle.WriteLine ("Quarterly cash flow") FileHandle.WriteLine ("<BR>&nbsp;<BR>") FileHandle.WriteLine (oDivElement.innerHTML) Set oDivElement = oIE.document.getElementById("casannualdiv") FileHandle.WriteLine ("<BR>&nbsp;<BR>") FileHandle.WriteLine ("Annual cash flow") FileHandle.WriteLine ("<BR>&nbsp;<BR>") FileHandle.WriteLine (oDivElement.innerHTML) FileHandle.Close Set FileHandle = Nothing Set fsoObject = Nothing Set oDivElement = Nothing Set oIE = Nothing End Function 

Questo fa il trucco per me. Passare il codice dopo che la pagina web è stata caricata per vedere cosa sta succedendo.

 Sub test() URL = "https://www.google.com/finance?q=NYSE%3AWSO&fstype=ii&ei=cy30UrCEI8KKiALOPw" Set IE = CreateObject("InternetExplorer.Application") IE.Visible = True IE.navigate URL Do Until (IE.readyState = 4 And Not IE.Busy) DoEvents Loop ' This will 1) "unclick" "the Income Statement" sheet tab and 2) "click" the "Balance Sheet" tab; ' the data below doesn't change, just the tab IE.document.getElementbyID(":0").classname = "goog-tab" IE.document.getElementbyID(":1").classname = "goog-tab goog-tab-selected" ' This will change the data below the tabs IE.document.getElementbyID("incinterimdiv").setAttribute("Style") = "display: none;" IE.document.getElementbyID("balinterimdiv").setAttribute("Style") = "" IE.document.getElementbyID("balinterimdiv").setAttribute("Style") = "display: none;" IE.document.getElementbyID("casinterimdiv").setAttribute("Style") = "" IE.document.getElementbyID("incinterimdiv").setAttribute("Style") = "" IE.document.getElementbyID("casinterimdiv").setAttribute("Style") = "display: none;" End Sub