0

我在一个 Excel 电子表格中编写了一个 VBA 宏,它在特定位置打开所有工作簿,并从这些工作簿中提取数据并验证并将其复制到活动工作簿。然后它会打开目录中的下一个工作簿并重复该过程,直到目录中的所有文件都已通读。

一切正常,除了我似乎无法让目标工作簿在打开后关闭。这包括关闭 Excel。我必须在任务管理器或 powershell 中终止进程才能从系统内存中释放工作簿。

Set fs = CreateObject("Scripting.FileSystemObject")
strExcelFileName = Dir(ThisWorkbook.Path & "\Certs\*.xls", vbNormal)
Set xlApp = CreateObject("Excel.Application")
Do While (strExcelFileName <> "")
      xlApp.Workbooks.Open (ThisWorkbook.Path & "\Certs\" + strExcelFileName)
      'code to run for each workbook opened
      ***xlApp.Workbooks.Close*** 'when present, Excel freezes
      strExcelFileName = Dir 'next file in directory
Loop

当 xlApp.Workbooks.Close 行存在并在程序中调用时,excel 每次都会冻结。没有它,我可以在系统不堪重负和死机之前运行 3-5 个工作簿。然后我必须终止这些进程,将这些文件移出,再移入 3 个并重复,直到所有文件都以这种方式处理。大约需要一个半小时才能通过50。

我想要做的是在打开下一个工作簿之前关闭从其中获取数据的工作簿。

ActiveWorkbook.Close

这会尝试关闭运行宏的工作簿,而不是关闭已打开以供读取的工作簿。

4

2 回答 2

4

您已经打开了 Excel,因此您无需打开另一个副本。尝试:

Set WBookOther = Workbooks.Open(PathCrnt & FileNameCrnt)
  :
  :
WBookOther.Close SaveChanges:=False

我的这个较早的答案循环当前文件夹中的每个工作簿可能会有所帮助。

于 2012-04-04T13:51:30.527 回答
3

我运行你的代码没有任何问题,但这里有一个更干净的选择:

Dim strExcelFileName As String
Dim xlApp As Object
Dim wbk As Workbook

strExcelFileName = Dir(ThisWorkbook.Path & "\Certs\*.xls", vbNormal)
Set xlApp = CreateObject("Excel.Application")
Do While (strExcelFileName <> "")
      Set wbk = xlApp.Workbooks.Open(ThisWorkbook.Path & "\Certs\" _
          + strExcelFileName) ' set a reference to the workbook you're opening

      'code to run for each workbook opened
      'Your code should use the "wbk" reference to make sure
      ' you're accessing the correct workbook.

      wbk.Close ' close the workbook using the reference you set earlier

      strExcelFileName = Dir 'next file in directory
Loop
于 2012-04-04T17:24:23.277 回答