Я бы посмотрел на фактический запрос xmlhttp как на более быстрый метод поиска. Пока что, хотя и немного необычно, просмотрите структурную переписку вашего ответа с некоторыми примечаниями.
Примечание:
1) Перемещение объекта IE из цикла и создание видимого перед циклом. То же самое для некоторых других переменных, не затронутых циклом, например BaseUrl.
2) Сокращение выбора значений для максимума и минимума за последние 52 недели с использованием селекторов css для выбора соответствующих элементов
3) При необходимости используйте операторы With, например. для определения lastrowStockTickerPE
4) Убрать лишнее дополнительное ожидание
5) Удалить Set = Ничего, где не требуется, поскольку объекты будут разыменовываться, когда находятся вне области действия
Option Explicit
Public Sub Retrieve_PE_Low_High()
Dim DownloadInfoSheet As Worksheet, OutputSheet As Worksheet
Dim Stockticker As Long, lastrowStockTickerPE As Long
Dim baseURL As String, searchResultsURL As String
Dim HTMLDoc As HTMLDocument, oIE As InternetExplorer
Set DownloadInfoSheet = ActiveWorkbook.Worksheets("DownloadInfo") 'Sheet to retrieve stockticker from
Set OutputSheet = ActiveWorkbook.Worksheets("Output") 'Where data will be assigned
Set oIE = New InternetExplorer
baseURL = DownloadInfoSheet.Cells(3, "A")
With DownloadInfoSheet
lastrowStockTickerPE = .Cells(.Rows.Count, "D").End(xlUp).Row
End With
With oIE
.Visible = True
For Stockticker = lastrowStockTickerPE To lastrowStockTickerPE '<==presumably your endpoint is not always the same as start
searchResultsURL = baseURL & DownloadInfoSheet.Cells(Stockticker, "C").Value 'Add the ticker symbol to the original URL link, example "https://www.nasdaq.com/symbol" + "ADP" = "https://www.nasdaq.com/symbol/ADP"
.Navigate2 searchResultsURL
While .Busy Or .readyState < 4: DoEvents: Wend
Set HTMLDoc = .document
Dim high As Object, low As Object
With HTMLDoc
On Error Resume Next
Set high = .querySelector(".infoTable.trading-activitiy tr + tr td:last-child")
Set low = .querySelector(".infoTable.trading-activitiy tr + tr + tr td:last-child")
Debug.Print high.innerText, low.innerText
On Error GoTo 0
If high Is Nothing Or low Is Nothing Then
'dummy
Else
'other code to write to sheet
End If
End With
Set high = Nothing: low = Nothing
Next Stockticker
.Quit
End With
End Sub
Пример запроса XMLHTTP, который вы можете адаптировать к циклу, используя идею сверху. Интересно, что селекторы css для элементов должны быть слегка подправлены.
Option Explicit
Public Sub GetInfo()
Dim sResponse As String, html As HTMLDocument, high As Object, low As Object
Set html = New HTMLDocument
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.nasdaq.com/symbol/AAPL", False
.send
html.body.innerHTML = StrConv(.responseBody, vbUnicode)
End With
On Error Resume Next
Set high = html.querySelector(".infoTable.trading-activitiy tr + tr td + td")
Set low = html.querySelector(".infoTable.trading-activitiy tr + tr + tr td + td")
Debug.Print high.innerText, low.innerText
On Error GoTo 0
End Sub