我有一些VBA可以启动公司的Intranet网站,这将使我直接进入要搜索的文档。我需要等待页面完成加载,然后单击“打印”按钮,这将在Adobe Reader支持的IE选项卡中打开文档,然后从那里将其另存为PDF到驱动器。
我的问题是我必须等待直到加载网页的循环没有正确等待。对SO进行一些研究,我发现这是IE较新版本的一个已知问题。此后,我尝试使用某些XMLHTTP
方法,但是我不熟悉这些方法,而且尝试也很短(不确定如何通过使用{{1 }}。
我当前的VBA如下,XMLHTTP
是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
的时间,它将等待,直到出现的文档超过了我告诉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调用,我希望可以跳过“完全打印”按钮。
答案 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