我通过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中等待页面加载?
我知道代码正在执行我想要的操作,因为如果我手动单步执行并等待页面加载,它就会按预期运行。
如有必要,我可以添加更多说明。
答案 0 :(得分:1)
您可以等待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事件。
答案 1 :(得分:-2)
抱歉,我没有足够的代表所以我必须添加一个答案,但你在第3个选项中尝试了1000或2000(1或2秒)吗?根据IE正在进行的操作,加载可能需要250毫秒以上。