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

问题描述 投票:0回答:3

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

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

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

excel vba
3个回答
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 事件才能触发。


0
投票

做 如果 ie.readyState <> READYSTATE_COMPLETE 那么 退出执行 别的 举办活动 万一 循环


-2
投票

抱歉,我没有足够的代表,所以我必须添加一个答案,但是您在第三个选项中尝试过 1000 或 2000(1 或 2 秒)吗?根据 IE 的运行情况,加载时间可能会超过 250 毫秒。

© www.soinside.com 2019 - 2024. All rights reserved.