我知道之前曾经问过这样的问题,但我的情况有点不同,而且一直很麻烦 . 我正在处理的是一个带有表单的网页,当填写输入框中的某些项目时,这些表单会加载更多页面 . 当这些事件触发页面再次加载时,但保持在具有相同nameprop的相同URL . 我一直在使用以下类型的方法单独和串联来处理等待页面加载,但有时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知道另一个页面不在它的路上 . 它似乎在完成之前加载了几次 .
那么......任何人都有任何想法?
编辑:找到一些新的东西尝试 . 仍然没有骰子 . 有人建议我添加这些尝试 . 这是代码,由于某种原因,VBE和excel实例在触发应该填充select元素上的选项的事件后使用此方法时变得无响应...考虑尝试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浏览器 . 我发现它好多了,完全回避了这个异步的问题,简单地执行帖子并获得自己 . 可能不是最好的解决方案,取决于您尝试做什么,但如果您仔细查看流量并很好地参数化,它可以非常可靠地工作 .