Vba 为什么IE对象需要循环?

Vba 为什么IE对象需要循环?,vba,ms-access,Vba,Ms Access,我正在尝试使用MS Access启动IE自动化,我正在学习教程 我理解IE ReadyState=4表示该网页已加载 文章说, 在VBA中使用IE时,人们遇到的一个非常常见的问题是 VBA试图在Internet Explorer完全加载之前运行代码。 通过使用此代码,您可以告诉VBA重复一个循环,直到IE就绪 (即ReadyState–4) 我不理解边做边循环的重要性。为什么不在IE就绪状态为4之前执行此操作?而在某些情况下,通常不需要执行此操作 Do Until IE.ReadyState =

我正在尝试使用MS Access启动IE自动化,我正在学习教程

我理解IE ReadyState=4表示该网页已加载

文章说,

在VBA中使用IE时,人们遇到的一个非常常见的问题是 VBA试图在Internet Explorer完全加载之前运行代码。 通过使用此代码,您可以告诉VBA重复一个循环,直到IE就绪 (即ReadyState–4)


我不理解边做边循环的重要性。为什么不在IE就绪状态为4之前执行此操作?

而在某些情况下,通常不需要执行此操作

Do Until IE.ReadyState = 4: DoEvents: Loop   'Do Until
由于VBA在浏览器有机会将
.ReadyState
属性从完成更新为加载之前运行代码,因此它本身将完全跳过循环。如果此属性未及时更改,则此行将自动为true,循环将被完全跳过。通过等待更改首先发生,通常可以防止此问题

因此,第一行实际上是等待
.ReadyState
属性变回1,这样您就不会无意中跳过真正重要的那一行,这是实际等待页面加载的第二行


看一看上面的部分。您应该同时检查
.ReadyState
.Busy
属性,而不仅仅是其中一个属性

所以你的第二行应该是这样的:

Do Until IE.ReadyState = 4 And Not IE.Busy: DoEvents: Loop

那就是我们两个
IE.Navigate(url)
then
Dowhile IE.ReadyState 4:DoEvents:Loop
它在注释中逐字说明了为什么有两个循环。请注意,
Do While IE.ReadyState=4:DoEvents:Loop
是一个繁忙的等待,这通常是一个糟糕的计划(加载网页时CPU使用率会急剧上升,这会降低加载速度)(特别是在单核计算机上)并导致笔记本电脑的电池耗尽)。相反,您希望导入睡眠功能并使用它。
Do Until IE.ReadyState = 4 And Not IE.Busy: DoEvents: Loop