2012-04-04 128 views
0

我已经在Excel电子表格中编写了一个VBA宏,该宏可打开特定位置中的所有工作簿,并从这些工作簿中提取数据并验证并将其复制到活动工作簿。然后打开目录中的下一个工作簿并重复该过程,直到目录中的所有文件都已被读取完毕。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

您已经打开了Excel,因此您不需要打开另一份副本。尝试:

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

earlier answer of mine其周期,虽然在当前文件夹中的每个工作簿可以进一步帮助。

+0

这完美地工作。谢谢 – 2012-04-06 13:03:53

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 
+0

+1。我通常使用'wbk.Close False'来避免提示未保存更改的任何问题 – brettdj 2012-04-04 23:27:17

+0

这确实能够关闭每个工作簿并且不会占用我所有的系统内存,但它已经挂起,等待OLE操作完成并基本上冻结系统。 – 2012-04-06 12:06:58

相关问题