Vba 等待工作簿。关闭完成

Vba 等待工作簿。关闭完成,vba,ms-access,Vba,Ms Access,使用Access 2010、WinXP。我试图遍历文件夹集合,从每个文件夹中的每个Excel文件中收集值,以添加到数据库中的表中。问题是,即使我每次关闭工作簿,它的关闭速度也一定不够快,因为如果相同的文件名出现在两个连续的文件夹中,我会收到一条错误消息: Run-time error '1004': A document with the name 'someWorkbook.xls' is already open. 这是我的密码: sub traverse() Dim fso As fi

使用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实例,并在
中为每个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操作完成之前不会继续运行?

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

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

我找到了几个“等待关闭”的解决方案,最后得到了以下代码,这让我很满意。最后但并非最不重要的一点是,与等待睡眠相比,等待睡眠是独立于应用程序的,因此代码可以很容易地更改为word文档:

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

我发现了问题。这是因为我没有发布一段代码;对
工作簿.open
工作簿.close
的调用实际上发生在
getData
内部,其中存在一个if-then子句,该子句在不关闭工作簿的情况下退出
getData
。我添加了一个
工作簿。在
退出功能之前关闭
,现在它运行正常。很抱歉没有按原样发布代码,我想如果我简化代码,会更容易获得帮助。下次我会知道得更清楚。西格尔需要发布他们的答案,并将其标记为已接受。看起来他们仍然是一个活跃的成员。