我正在尝试使用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
添加到我的循环中。
答案 0 :(得分:2)
通常这种行为不是因为代码逻辑而是因为中断。根据环境的性质,它可能是两件事之一
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
再一次,您可能需要进行一些试验和错误,以确定在按预期工作之前需要将多少代码抛入无事件区域。