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

时间:2019-06-06 17:23:01

标签: excel vba internet-explorer-11

我有一些VBA可以启动公司的Intranet网站,这将使我直接进入要搜索的文档。我需要等待页面完成加载,然后单击“打印”按钮,这将在Adobe Reader支持的IE选项卡中打开文档,然后从那里将其另存为PDF到驱动器。

我的问题是我必须等待直到加载网页的循环没有正确等待。对SO进行一些研究,我发现这是IE较新版本的一个已知问题。此后,我尝试使用某些XMLHTTP方法,但是我不熟悉这些方法,而且尝试也很短(不确定如何通过使用{{1 }}。

我当前的VBA如下,XMLHTTPieApp

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 的时间,它将等待,直到出现的文档超过了我告诉Sleep的时间,因此显然这不是一个可靠的解决方案。

使用以下问题作为参考,我尝试使用Sleep,但也注意到有关此方法可能不适用于JavaScript网站的评论。

VBA hanging on ie.busy and readystate check

web scraping with vba using XMLHTTP

我对XMLHTTP的尝试之一:

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元素。

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

1 个答案:

答案 0 :(得分:0)

根据蒂姆·威廉姆斯(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