Excel 2003 VBA代码在逐步执行时工作,但在完全运行时不起作用

我发现并修改了Excel VBA代码来打开一个网页,然后打开一个链接的文件。

它在我通过它时运行,但是当它完全运行时它不会打开文件。

Sub CallWebPage() Dim URL As String Dim ieApp As Object Dim ieDoc As Object Dim ieForm As Object Dim ieObj As Object Dim objColl As Collection URL = "http://sdrk3020v/mi_toolbox/default.asp?query_name=spBUS_GCR_AllSchemes&app_id=2&FileType=csv&btnRunQuery=Run+query" Set ieApp = CreateObject("InternetExplorer.Application") ieApp.Visible = True ieApp.navigate URL While ieApp.Busy 'wait... Wend Set ieDoc = ieApp.Document For Each ele In ieApp.Document.getelementsbytagname("a") If ele.innertext = "query_1" Then DoEvents ele.Click End If Next ieApp.Quit End Sub 

警告 – 我不知道你的代码是怎么回事

有了这个警告,考虑到你的代码出现在真实的世界中打开一个网页,我猜测成功和失败之间的区别是与time

IE浏览器当你一步一步的代码时,事情就有足够的时间来完成,所以当单击链接的代码运行时,所有的东西都被完美的设置好了。

但是当你全速运行的时候,事情并没有在幕后发生,所以当你的代码点击它的时候,链接还没有准备好(或者存在)。 我不知道为什么会这样,但鉴于像AJAX这样的东西可以asynchronous加载网页,我不会惊讶你的网页不会立即popup生活。

这种事情被称为Race ConditionRace Condition (代码的多个部分正在争先恐后地看到谁到达那里),解决办法是找出如何阻止这种情况的发生。 这可能意味着find某种状态,说网页是100%真正真正加载的(最好的情况),或者像在延迟时间在一个临界点允许比最坏情况设置时间长99.999%这是非常糟糕的,并且可能会导致可怕的诊断错误,当你达到0.0001%的情况时 – 正如你知道你已经确定了你的延迟竞争条件)

尝试使用DoEvents,这将停止运行,直到后台进程完成。 这可能会帮助你解决你的问题

问候Umesh