【问题标题】:How do I make VBA wait for IE page to load?如何让 VBA 等待 IE 页面加载?
【发布时间】:2015-10-26 19:01:20
【问题描述】:

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

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

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

【问题讨论】:

  • 您是否尝试过等待 DocumentCompleted 事件触发?
  • 我没有。我不太熟悉在 VBA 中以这种方式使用对象的事件。我在谷歌上搜索并没有找到很好的文档。
  • 好的,我在回答中提供了一个示例。顺便说一句,它是 DocumentComplete,最后没有 d 。我的错。

标签: excel vba


【解决方案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 事件。

【讨论】:

  • 感谢这个例子。似乎不喜欢 ie 没有在 NavigateAndWait 子例程中声明,因为它给了我一个变量未定义的错误。你觉得这听起来对吗?我是否需要将我的 ie 对象传递给该子例程?
  • 好吧,在你的问题中,你说你已经调用了你的浏览器对象ie,并且你使用ie提供了代码......所以我使用了ie。确保将此代码放在具有ie 浏览器对象的工作表模块中
  • 是的,我的对象ie 的范围一定太窄了,我会尝试改变它。
  • 嗯,您必须将 ie_DocumentComplete 放入工作表的代码中,... 具有浏览器对象的工作表。不要尝试其他方式。事实上,如果您双击您在工作表模块中获得的浏览器对象,您可以从下拉列表中选择 DocumentComplete 事件。它会为它生成一个空的body。
  • 都在一个代码模块中(不在工作表代码中)。那会是问题吗?感谢您的宝贵时间。
【解决方案2】:

对不起,我没有足够的代表,所以我必须添加一个答案,但您在第三个选项中尝试了 1000 或 2000(1 或 2 秒)吗?根据 IE 的操作,加载时间可能超过 250 毫秒。

【讨论】:

  • 好吧,它应该保持在循环中直到 ReadyState 为 4 对吗?所以它休眠 250 毫秒,然后再次检查页面是否准备好,如果没有,则再次休眠 250 毫秒,依此类推。至少我打算这样做。
猜你喜欢
  • 2015-11-28
  • 2019-06-11
  • 1970-01-01
  • 2010-11-23
  • 2018-08-13
  • 1970-01-01
  • 2017-09-13
  • 2016-11-16
  • 1970-01-01
相关资源
最近更新 更多