Как и braX написал в своем комментарии, getElementsByClassName()
генерирует коллекцию узлов. Элементы коллекции обозначены именами классов css в скобках. Каждый элемент имеет индекс, как в массиве. Первый индекс равен 0. В вашей коллекции узлов только один элемент. Таким образом, вы должны использовать индекс 0, чтобы получить его из коллекции.
Другая проблема - HTML.Document
. Это не сработает, потому что HTML
- это пустой документ html, который вы создали с помощью строки Set HTML = CreateObject("HTMLFile")
, и вы также ссылаетесь на document
. Вы можете использовать документ в IE напрямую.
Правая строка: Debug.Print IE.Document.getElementsByClassName("Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)")(0).innerText
Вы можете использовать IE, но он медленный:
Sub Pull_Option_Price()
Dim url As String
Dim IE As Object
url = "https://ca.finance.yahoo.com/quote/SQ200717C00065000?p=SQ200717C00065000"
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate url
Do Until IE.ReadyState = 4: DoEvents: Loop
Debug.Print IE.Document.getElementsByClassName("Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)")(0).innerText
End Sub
Более быстрый вариант: Если на странице нет содержимого Dynami c, которое необходимо загрузить, вы можете использовать более быстрый HTTP-запрос xml. Одно ограничение: getElementsByClassName()
работает только при раннем связывании с xhr. Итак, вам нужны следующие две ссылки на библиотеки в Excel: Microsoft HTML Библиотека объектов Microsoft XML, v6.0
Sub Pull_Option_Price_xhr()
Dim xhr As MSXML2.XMLHTTP60
Dim htmlDoc As MSHTML.HTMLDocument
Dim url As String
url = "https://ca.finance.yahoo.com/quote/SQ200717C00065000?p=SQ200717C00065000"
Set xhr = New MSXML2.XMLHTTP60
Set htmlDoc = New MSHTML.HTMLDocument
xhr.Open "GET", url, False
xhr.Send
htmlDoc.body.innerHTML = xhr.responseText
Debug.Print htmlDoc.getElementsByClassName("Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)")(0).innerText
End Sub