2012-05-05 146 views
2

使用Access 2010,WinXP。我试图遍历一组文件夹,从每个文件夹中的每个Excel文件中收集值以添加到我的数据库中的表中。问题是,即使我每一次关闭工作簿,它不能被关闭速度不够快,因为如果相同的文件名出现在连续的两个文件夹中,我得到一个错误信息:如何等待Workbook.Close完成?

Run-time error '1004': 
A document with the name 'someWorkbook.xls' is already open. 

这里是我的代码:

sub traverse() 

Dim fso As filesystemobject 
Dim fObj As File 
Dim fldObj As Folder 
Dim fCol As Files 
Dim xlApp As Excel.Application 
dim xlBk as Excel.Workbook 

Set xlApp = New Excel.Application 
Set fso = New filesystemobject 
For Each fldObj In fso.GetFolder("c:\basePath").SubFolders 
    Set fCol = fldObj.Files 
    For Each fObj In fCol 
     If UCase(Left(fso.GetExtensionName(fObj.Name), 3)) = "XLS" Then 
      Set xlBk=xlApp.workbooks.open(fObj.path) 
      getData(xlBk) 
      xlBk.close false 
      DoEvents 
     End If 
    Next 
Next 

End Sub 

我试图退出Excel实例,并开始在For Each fObj循环一个新的,如下:

set xlApp=new Excel.Application 
Set xlBk=xlApp.workbooks.open(fObj.path) 
getData(xlBk) 
xlBk.close false 
DoEvents 
xlApp.quit 
DoEvents 

,但只有结束了开幕一大堆Excel实例没有退出,就像它崩溃时一样,我检查了任务管理器,发现大约30个Excel实例。

是否还有别的方法可以保证我的代码不会继续执行,直到由.Close.Quit触发的Excel操作完成?

+2

我发现了这个问题。这是由于我没有发布一段代码;对'workbooks.open'和'workbook.close'的调用实际发生在'getData'内部,其中有一个if-then子句在不关闭工作簿的情况下退出'getData'。我在'exit function'之前添加了一个'workbook.close',它现在运行正常。对不起,我没有发布代码,我认为如果我简化它会更容易得到帮助。下次我会更好地了解。 – sigil

+0

Sigil需要发布他们的答案并将其标记为已接受。看起来他们仍然是一个活跃的成员。 – JackOrangeLantern

回答

1

@sigil在评论中回答了他自己的问题。

我发现了这个问题。这是由于我没有发布一段代码;对workbooks.open和workbook.close的调用实际上发生在getData内部,其中有一个if-then子句在不关闭工作簿的情况下退出getData。我在退出函数之前添加了一个workbook.close,现在它正常运行。对不起,我没有发布代码,我认为如果我简化它会更容易得到帮助。下次我会更好地了解。