如何让VBA等待IE页面加载?

时间:2015-10-26 19:01:21

标签: excel-vba vba excel

我通过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中等待页面加载?

我知道代码正在执行我想要的操作,因为如果我手动单步执行并等待页面加载,它就会按预期运行。

如有必要,我可以添加更多说明。

2 个答案:

答案 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毫秒以上。