Excel .ReadyState&。忙碌不是等待IE页面加载

Excel .ReadyState&。忙碌不是等待IE页面加载,excel,vba,internet-explorer-11,Excel,Vba,Internet Explorer 11,我有一些VBA来启动一个公司内部网站,它将直接把我带到我正在搜索的文档。我需要等待页面完成加载,然后点击“打印”按钮,该按钮将在Adobe Reader支持的IE选项卡中打开文档,然后将其保存为PDF格式到驱动器中 我的问题是,我必须等待网页加载的循环没有正确等待。对此做了一些研究,我发现这是IE新版本中的一个已知问题。此后,我尝试了一些XMLHTTP方法,但我对这些方法并不熟悉,我的尝试也失败了(不确定如何使用XMLHTTP点击打印链接导航到下一页) 我当前的VBA如下所示,ieApp是New

我有一些VBA来启动一个公司内部网站,它将直接把我带到我正在搜索的文档。我需要等待页面完成加载,然后点击“打印”按钮,该按钮将在Adobe Reader支持的IE选项卡中打开文档,然后将其保存为PDF格式到驱动器中

我的问题是,我必须等待网页加载的循环没有正确等待。对此做了一些研究,我发现这是IE新版本中的一个已知问题。此后,我尝试了一些
XMLHTTP
方法,但我对这些方法并不熟悉,我的尝试也失败了(不确定如何使用
XMLHTTP
点击打印链接导航到下一页)

我当前的VBA如下所示,
ieApp
New 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
在生成的
HTMLBody.innerHTML
中,我没有看到
“printDocLink”
元素


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

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

我添加了一个直到为止的
Do,以及一个持续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
t=Now+TimeValue(“0:00:6”)
直到.Document.getElementById(“printDocLink”)0为止
睡眠时间:1000
如果现在>然后
呼叫未找到PPV(N,搜索项)
退出
设置ieApp=Nothing
后藤
如果结束
环

当它出现故障时,您到底看到了什么?您可以在一个循环中使用一个较短的睡眠来检查(必要时进行错误处理)所需的结果,而不是使用单一睡眠。@TimWilliams您指的是Internet Explorer方法还是XMLHTTP?当使用IE时,我不一定“看到”任何东西,它只是转到代码的下一部分,这显然不起作用,因为它没有机会点击打印按钮。当然,添加长时间睡眠可以让它有时间加载并点击打印,然后VBA代码的其余部分就可以正常工作了。使用XMLHTTP似乎做了同样的事情,但我告诉它打印返回整个页面JavaScript的innerHTML。@TimWilliams请原谅我听起来很愚蠢,但是当我使用
If ee.ID=“printDocLink”Then
时,我不是在检查期望的结果吗?在该元素存在之前不前进的尝试将在上面的
Do While
循环中进行?@TimWilliams好的,我想我明白你在说什么了。我这样做了:
dountil.Document.getElementById(“printDocLink”)0 DoEvents:Sleep 1000循环
,它似乎正在工作。我将不得不用一些更大的文档来尝试它,这些文档需要更长的加载时间
            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