В Excel 2003 VBA я пытаюсь перейти на эту веб-страницу...
https://www.google.com/finance?q=NYSE%3AWSO&fstype=ii&ei=cy30UrCEI8KKiALOPw
...и откройте на нем две вкладки:
- "Балансовый отчет"
- "Годовые данные"
Вот как выглядит HTML для этих вкладок:<a class=t><b class=t><b class=t>Balance Sheet</b></b></a>
и<a id=annual class="id-annual nac">Annual Data</a>
Поиск годовых данных с помощью getElementById и нажатие на них работали нормально.
Но балансовый отчет не имеет идентификатора. Использование getElementByClass было бы неоднозначным с более чем одним элементом с именем класса "t". И, похоже, нет getElementByInnerText или getElementByInnerHTML.
Итак, я просмотрел все элементы, ища имя класса «t», а затем искал innerText «Балансовый отчет». Я могу найти элемент (три из них, что, я думаю, ожидается, учитывая его структуру), НО щелчок по нему не дает никакого эффекта (я пытался щелкнуть все три).
Но когда я попробовал этот метод с годовыми данными, он работал нормально.
Что мне нужно сделать, чтобы иметь возможность щелкнуть вкладку «Баланс»? Я почти уверен, что нашел его; просто не удачно нажав на него.
Вот мой код:
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
Спасибо,
Грег