等待CSV文件打开?

我正尝试在Excel中使用VBA下载并打开一个CSV文件。 当我逐步使用debugging器,我的代码工作正常,但是当我尝试正常运行它不会工作,它试图将信息从新打开的CSV文件复制到现有的.xlsm文件,但它没有find任何东西。 我已经find了检查文件是否打开的方法,但是我需要继续检查,一旦存在就继续执行代码。

下面是如何获取文件下载:

Sub getFile(address) On Error Resume Next Set ie = CreateObject("InternetExplorer.Application") ie.Visible = False ie.navigate address ie.Quit Set ie = Nothing On Error GoTo 0 End Sub 

然后在调用getFile的子文件中,

 Do While Workbooks(Workbooks.Count).Name <> "file.csv" Loop 

我曾尝试过一些变化,所有工作都很好,但在debugging器中慢一些,否则会崩溃。 有谁知道一种方法来让它继续检查,并等待文件打开? 它要求用户做一些事情,以确保file.csv是打开的。 我应该把我的支票放在子getFile中,还是在调用后保留它?

SOULTION:考虑到下面的build议,我尝试了这个,它完美的工作:

 Sub getFile(address) On Error Resume Next Set ie = CreateObject("InternetExplorer.Application") ie.Visible = False ie.navigate address Do While Workbooks(Workbooks.Count).Name <> "file.csv" DoEvents Loop ie.Quit Set ie = Nothing On Error GoTo 0 End Sub 

在closuresIE之前将检查移到了我的循环中并添加了DoEvents

通常这种行为不是因为代码逻辑,而是因为中断。 根据你的环境的性质,这可能是两件事情之一

  • 某些后台刷新过程在您的代码执行时间之间有时会执行,导致一些问题。 例如在金融服务环境中,您的Bloomberg API可能会及时执行BlpUpdate事件
  • 你的代码阻塞了大量的时间,并导致意外的行为,因为在你的循环中被触发的事件被阻塞太长,等待你的代码在主线程上完成。

所以你需要尝试以下两个解决scheme,其中一个应该可以工作

对于第二个问题,在你的内部

 Do While Condition ' ... your code ... Loop 

添加一行代码,检查并清除任何待处理的事件队列,使其…

 Do While Condition DoEvents ' either put it at the start or at the end of your code ' ... your existing code ... Loop 

这将给系统一些“喘息空间”来包装未决事件。 您需要尝试使用DoEvents代码的位置。

对于第一个问题,您可以尝试将您的整个循环封装在Event Protected区域的代码中,以确保它在任何干扰之前完成运行。

 Application.EnableEvents = False 'your loop and other code comes here Application.EnableEvents = True 

再一次,您可能需要一些试验和错误,以确定在按预期工作之前,需要将多less代码投入到无事件区域。