2017-02-09 1 views
1

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

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

+0

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

+2

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. –

Antwort

1

Es sieht aus wie es nicht wirklich ein Problem mit dem Code war. Meine Firma hat ein Wasserzeichen-COM-Add-In für Excel, das beim Öffnen von Excel automatisch geladen wird und das COM-Add-In, das in die von meinem Code erstellte Instanz von Excel geladen wurde, darf die Ausführung nicht stoppen, solange das Add-In vorhanden ist geladen nach der Diskussion in this SO question. Ich musste das COM-Add-In manuell deaktivieren, da ich nicht die Berechtigung dazu hatte, es über VBA zu tun, aber ich vermute, dass der folgende Code alle störenden COM-Add-Ins ausschalten sollte, vorausgesetzt, Sie haben die entsprechenden Berechtigungen.

For i = 1 To XL.COMAddIns.Count 
    XL.COMAddIns(j).Connect = False 
Next i 
Verwandte Themen