我知道以前有人问过这样的问题,但我的有点不同,而且相当令人不安。我正在处理的是一个带有一些事件的网页,当输入框中的某些项目被填写时,这些事件会加载更多的页面。当这些事件触发时,页面会再次加载,但仍使用相同的 URL 和相同的 nameprop。我一直在分别使用以下类型的方法并串在一起处理等待页面加载,但有时 VBA 仍然设法继续执行并将 HTMLDocument 变量设置为页面而没有适当的信息导致宏调试。以下是我迄今为止一直在尝试的各种事情:
While IE.Busy
DoEvents
Wend
Do Until IE.statusText = "Done"
DoEvents
Loop
Do Until IE.readyState = 4
DoEvents
Loop
我什至尝试将这些事件放入如下所示的循环中,但它并不完全有效,因为 lastModified 属性只返回一个直到第二个的值,并且宏在字段中旋转得足够快,以至于它返回了一个新的同一秒内的页面:
Do Until IE.statusText = "Done" And IE.Busy = False And IE.ReadyState = 4 _
And IE.document.lastModified > LastModified ----or---- IE.document.nameprop = _
"some known and expected name prop here"
While IE.Busy
DoEvents
Wend
Do Until IE.statusText = "Done"
DoEvents
Loop
Do Until IE.readyState = 4
DoEvents
Loop
Loop
即使这样也无法等待足够长的时间来设置导致调试的 HTMLDocument 对象。我已经考虑设置下一个输入元素并检查它以进一步编写代码,但即使这样也不会 100% 成功,因为通常输入元素存在于 HTML 中,但在触发适当的事件之前是隐藏的,这不会是一个问题,但他们不会加载他们可能的选择,直到事件被触发之后。这可能是一个奇怪的页面。
无论如何......不知道还有什么要添加的。如果还有其他可能有助于查看的内容,请询问。我想我正在寻找的是一种让 VBA 等到 IE 知道另一个页面不在它的方式上的方法。它似乎在完全完成之前加载了几次。
所以...有人有什么想法吗?
编辑:发现了一些新的尝试。仍然,没有骰子。有人建议我添加这些尝试。这是代码,由于某种原因,在触发应该填充 select 元素上的选项的事件后使用此方法时,VBE 和 excel 实例变得无响应......正在考虑尝试 xml......这是代码:
intCounter = 0
Do until intCounter > 2
Do Until IE.Busy = False: DoEvents: Loop
Do Until IE.ReadyState = 4: DoEvents: Loop
Set HTMLDoc = IE.Document
Do Until HTMLDoc.ReadyState = "complete"
Set HTMLSelect = HTMLDoc.getElementById("ctl00$ctl00$MainContent$ChildMainContent$ddlEmployeeBranchCodes")
intCounter = 0
For each Opt in HTMLSelect
intCounter = intCounter + 1
Next Opt
Loop
根据我在网页上看到的情况,我知道 VBE 和 Excel 在这个循环中的某个地方变得无响应。
希望有帮助......我知道它没有帮助我...... Drats。
编辑:只是想我会添加这个。在自动化网页方面,在大多数情况下,我不再使用 IE。我发现它好多了,并且完全回避了这个异步问题,简单地执行帖子并让自己得到。根据您要执行的操作,可能不是最佳解决方案,但如果您仔细查看流量并很好地参数化,它会非常可靠地工作。