等待CSV文件打开?

时间:2014-07-10 08:42:56

标签: excel vba

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

以下是我如何下载文件:

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

然后在sub中调用getFile,

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

我尝试了一些变体,在调试器中缓慢运行时都能正常运行,否则会崩溃。有没有人知道让它继续检查并等到文件打开的方法?它要求用户做一些事情,以确保file.csv是打开的。我应该把我的支票放在子getFile中还是在调用后保留它?

SOULTION: 以下是hnk的建议,我尝试了这个并且完美地运行了:

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

在关闭IE之前将检查移至并将DoEvents添加到我的循环中。

1 个答案:

答案 0 :(得分:2)

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

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

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

对于第二个问题,在

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

这将为系统提供一些喘息的空间&#39;包装待处理的事件。您需要尝试使用DoEvents代码的位置。

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

Application.EnableEvents = False

'your loop and other code comes here

Application.EnableEvents = True

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