.ReadyState & .Busy 不等待 IE 页面加载
.ReadyState & .Busy Is Not Waiting For IE Page To Load
我有一些 VBA 可以启动公司内部网站,它将直接带我到我正在搜索的文档。我需要等待页面完成加载,然后点击 "Print" 按钮,这将在 Adobe Reader 支持的 IE 选项卡中打开文档,然后我将其作为 PDF 保存到驱动器.
我的问题是我必须等待直到网页加载的循环没有正确等待。在对 SO 进行一些研究后,我发现这是较新版本的 IE 的一个已知问题。从那以后,我尝试使用一些 XMLHTTP
方法,但我对这些方法不熟悉,而且我对它的尝试也不尽如人意(不确定如何通过点击打印 link 导航到下一页使用 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
如果我加了一堆 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
我有一些 VBA 可以启动公司内部网站,它将直接带我到我正在搜索的文档。我需要等待页面完成加载,然后点击 "Print" 按钮,这将在 Adobe Reader 支持的 IE 选项卡中打开文档,然后我将其作为 PDF 保存到驱动器.
我的问题是我必须等待直到网页加载的循环没有正确等待。在对 SO 进行一些研究后,我发现这是较新版本的 IE 的一个已知问题。从那以后,我尝试使用一些 XMLHTTP
方法,但我对这些方法不熟悉,而且我对它的尝试也不尽如人意(不确定如何通过点击打印 link 导航到下一页使用 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
如果我加了一堆 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