VBA不会关闭以编程方式打开的工作簿
我已经在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
这会尝试关闭运行宏的工作簿,而不是已打开的工作簿进行读取。
您已经打开了Excel,因此您不需要打开另一份副本。尝试:
Set WBookOther = Workbooks.Open(PathCrnt & FileNameCrnt)
:
:
WBookOther.Close SaveChanges:=False
这earlier answer of mine其周期,虽然在当前文件夹中的每个工作簿可以进一步帮助。
我跑你的代码没有任何问题任何,但这里有一个更清洁的替代:
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
+1。我通常使用'wbk.Close False'来避免提示未保存更改的任何问题 – brettdj 2012-04-04 23:27:17
这确实能够关闭每个工作簿并且不会占用我所有的系统内存,但它已经挂起,等待OLE操作完成并基本上冻结系统。 – 2012-04-06 12:06:58
这完美地工作。谢谢 – 2012-04-06 13:03:53