Как оптимизировать кодирование Excel VBA для селектора запросов, выбирая модифицированный URL в скрипте - PullRequest
0 голосов
/ 10 октября 2019

Я попробовал код ниже. Большую часть времени бег застрял в on error goto 0 и безуспешно в дальнейших шагах .fireevent ("onchange"). Может быть, каким-то образом можно оптимизировать процесс лучше. Пожалуйста, помогите мне за это, спасибо заранее.

Public Sub makeselections()

Dim ie As New InternetExplorer, var As String, ele As Object

var = ThisWorkbook.Worksheets("Sheet2").Cells(1, 1).value

With ie
.Visible = True
.Navigate2 "https://www.marketwatch.com/investing/stock/" & var & "/financials"

While .Busy Or .readyState < 4: DoEvents: Wend

With .document
  .querySelector("#autocomplete_input").value = var
  .querySelector("#investing_ac_button").Click
End With

While .Busy Or .readyState < 4: DoEvents: Wend

With .document
Do
 On Error Resume Next
   Set ele = .querySelector("[value^='/investing/stock/" & LCase(var) & "/financials/Income/quarter']")
 On Error GoTo 0

 Loop While ele Is Nothing
   .querySelector("[value^='/investing/stock/" & LCase(var) & "/financials/Income/quarter']").Selected = True
   .querySelector(".financials select").FireEvent "onchange"
 End With

 End With

End Sub

1 Ответ

0 голосов
/ 10 октября 2019

Предположительно, он застрял, так как ele остается. Ничего, т. Е. Тикер не найден или, по крайней мере, значение href не найдено. Используйте синхронизированный цикл для разрешения выхода

Option Explicit
Public Sub MakeSelections()
    Dim ie As New InternetExplorer, var As String, ele As Object, t As Date
    Const MAX_WAIT_SEC As Long = 10

    var = ThisWorkbook.Worksheets("Sheet2").Cells(1, 1).Value

    With ie
        .Visible = True
        .Navigate2 "https://www.marketwatch.com/investing/stock/" & var & "/financials"

        While .Busy Or .readyState < 4: DoEvents: Wend

        With .document
            .querySelector("#autocomplete_input").Value = var
            .querySelector("#investing_ac_button").Click
        End With

        While .Busy Or .readyState < 4: DoEvents: Wend

        With .document
            t = Timer
            Do
                On Error Resume Next
                Set ele = .querySelector("[value$='quarter']")
                On Error GoTo 0
                If Timer - t > MAX_WAIT_SEC Then Exit Do
            Loop While ele Is Nothing
            If ele Is Nothing Then Exit Sub
            ele.Selected = True
            .querySelector(".financials select").FireEvent "onchange"
        End With
    End With
End Sub
...