.ReadyState & .Busy 不等待 IE 页面加载

.ReadyState & .Busy Is Not Waiting For IE Page To Load

我有一些 VBA 可以启动公司内部网站,它将直接带我到我正在搜索的文档。我需要等待页面完成加载,然后点击 "Print" 按钮,这将在 Adob​​e Reader 支持的 IE 选项卡中打开文档,然后我将其作为 PDF 保存到驱动器.

我的问题是我必须等待直到网页加载的循环没有正确等待。在对 SO 进行一些研究后,我发现这是较新版本的 IE 的一个已知问题。从那以后,我尝试使用一些 XMLHTTP 方法,但我对这些方法不熟悉,而且我对它的尝试也不尽如人意(不确定如何通过点击打印 link 导航到下一页使用 XMLHTTP).

我现在的VBA如下,ieAppNew InternetExplorerMedium

    Set objShell = CreateObject("Shell.Application")
    IE_Count = 0
    IE_Count = objShell.Windows.Count
    For x = 0 To (IE_Count - 1)
        On Error Resume Next
        my_url = ""
        my_title = ""
        my_url = objShell.Windows(x).Document.Location
        my_title = objShell.Windows(x).Document.Title

        If my_url Like "http://ctdayppv002/Home/DocViewer?" & "*" Then
            Set ie = objShell.Windows(x)
            Do While ieApp.ReadyState <> 4 And ie.Busy
                DoEvents
            Loop
            For Each ee In ie.Document.getElementsByTagName("a")
                If ee.ID = "printDocLink" Then
                 ee.Click: DoEvents: Sleep 1500
                    Do While ie.ReadyState <> 4 And ie.Busy
                        DoEvents
                    Loop
                 Exit For
                End If
            Next ee
            Exit For
        Else
        End If
    Next

如果我加了一堆 Sleep 的时间,那么它会一直等,直到出现一个超过我告诉它 Sleep 的时间的文档,所以显然这不可靠解决方案。

使用以下问题作为参考,我尝试使用 XMLHTTP,但也注意到评论说此方法可能不适用于 JavaScript 个站点。

VBA hanging on ie.busy and readystate check

我对 XMLHTTP 的尝试之一:

Public ieApp As MSXML2.XMLHTTP60
Set ieApp = New MSXML2.XMLHTTP60

    With ieApp

        .Open "GET", urlString, False
        .send

        While ieApp.ReadyState <> 4
            DoEvents
        Wend

        Dim HTMLDoc As MSHTML.HTMLDocument
        Dim HTMLBody As MSHTML.HTMLBody

        Set HTMLDoc = New MSHTML.HTMLDocument
        Set HTMLBody = HTMLDoc.body
        HTMLBody.innerHTML = ieApp.responseText
        Debug.Print HTMLBody.innerHTML

    End With

在生成的 HTMLBody.innerHTML 中,我没有看到 "printDocLink" 元素。

仅供参考 - 我一直在给创建网站数据库的公司的代表发电子邮件,他们不相信有一个 API 调用可以直接导出为 PDF,我希望是可以完全跳过 "Print" 按钮。

根据 Tim Williams 和 QHarr 的建议,我找到了适合我的解决方案。

我加了一个Do Until,还有一个6秒的定时器:

            t = Now + TimeValue("0:00:6")
            Do Until .Document.getElementById("printDocLink") <> 0
                DoEvents: Sleep 1000
                If Now > t Then
                    Call Not_Found_PPV(N, searchitem)
                    .Quit
                    Set ieApp = Nothing
                    GoTo NxtInv
                End If
            Loop