如何等到Workbook.Close完成?

时间:2012-05-05 01:02:31

标签: vba access-vba

使用Access 2010,WinXP。我正在尝试遍历一组文件夹,从每个文件夹中的每个Excel文件中收集值以添加到我的数据库中的表。问题是,即使我每次都关闭工作簿,它也不能足够快地关闭,因为如果两个连续文件夹中出现相同的文件名,我会收到一条错误消息:

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 个答案:

答案 0 :(得分:1)

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

  

我发现了问题。这是由于我没有发布的一段代码;对workbooks.open和workbook.close的调用实际上发生在getData中,其中有一个if-then子句退出getData而不关闭工作簿。我在退出函数之前添加了一个workbook.close,它现在表现正常。很抱歉没有按原样发布代码,我认为如果简化它会更容易获得帮助。下次我会更清楚。

答案 1 :(得分:0)

我找到了几种“等待关闭”解决方案,最后得到了以下使我满意的代码,但并非最不重要,因为与Wait Sleep相比,它是独立于应用程序的,因此可以轻松地将代码更改为word文档: / p>

Private Sub WaitForClose(ByVal sWbk As String, _
                Optional ByVal oApp As Excel.Application = Nothing)
' -----------------------------------------------------------------
' Precondition: oApp when provided the (or there is an) Excel
' instance with the Workbook sWbk open.
' -----------------------------------------------------------------
Dim bOpen   As Boolean
Dim xlWbk     As Excel.Workbook

   If oApp Is Nothing Then Set oApp = GetObject(sWbk).Application
   Do
      If oApp.Workbooks.Count = 0 Then Exit Sub
      bOpen = False
      For Each xlWbk In oApp.Workbooks
         If xlWbk.FullName = sWbk Then bOpen = True
      Next
      If bOpen Then Sleep 1000
   Loop While bOpen

End Sub