Ich habe eine Access-Datenbank, die eine Excel-Datei öffnet, Informationen darin aktualisiert und dann ein Makro mehrmals ausführt und dann die Excel-Datei schließt. Das Problem besteht darin, dass die EXCEL.EXE-Instanzen auch dann noch aktiv sind, wenn der Code ausgeführt wurde und Access geschlossen wurde. Ich habe alle Empfehlungen von this post sowohl auf der Zugriffsseite als auch als ein Makro in der Excel-Datei versucht, die aufgerufen wird, nachdem das Hauptmakro ausgeführt wurde und egal, was der Prozess ausgeführt wird. Ich habe doppelt überprüft, und es gibt nichts anderes Öffnen eines Verweises auf Excel irgendwo anders in dem Code, der ausgeführt wird, und das Excel-Makro öffnet auch keine neue Instanz von Excel.Wie Sie Excel schließen, damit EXCEL.EXE nicht mehr im Taskmanager ausgeführt wird
Ich benutze Excel 2016 und Access 2007 (aufgrund der Unternehmensrichtlinien dürfen wir nicht auf eine neuere Version von Access aktualisieren).
Der ursprüngliche Code ich die Excel-Datei zu öffnen, bin mit, das Makro ausführen und die Excel-Anwendung schließen wie folgt:
Dim XL As Excel.Application
Dim WB As Excel.Workbook
Dim WS As Excel.Worksheet
Set XL = New Excel.Application
XL.Visible = False
XL.DisplayAlerts = False
Set WB = XL.Workbooks.Open(Exporter)
Set WS = WB.Sheets(1)
For i = 0 to 9
'-Generate data to place in excel sheet here-
WS.Range("A1") = SomeData
WS.Range("B1") = SomeOtherData
XL.Run "Excel Macro"
Next i
Set WS = Nothing
WB.Close False
Set WB = Nothing
XL.Quit
Set XL = Nothing
Das sieht gut aus, also nehme ich an, es ist im Excel-Makro. Versuchen Sie, den Code in "Excel Macro" in etwas Triviales (oder nichts) zu ändern. Bitte verwenden Sie keine typografischen Zitate im Code. – Andre
Ich habe ein Sub erstellt, das nur einen Kommentar mit 'debug.print' ausgedruckt hat und beendet wurde und im Taskmanager nachsieht, dass die neue Instanz von EXCEL.EXE nicht beendet wird. – 110SidedHexagon
Verrückte Idee: Behalte einen Verweis auf ** all ** Objekte, auf die du zugreifst (einschließlich der 'Sheets'-Sammlung und jedes zugegriffene' Range'-Objekt), und 'setze' sie auf' Nothing' in deinem Bereinigungscode. Das * sollte nicht * notwendig sein, da dies VBA-Code ist - aber im COM-Interop-Code würde man einen anhaltenden Ghost-Prozess erhalten, um richtig zu beenden. –