我通过 VBA 自动化 IE,但我似乎无法让 VBA 代码等到页面加载后再抓取文档。这会导致我的代码速度太快而导致各种失败。如何让VBA等待IE页面加载?我在 stackoverflow 上找到了我尝试过的许多方法,但似乎没有一个对我有用。
ie
是我的InternetExplorer
对象。
我已经尝试过,但没有成功:
Do
If ie.readyState = 4 Then
Exit Do
Else
DoEvents
End If
Loop
还有:
Do While ie.Busy Or Not ie.ReadyState = READYSTATE_COMPLETE
DoEvents
Loop
还有:
Do
DoEvents
Loop Until ie.ReadyState = READYSTATE_COMPLETE
我什至尝试过:
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
...
Do
Sleep 250
Loop Until ie.readyState = READYSTATE_COMPLETE
这些都不起作用,代码立即跳过循环并尝试抓取页面的 html 文档,即使页面尚未完成加载。
我正在导航到登录页面,填写用户名和密码,然后单击登录。登录后,我需要更改一些字段(下拉列表和文本框)。更改这些字段后,我使用 VBA 单击按钮保存设置,然后导航到另一个页面。该代码未正确设置字段,因为它跳过了等待页面加载的过程,因此我使用不正确的设置输入代码的下一部分。
我想知道这是否可能是由于 ajax 请求造成的?我都不知道该怎么说。
有没有人有可靠的方法在抓取 html 文档之前等待 IE 中的页面加载?
我知道代码正在执行我想要的操作,因为如果我手动单步执行它并等待页面加载,它就会按预期运行。
如有必要,我可以添加更多说明。
您可以等待 DocumentComplete 事件触发。但为此,您需要将浏览器控件放置在工作表上。在该工作表的代码中,输入以下代码(假设您将浏览器控件命名为
ie
):
Private docComplete As Boolean
Private Sub ie_DocumentComplete(ByVal pDisp As Object, url As Variant)
docComplete = True
End Sub
Public Sub NavigateAndWait(url As String)
docComplete = False
ie.Navigate url
Do
DoEvents
Loop Until docComplete
End Sub
Sub Main()
' Example use
NavigateAndWait "www.google.com"
MsgBox "Ready"
End Sub
通过将
NavigateAndWait
设为 Public Sub
,您可以从您可能拥有的其他模块中调用它。最好将需要 ie
的代码移至此工作表的模块中。请注意,浏览器控件必须可见并且位于活动工作表上,DocumentComplete 事件才能触发。
做 如果 ie.readyState <> READYSTATE_COMPLETE 那么 退出执行 别的 举办活动 万一 循环
抱歉,我没有足够的代表,所以我必须添加一个答案,但是您在第三个选项中尝试过 1000 或 2000(1 或 2 秒)吗?根据 IE 的运行情况,加载时间可能会超过 250 毫秒。