循环时VBA代码中断
我有一个小问题,我需要循环通过Excel行
但是,代码打破了。 如果我只是一步一步地运行F8,那就没问题。 但如果我想运行它只是由F5,它打破…
我想连接到外部源不是快速的,但是我怎样才能解决这个问题呢?
lDate = ws.Cells(i, 2).Value With appIE .Navigate "www.thisisjusttheexampleweb.com" 'it usually breaks here or below End With Do While appIE.Busy DoEvents Loop 'or it breaks here on setting allRowOfData Set allRowOfData = appIE.document.getElementById("Table") Set InterestingFields = allRowOfData.Children
感谢所有的帮助
P.
编辑:我发现其他解决scheme没有parsing任何网站,更好的是使用一些API来获得免费的数据,并且很多时候网站的所有者不允许parsing/刮取networking上的任何信息。
至于你问你问题的问题,问题是浏览器在页面被完全加载之前改变其“忙”状态。 这可能会发生,所以声明:
Do While appIE.Busy DoEvents Loop
在页面真正加载之前离开循环。 那会发生什么? 那么,当你尝试设置你的声明:
Set allRowOfData = appIE.document.getElementById("historicalRateTb1")
…它失败,因为这个元素与您所查找的ID不在您的IE应用程序的文档中。 一个“不是很好”的方法来解决这个问题,但这应该回答你的问题,通常是让Excel应用程序等待一段时间才能运行代码的其余部分,以便浏览器将有材料时间加载满页:
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now())+5) 'this waits 5 seconds before the code run is restored
然而,现在你似乎更熟悉IE自动化,我的build议是开始学习使用所谓的XMLHTTP请求对象 。 在这里find更多关于它的信息 。 我提前意识到:
- 这个对象的好处在于速度,因为它以XML查询数据,并且比浏览器的人机自动化更快 ,从而获得数据所在的同一个HTML主体;
- 除了网站可能不提供这种服务外,“坏”的方面是通常对象使用caching来避免呼叫; 换句话说,如果你在19:52查询数据,当你在19:53查询的时候,它将在19:52取得浏览器的caching数据,而不是19:53的新数据。 应该有一个属性到对象中以避免这种情况,或者您可能只是将一个随机数字附加到网站string(这不会在URL中读取,但将强制新的查询到网站)。