循环时VBA代码中断

时间:2014-11-30 13:24:27

标签: excel vba web

我遇到一个小问题,我需要遍历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上。

编辑:我发现其他解决方案没有解析任何网页,更有利的是使用一些API来免费获取数据,而且网站所有者通常不允许从网络上解析/抓取任何信息

1 个答案:

答案 0 :(得分:2)

至于您在问题中询问的问题,问题是浏览器在页面完全加载之前更改其“忙碌”状态。这可能会发生,所以声明:

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自动化更熟悉,我的建议是开始学习使用所谓的 XMLHTTP请求对象。查找有关它的更多信息here。我事先知道你:

  • 这个对象的好处是速度,因为它以XML格式查询数据并且比浏览器的人工智能化方式更快以获得数据所在的相同HTML主体; < / LI>
  • 除了网站可能不提供此服务之外,“坏”方面通常是对象使用缓存来避免呼叫;换句话说,如果您在19:52查询数据,当您在19:53查询时,它将在19:52获取浏览器的缓存数据而不是19:53时的新数据。对象应该有一个属性来避免这种情况,或者你可能只是在网站字符串中附加一个随机数(不会在URL中读取,但会强制新的查询到网站)。