2

使用 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 实例。

我还能做些什么来保证我的代码在 Excel 操作触发.Close.Quit完成之前不会继续执行?

4

2 回答 2

1

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

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

于 2012-07-27T04:22:36.353 回答
0

我找到了几个“等待关闭”的解决方案,最后得到了以下代码,这最后但并非最不重要,因为与 Wait Sleep 相比,它是独立于应用程序的,因此代码可以很容易地更改为 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
于 2019-01-08T13:30:02.223 回答