На мой взгляд, это странный метод анализа HTML и неэффективный.
Хороший путь:
Если вы находитесь за пределами диапазона, вы можете использовать метод querySelector
, равный HTMLDocument
, если вы храните ответ в переменной HTMLDocument
. Например, я бы посмотрел на CSS-селекторы как на лучший способ получить интересующие вас данные.
Option Explicit
Public Sub test()
Dim html As HTMLDocument
Set html = New HTMLDocument
With CreateObject("WINHTTP.WinHTTPRequest.5.1")
.Open "GET", "https://finance.yahoo.com/quote/AAPL?p=AAPL", False
.send
html.body.innerHTML = .responseText
End With
Debug.Print html.querySelector("[data-test=FIFTY_TWO_WK_RANGE-value]").innertext
End Sub
При этом используется селектор CSS для нацеливания элемента по его атрибуту. []
означает селектор атрибута. Соответствует элементу с атрибутом data-test
, значение которого FIFTY_TWO_WK_RANGE-value
Элемент, о котором идет речь:
Менее желательный способ:
Менее желательным методом было бы использование Split, чтобы вырезать то, что вы хотите, например,
Debug.Print Split(Split(Split(Http2.ResponseText, "data-test=""FIFTY_TWO_WK_RANGE-value""")(1), "<")(0), ">")(1)
Версия, которая может легче соответствовать вашему коду, выглядит следующим образом (обычно я бы поместил диапазон в массив и зациклил бы его как можно быстрее, но это ближе к вашей):
Option Explicit
Public Sub test()
Dim html As HTMLDocument, http As Object, ticker As Range
Set html = New HTMLDocument
Set http = CreateObject("WINHTTP.WinHTTPRequest.5.1")
Dim lastRow As Long, myrng As Range
With ThisWorkbook.Worksheets("Main2")
lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
Set myrng = .Range("A2:A" & lastRow)
For Each ticker In myrng
If Not IsEmpty(ticker) Then
With http
.Open "GET", "https://finance.yahoo.com/quote/" & ticker.Value & "?p=" & ticker.Value, False
.send
html.body.innerHTML = .responseText
End With
On Error Resume Next
ticker.Offset(, 1) = html.querySelector("[data-test=FIFTY_TWO_WK_RANGE-value]").innertext
'ticker.Offset(, 1) = Split(Split(Split(http.ResponseText, "data-test=""FIFTY_TWO_WK_RANGE-value""")(1), "<")(0), ">")(1) ''<<Or this version
On Error GoTo 0
End If
Next
End With
End Sub