Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Excel per VBA beenden

Excel per VBA beenden
08.05.2009 16:55:36
Martin
Hallo Forum,
ich habe ein Macro, das von der Workbook_Open aufgerufen wird. Ich löse ein Problem mit dem SOLVER und will die Datei schliessen und Excel beenden.
Das Schliessen funktioniert,
wenn das Makro bei geöffneter Datei von Hand gestartet wird
wenn Excel gestartet ist und die Datei per Doppelklick gestartet wird
Das Schliessen funktioniert NICHT,
wenn die Datei per Doppelklick gestartet wird und selber Excel öffnet (so muss es leider funktionieren)
Ich speichere alle Daten, schliesse alle Workbooks bis auf das, in dem das Makro steht, setze alle mir bekannten Objekte auf nothing. Das Makro läuft einfach drüber, wie als ob nichts wäre. Err.Number ergibt 0.

Private Sub Workbook_Open()
Call JobExec.RunJob
End Sub


Modul JobExec:
Option Explizit
Sub RunJob
...
Solver.Auto_open ' notwendig, damit SolverOptions keine Fehlermeldung im Batch-Run erzeugt
...
Application.DisplayAlerts = False
' Bewusst kein workbook.close vorher
Application.Quit
End Sub


Hinweise im Netz auf noch offene Objekte konnte ich nicht richtig umsetzen. Application.UsedObjects gibt 58 zurück, aber Versuche mit unload oder set = nothing in einer for each-Schleife haben nicht funktioniert. Oder gibt es einen Befehl mit dem man Excel einfach zuverlässig abschiesst?
Dankbar für jeden Tipp,
Martin

Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Excel per VBA beenden
08.05.2009 18:17:56
Martin
Nachtrag:
Ein kurzer Vergleich mit alten Versionen zeigte, dass das Problem mit den einfachen Berechnungen nicht auftritt. Es tritt anscheinend erst auf seit ich auch den Solver in VBA verwende.
Excel sicher beenden: Leider noch nicht gelöst
09.05.2009 09:50:52
Martin
Hat jemand eine Idee?
AW: Excel sicher beenden: Leider noch nicht gelöst
09.05.2009 10:15:42
Tino
Hallo,
oft wird Excel nicht richtig beendet, wenn dass schließen mehrmals im Code aufgerufen wird.
Was weis ich z. Bsp. wird Close in einem Makro verwendet und in irgendeinem Eventmakro nochmal,
dies in Verbindung mit dem Close Ereignis, dann wird die Applikation nicht richtig beendet.
Mehr kann ich Dir dazu auch nicht sagen.
Gruß Tino
Anzeige
vielleicht gehts ja
09.05.2009 12:26:33
Tino
Hallo,
ich weis jetzt nicht ob dies Dein Problem lösen kann, versuchen kann man es ja mal.
kommt als Code in DieseArbeitsmappe
Option Explicit 
 
Private Sub Workbook_BeforeClose(Cancel As Boolean) 
Dim iMsg As Integer 
Dim mySaved As Boolean 
 
 
If Not Me.Saved Then 
 iMsg = MsgBox("Sollen Ihre Änderungen an '" & Me.Name & "' gespeichert werden?", vbYesNoCancel) 
    Select Case iMsg 
     Case vbYes: Me.Save: mySaved = True 
     Case vbNo: mySaved = True 
     Case vbCancel: Cancel = True: Exit Sub 
    End Select 
Else 
    mySaved = True 
End If 
 
    If mySaved Then 
        If Workbooks.Count = 1 Then 
         Application.Quit 
        Else 
         ThisWorkbook.Close False 
        End If 
    End If 
 
End Sub 
 


Gruß Tino

Anzeige
AW@all: Problem anscheinend gelöst
09.05.2009 16:01:48
Martin
Hallo Tino, Gerd, Rainer,
habe eine Brachial-Lösung gefunden, so dass es jetzt bei mir funktioniert (Dank API-Guide von www.allapi.net)

' API-Functions to securely quit Excel-Instance
Private Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode  _
As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Sub ExcelSuicide()
' Securely quits Excel-Instance which calls this sub
ExitProcess GetExitCodeProcess(GetCurrentProcess, 0)
End Sub
Sub Main()
' and quit excel
Application.Quit
' In case standard quit fails, use API-Functions to kill this Excel-instance
Call ExcelSuicide
' In case, quitting fails, close workbook at least
ActiveWorkbook.Close (False)
end sub


Vielleicht hilft es ja auch anderen, da das Problem anscheinend nicht so selten ist.
Danke für's Mitdenken,
bis bald,
Martin

Anzeige
aber mit Application.Quit...
09.05.2009 16:24:20
Tino
Hallo,
..., tust Du auch andere Excel Dateien in dieser Instanz beenden die Du eventuell gar nicht beenden möchtest und sind diese nicht gespeichert, geht auch noch Deine Änderung in dieser oder diesen Dateien verloren.
Oder sehe ich dies falsch?
Gruß Tino
AW: Excel per VBA beenden
09.05.2009 10:37:43
Gerd
Hallo Martin!
Mal die DisplayAlerts beim Testen drin lassen?
Gruß Gerd
Anzeige
AW: Excel per VBA beenden
09.05.2009 11:55:27
Martin
Hallo Gerd,
DisplayAlerts direkt vor dem Aufruf von Application.quit hat leider keinerlei Meldung gebracht.
Trotzdem danke,
Martin
AW: Excel per VBA beenden
09.05.2009 11:33:41
Raist10
Es ist ein kleines Phänomen, manche Sachen gerade in Bezug auf Open und Close funtkionieren nicht richtig wenn sie aus einem Workbook-Ereignis wie eben Open und Close heraus aufgerufen werden.
Hatte ich auch schon mehrfach das Problem und es gibt meines Wissens nach keine wirkliche Lösung, als einen recht umständliche Weg zu nehmen. Ich habe es wie folgt gelöst (was allerdings in meinem Fall dann einfacher, da ich eh eine User-Navigation eingebaut hatte):
Habe in den Ereignissen Close und Save in der Klasse DieseArbeitsmappe, schlicht und ergreifend eingebaut das Schliessen/Speichern aus dem normalen Excel Menu mit Cancel = True quittiert werden. Dafür habe ich ein Flag in einem versteckten Sheet gesetzt (geht aber auch über eine öffentliche Variabele). Dieses Flag wird nur auf True gesetzt wenn der User die im Sheet eingebauten Speichern oder Schliessen-Button drückt und somit werden die Ereignisse nur dann mti Cancel = False bestätigt.
Da der User nun den im sheet eingebauten Button nutzen muss, kann ich hier Prozeduren aufrufen BEVOR ich dann endgültig das Kommando Save oder Close geben lasse. Damit erfolgt die Abbarbeitung der nötigen Prozeduren eben aus einer Sub/Function heraus und nicht aus den Ereignisse Close/Save ... und dann klappt es auch perfekt.
Wie gesagt, umständlich ist aber meines Wissens nach die einzige Möglichkeit um diesen Excel-Bug zu umgehen, wenn es denn wirklich nötig ist.
Versuche es erst gar nicht mit tief ineinander geschachtelten Aufrufen von Sub's, das Problem kannst du tatsächlich nur lösen wenn Du die Anweisungen AUSSERHALB der Ereignisse BeforeSave/BeforeClose ausführen lässt.
Gruß
Rainer
Anzeige
AW: Excel per VBA beenden
09.05.2009 12:11:59
Gerd
Hallo Martin!
Mit Lösungsvorschlägen eines Amateurs an einen Doppel-Profi ist das so eine Sache.
Trotzdem: Evtl. fehlt nur ein Sleep vor Application.Quit, weil noch nicht alle Berechnungen
abgeschlossen sind ?
Gruß Gerd
AW: Excel per VBA beenden
09.05.2009 15:50:06
Martin
Hallo Gerd,
alles schon probiert. Danke für's Mitdenken.
Habe Brachial-Lösung gefunden, hänge ich hinter Tinos Beitrag.
Bis bald,
Martin
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Excel per VBA beenden: Schritt-für-Schritt-Anleitung und Lösungen


Schritt-für-Schritt-Anleitung

Um Excel per VBA zu beenden, kannst Du folgenden Code verwenden. Dieser sollte in der DieseArbeitsmappe-Klasse deines VBA-Projekts platziert werden:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim mySaved As Boolean

    If Not Me.Saved Then
        If MsgBox("Sollen Ihre Änderungen an '" & Me.Name & "' gespeichert werden?", vbYesNoCancel) = vbYes Then
            Me.Save
            mySaved = True
        ElseIf vbCancel Then
            Cancel = True
            Exit Sub
        End If
    Else
        mySaved = True
    End If

    If mySaved Then
        If Workbooks.Count = 1 Then
            Application.Quit
        Else
            ThisWorkbook.Close False
        End If
    End If
End Sub

Dieser Code fragt den Benutzer, ob Änderungen gespeichert werden sollen, bevor das Workbook geschlossen wird. Falls es das einzige geöffnete Workbook ist, wird Excel auch beendet.


Häufige Fehler und Lösungen

Ein häufiges Problem tritt auf, wenn der Application.Quit-Befehl nicht funktioniert, weil der Code aus einem Workbook-Ereignis wie Workbook_Open oder Workbook_BeforeClose heraus aufgerufen wird.

Lösungen:

  • Stelle sicher, dass der Application.Quit-Befehl nicht mehrfach im Code aufgerufen wird.
  • Verwende Application.DisplayAlerts = False, um Dialoge zu unterdrücken, wenn Du sicher bist, dass keine Warnmeldungen angezeigt werden sollen.

Wenn Excel nicht richtig beendet wird, kann es hilfreich sein, einen kurzen Sleep-Befehl vor dem Application.Quit einzufügen:

Application.Wait (Now + TimeValue("0:00:01")) ' 1 Sekunde warten
Application.Quit

Alternative Methoden

Eine alternative Methode zum Beenden von Excel ist die Verwendung von API-Funktionen. Dies kann nützlich sein, wenn der Standardbefehl Application.Quit nicht funktioniert:

Private Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long

Private Sub ExcelSuicide()
    ExitProcess GetExitCodeProcess(GetCurrentProcess, 0)
End Sub

Sub Main()
    Application.Quit
    Call ExcelSuicide
End Sub

Dieser Code beendet die Excel-Instanz erzwingend.


Praktische Beispiele

Hier ist ein einfaches Beispiel für ein VBA-Skript, das alle offenen Arbeitsmappen schließt und Excel gleichzeitig beendet:

Sub CloseAllWorkbooksAndQuit()
    Dim wb As Workbook
    For Each wb In Workbooks
        wb.Close SaveChanges:=False
    Next wb
    Application.Quit
End Sub

Dieses Skript schließt alle offenen Arbeitsmappen ohne Speicherung und beendet Excel.


Tipps für Profis

  • Achte darauf, die Verwendung von Application.Quit in Kombination mit Workbook_Open oder Workbook_BeforeClose zu vermeiden, da dies zu unerwartetem Verhalten führen kann.
  • Verwende Flags oder versteckte Sheets, um den Schließprozess besser zu steuern.
  • Teste Deinen Code gründlich, insbesondere in verschiedenen Excel-Versionen, um sicherzustellen, dass es keine Unterschiede im Verhalten gibt.

FAQ: Häufige Fragen

1. Warum funktioniert Application.Quit nicht in meinem Makro?
Es kann sein, dass der Befehl aus einem Event wie Workbook_Open oder Workbook_BeforeClose aufgerufen wird. Versuche, den Befehl in einer separaten Subroutine auszuführen.

2. Wie kann ich Excel sofort beenden, ohne Speicherfragen?
Du kannst Application.DisplayAlerts = False verwenden, um alle Dialoge zu unterdrücken, bevor Du Application.Quit aufrufst.

3. Was ist die beste Methode, um Excel zu beenden?
Die beste Methode hängt von Deinem spezifischen Anwendungsfall ab. In vielen Fällen ist der einfache Aufruf von Application.Quit ausreichend, während in anderen Fällen API-Funktionen notwendig sind, um ein hartnäckiges Excel zu beenden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige