Доступ к vba IE getElementById «Требуется объект» 424 - PullRequest
1 голос
/ 10 июля 2019

это связано с этим вопросом

очистить данные из таблицы на веб-сайте без необходимости поиска тегов

этот код работал до нескольких дней назад, единственное изменение с тех пор изменилось на Windows 10, но это не должно повлиять на это, не так ли?

также кажется, что он очищает первую запись, а затем выдает ошибку. однако, если я нажимаю DEBUG, затем STEP OUT, он работает и переходит к следующей записи, и мне снова приходится нажимать DEBUG, STEP OUT и так далее. 81 раз.

Есть другие функции, вызываемые из него, они просто собирают больше материала и помещают его в таблицу, я не думаю, что они являются проблемой, но я могу добавить их при необходимости.

Строка, которая выдает ошибку 424:

If .Document.getElementById("middleContent_lbType").outerHTML Like "*General Acute Care Hospital*" Then

вот код

Public Sub VisitPages()

DoCmd.RunSQL "DELETE FROM ScrapedFacs"

    AutoID = 1
    Dim ie As New InternetExplorer
    'Set ie = New InternetExplorerMedium
    With ie
        .Visible = False
        .navigate "http://healthapps.state.nj.us/facilities/acSetSearch.aspx?by=county"

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

        With .Document
            .querySelector("#middleContent_cbType_1").Click
            .querySelector("#middleContent_cbType_4").Click
            .querySelector("#middleContent_btnGetList").Click
        End With

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

        Dim list As Object, i  As Long
        Set list = .Document.querySelectorAll("#main_table [href*=doPostBack]")
        For i = 0 To list.Length - 1
            list.Item(i).Click

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

If .Document.getElementById("middleContent_lbType").outerHTML Like "*General Acute Care Hospital*" Then
FacType = "General Acute Care Hospital"
ElseIf .Document.getElementById("middleContent_lbType").outerHTML Like "*Psychiatric Hospital*" Then
FacType = "Psychiatric Hospital"
End If


Address = Replace(Replace(Replace(.Document.getElementById("middleContent_lbAddress").outerHTML, "<span id=" & Chr(34) & "middleContent_lbAddress" & Chr(34) & ">", ""), "<br>", ", "), "</span>", "")

            WriteTable .Document.getElementsByTagName("table")(3), .Document.getElementById("middleContent_lbName_county").innerText


            'do stuff with new page
            .Navigate2 .Document.URL             '<== back to homepage
            While .Busy Or .ReadyState < 4: DoEvents: Wend
            Set list = .Document.querySelectorAll("#main_table [href*=doPostBack]") 'reset list (often required in these scenarios)

        Next
       ' Stop                                     '<== Delete me later
        .Quit '<== Remember to quit application
    End With
End Sub

1 Ответ

2 голосов
/ 12 июля 2019

Проблема в том, что вы сталкиваетесь с тем, что ваш код выполняется слишком быстро

Так что либо добавьте спящий режим перед строкой

Sleep 1
...Document.getElementById("middleContent_lbType")..

, либо начните проверять, получили ли вы возвратзначение или нет

Set obj = .Document.getElementById("middleContent_lbType")
If obj is Nothing:
   Sleep 1
   Set obj = .Document.getElementById("middleContent_lbType")
End If

If obj.outerHTML Like "*General Acute Care Hospital*" Then
...
...