2012-04-04 10 views
0

Ich habe einen VBA-Makro in eine Excel-Tabelle geschrieben, der alle Arbeitsmappen an einem bestimmten Speicherort öffnet und Daten aus diesen Arbeitsmappen extrahiert und validiert und in die aktive Arbeitsmappe kopiert. Es öffnet dann die nächste Arbeitsmappe in dem Verzeichnis und wiederholt den Prozess, bis alle Dateien in dem Verzeichnis gelesen worden sind.VBA schließt keine programmatisch geöffneten Arbeitsbücher

Alles funktioniert, außer ich kann nicht scheinen, um die Zielarbeitsmappen zu schließen, sobald sie geöffnet sind. Dies schließt das Schließen von Excel ein. Ich muss den Prozess im Task-Manager oder in Powershell beenden, um die Arbeitsmappe aus dem Systemarbeitsspeicher zu befreien.

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 

Wenn die xlApp.Workbooks.Close Linie vorhanden ist und im Programm aufgerufen, Excel jedes Mal, friert ein. Ohne es kann ich 3-5 Workbooks durchlaufen, bevor das System überfordert ist und einfriert. Ich muss dann diese Prozesse beenden, diese Dateien verschieben, weitere 3 verschieben und wiederholen, bis alle Dateien auf diese Weise verarbeitet wurden. Es dauert etwa anderthalb Stunden, um durch 50 zu gehen.

Was ich versuche zu tun, ist die Arbeitsmappe, wo die Daten von geschlossen werden, bevor die nächste geöffnet wird.

ActiveWorkbook.Close 

Diese versucht, die Arbeitsmappe zu schließen, wo das Makro, nicht die Arbeitsmappe ausgeführt wird, die von zu lesenden geöffnet wurde.

Antwort

4

Sie haben bereits Excel geöffnet, so dass Sie keine weitere Kopie öffnen müssen. Versuchen:

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

Diese earlier answer of mine die Zyklen, obwohl jede Arbeitsmappe im aktuellen Ordner weiter helfen können.

+0

Das funktionierte perfekt. Danke –

3

lief ich Ihren Code ohne Probleme auch immer, aber hier ist eine saubere Alternative:

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. Normalerweise verwende ich 'wbk.Close False', um Probleme mit Eingabeaufforderungen für nicht gespeicherte Änderungen zu vermeiden. – brettdj

+0

Das hat funktioniert, um jede Arbeitsmappe zu schließen und nicht meinen ganzen Systemspeicher zu verbrauchen, aber es wurde aufgehängt, bis OLE-Aktionen abgeschlossen und im Wesentlichen eingefroren wurden System. –

Verwandte Themen