2012-04-04 129 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

相關問題