Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Application.Quit

Forumthread: VBA Application.Quit

VBA Application.Quit
21.02.2020 14:34:14
Peer
Hallo.
Ich möchte kontrolliert beim Schließen der Excel-Datei die komplette Excel App schließen. Dafür habe ich beim einem eigenen Ribbon ein Button, bei dem ich mit folgenden Code benutzen will.
Sub Exit_Workbook(control As IRibbonControl)
Dim ExcelApp As Object
Set ExcelApp = CreateObject("Excel.Application")
MsgBox "Mappe " & vbCrLf & vbCrLf & ThisWorkbook.Name & vbCrLf & vbCrLf & " schließen?",  _
vbOKOnly + vbInformation, "Alles schließen"
Application.EnableEvents = False
If Application.Workbooks.Count > 1 Then
Calculate
ActiveWorkbook.Save
ActiveWorkbook.Close
Exit Sub
ElseIf Application.Workbooks.Count = 1 Then
Calculate
ActiveWorkbook.Save
ActiveWorkbook.Close
ExcelApp.Quit
End If
ExcelApp = Nothing 'Freigabe des Speichers
End
'ThisWorkbook.Close
Application.EnableEvents = True
End Sub

Aber er beendet nur die Mappe(n). Application.Quit funktioniert wahrscheinlich nicht.
Ich habe im Netz schon verschiedene Möglichkeiten durchprobiert, komme aber immer wieder auf selbes (negatives) Ergebnis.
Was kann ich noch tun?
Hat jemand Erfahrung und kann mir eine Lösung bieten?
Anbei die Beispielmappe.
https://www.herber.de/bbs/user/135353.xlsm
Ich habe zusätzlich den "X"-Button zum Schließen mit einer MsgBox deaktiviert.
LG
Peer
Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Application.Quit
21.02.2020 15:13:02
onur
Du schliesst nur eine einzige Datei, wenn mehr als eine Datei offen sind.
Du musst es in einer Schleife machen, um sie ALLE zu schliessen.
Ungetestet:
If Application.Workbooks.Count > 1 Then
for i=1 to Application.Workbooks.Count
with apllication.Workbooks(i)
Calculate
ActiveWorkbook.Save
ActiveWorkbook.Close
Exit Sub
end with
next i
end if

Anzeige
AW: VBA Application.Quit
21.02.2020 16:02:58
Peer
Hallo onur.
Danke, aber geschlossen wurden vorher auch schon alle. Aber deine Lösung ist zum Schließen auch eine gute (beste) Idee.
Aber das Problem des Schließen von Excel bleibt.
LG
Peer
AW: VBA Application.Quit
21.02.2020 16:05:24
onur
Und wieso nicht so:
Application.DisplayAlerts = False
Application.Quit

?
Anzeige
AW: VBA Application.Quit
21.02.2020 16:57:19
Peerli
Habe ich auch probiert.
AW: VBA Application.Quit
22.02.2020 09:11:50
Matthias
Moin!
Ich habe mal noch ein paar Fragen zum Code.
1. Du fragst in der MsgBox, ob die Mappe geschlossen werden soll, gibst aber nur einen Button zum Bestätige!? Was passiert, wenn mir da einfällt ne, nicht speichern? Das solltest du noch ändern.
2. Das Problem mit dem Schließen entsteht m.E. daraus, dass du am Anfang eine neue Excel Instanz öffnest. Jetzt die Frage wozu? Machst du mit der noch was, was für unsere Testzwecke nicht im Code stand?
Gibt jetzt mind. 2 Möglichkeiten (teilweise ähnlich), dein Problem zu beheben.
1. Nimm die zusätzliche Instanz raus und dann wie Onur schrieb nur das Application.quit. Also so:
Sub Exit_Workbook(control As IRibbonControl)
Dim ExcelApp As Object
'Set ExcelApp = CreateObject("Excel.Application")
MsgBox "Mappe " & vbCrLf & vbCrLf & ThisWorkbook.Name & vbCrLf & vbCrLf & " schließen?", _
vbOKOnly + vbInformation, "Alles schließen"
Application.EnableEvents = False
If Application.Workbooks.Count > 1 Then
Calculate
ActiveWorkbook.Save
ActiveWorkbook.Close
Exit Sub
ElseIf Application.Workbooks.Count = 1 Then
Calculate
ActiveWorkbook.Save
Application.Quit
End If
'ThisWorkbook.Close
Application.EnableEvents = True
End Sub
2. Variante falls du die andere INstanz brauchst.
Dabei wird die Mappe nicht geschlossen (Damit sollte der Code beendet sein) sondern die neue Instanz zugemacht und dann die andere Instanz geholt und geschlossen.
Sub Exit_Workbook(control As IRibbonControl)
Dim ExcelApp As Object
Set ExcelApp = CreateObject("Excel.Application")
MsgBox "Mappe " & vbCrLf & vbCrLf & ThisWorkbook.Name & vbCrLf & vbCrLf & " schließen?", _
vbOKOnly + vbInformation, "Alles schließen"
Application.EnableEvents = False
If Application.Workbooks.Count > 1 Then
Calculate
ActiveWorkbook.Save
ActiveWorkbook.Close
Exit Sub
ElseIf Application.Workbooks.Count = 1 Then
Calculate
ActiveWorkbook.Save
ExcelApp.Quit
End If
'ThisWorkbook.Close
Application.quit
Application.EnableEvents = True
End Sub
Zusätzlich könntest du dir (falls noch weitere Instanzen voliegen) diese holen und ebenfalls schließen. geht mit.
Set ExcelApp = GetObject(, "Excel.Application")
ExcelApp.Quit

Da du 2 Instanzen hattest, hat Ecxel beim SClie´ßen der Mappe den Code beendet und da noch eine INstanz da war die Anwendung nicht geschlossen. Da du eh gespeichert hast, das wb.close in dem Fall rauslassen.
Konnte es jetzt aber nicht aus dem Rippon testen, sondern als eigene freie Sub.
VG
Anzeige
AW: VBA Application.Quit
22.02.2020 10:55:47
Peer
Hallo Matthias.
Vielen Dank für deine Ausführlichkeit.
zu 1:
Ich habe die MsgBox nur grob erstellt, um das Verhalten des Codes zu sehen. Natürlich möchte ich sie dann noch anpassen. Gegebenenfalls wie von dir beschrieben, entweder ohne Abfrage gleich speichern und schließen (weiß noch nicht, was besser ist) oder mit Auswahl, ob Schließen ohne Speichern oder Abbrechen (was besser ist).
In erster Linie ging es mir aber nur um das Schließen der Instanz.
Und da komme ich zu Punkt 2:
Ich habe den "zweiten Instanz Code" als Möglichkeit eingefügt, weil ich im Netz schon alle Möglichkeiten ausprobiert habe und zu keinem Ergebnis gekommen bin. Ich habe vorher auch ohne die zweite Instanz keinen Erfolg gehabt. Wenn ich alle Beiträge in den verschiedenen Foren lese, glaube ich langsam, dass es an mir oder an meinem PC und Excel liegt. Ich tippe auch Erstes.
Also das Problem liegt bei mir am Schließen der Instanz. Ich bekomme einfach nicht Schließen von Excel hin.
Mit deinem Vorschlag bekomme ich jetzt die Fehlermeldung
Laufzeitfehler 450: Falsche Anzahl an Argumenten oder ungültige Zuweisung zu einer Eigenschaft
Und so bin ich der Sache nachgegangen und habe etwas gefunden. Ich wollte gern den X-Button von _ Excel mit einer Meldung blockieren und habe in "DieseArbeitsmappe" im BeforeClose-Event

MsgBox "Schließen in der Symbolleiste möglich!", vbOKOnly + vbQuestion, "Meldung anzeigen"
Cancel = True
eingefügt. Und das kollidierte wahrscheinlich.
Wie kann ich erreichen, dass beide Codes zusammenarbeiten?
Hier nochmal die Beispielmappe mit deiner Version. Ribbon ist im Register "Erfassungsbelege" .
https://www.herber.de/bbs/user/135371.xlsm
LG
Peer
Anzeige
AW: VBA Application.Quit
22.02.2020 11:20:33
Matthias
Moin!
ALso erstmal denke ich nicht, dass es in diesem Fall an dir liegt. :-) Soll aber nicht für alle Probleme gelten. :-)
Habe deine Datei mal runtergeladen. Nach dem Löschen der üblichen UFs (wir habe da ja schon mehrfach bei Fragen an der Datei gewerkelt und die beiden UFs mögen mich bzw. mein System immer noch nicht) konnte ich auch testen. Also dein Schließen aus dem Menüband Erfassungsbelege geht bei mir. Auch Excel macht sich dann zu.
Bzgl. des Fehlers. Bei welcher der beiden Varianten tritt er auf (am besten mal den eingebauten Code posten)? Und da wäre interessant, bei welcher Zeile. Im Zweifel (unschön programmiert ich weiß), packe einfach ein On Error resume next davor. Die Datei + Excel soll ja nur zugemacht werden. Da ist es wurscht, ob da noch ein Fehler bei einem späteren Aufruf auftritt. Hatte beim Testen vorhin auch manchmal das Problem. Das lag aber eher daran, dass Excel schon im zumachen war und er dann für application oder exapp keine Zuweisung mehr hatte.
Zu Unterdrückung des schließen. Bei UFs hast du da noch einen Closemode. Der fehlt aber bei der Mappe. Dort kannst du das einbauen, in dem du dir in einem Modul eine globale Variable anlegst. Die fragt du beim before close ab. Wenn da bspw. ja drin steht, machst du zu sonst setzt zu cancel auf true und das schließen endet. Nur bei dem Code, der zumachen darf, beschreibst du die Variable mit ja und es sollte klappen.
VG
Anzeige
AW: VBA Application.Quit
22.02.2020 11:55:25
Peer
Hallo Matthias.
Oh Gott, da müssen deine Denkweise sich mit meiner Laien-Denkweise noch einige Verhandlungen aussetzen, denn ich verstehe so einiges noch nicht...
Was die UF'S angeht, verstehe ich es auch nicht, da alle UF's auf verschiedenen Rechner bei verschiedenen Kollegen auch funktionieren.
Das Schließen aus dem Ribbon funktioniert nun auch, da ich die Zeile

MsgBox "Schließen in der Symbolleiste möglich!", vbOKOnly + vbQuestion, "Meldung anzeigen"
Cancel = True
aus "DieseArbeitsmappe" auskommentiert habe. Ich hatte aber vor, mit dieser Zeile das Schließen-Kreuz zu deaktivieren, weil eben alle bzw. viele Kollegen IMMER dieses Kreuz zum Schließen nutzen. Das hat mich schon früher genervt, weil man meiner Meinung nach so keine Programme schließt.
Ich habe diesen Code

Sub Exit_Workbook(control As IRibbonControl)
Dim ExcelApp As Object, i As Long
Set ExcelApp = CreateObject("Excel.Application")
MsgBox "Mappe " & vbCrLf & vbCrLf & ThisWorkbook.Name & vbCrLf & vbCrLf & "schließen?",  _
vbOKOnly + vbInformation, "Alles schließen"
Application.EnableEvents = False
If Application.Workbooks.Count > 1 Then
Calculate
ActiveWorkbook.Save
ActiveWorkbook.Close
Exit Sub
ElseIf Application.Workbooks.Count = 1 Then
Calculate
ActiveWorkbook.Save
'ActiveWorkbook.Close
ExcelApp.Quit
End If
Application.Quit
'ThisWorkbook.Close
Application.EnableEvents = True
'ExcelApp = Nothing 'Freigabe des Speichers
End Sub
im Modul con_Exit und wie oben erwähnt, die zwei Zeilen im BeforeClose-Event von "DieseArbeitsmappe".
Zu "On Error resume next" hast du recht. Ich habe dies des öfteren gelesen. Im Prinzip muss bzw. sollte ich mich erstmal um das Fehlerabfangen bei meinem Code kümmern, als daran weiter zu arbeiten.
Ich habe nämlich auch gelesen, dass eine gute Fehlerroutine unausweichlich ist.
Ich habe die CloseMode-Event auskommentiert (Überbleibsel von den Versuchen) und die die beiden Zeilen im BeforeClose-Event von "DieseArbeitsmappe" wieder aktiviert und jetzt bekomme ich zwar keinen Fehler mehr, aber nach dem Klick aus "Schießen" im Ribbon, schließt er nicht mehr, sondern bringt die MsgBox vom BeforeClose-Event (was ja logisch ist).
Bis jetzt kann ich die Mappe in diesem Zustand nnur über den Taskmannager schließen.
Deinen letzten Absatz verstehe ich noch nicht ganz. Wie kann ich mir das vorstellen?
Ich schicke dir die Mappe nochmal, die ein wenig verändert wurde, mit der Hoffnung, dass du es diesmla öffnen kannst. Ziel ist es ja, dass die Mappe überall anstandslos funktioniert.
https://www.herber.de/bbs/user/135373.xlsm
LG
Peer
Anzeige
AW: VBA Application.Quit
22.02.2020 14:24:26
Matthias
Moin!
Mach dir da wegen der UF keinen Kopf. Liegt vermtl. an meinem System.
Das mit dem Fehler war übrigens nicht generell auf mögliche andere Fehler sondern nur auf den speziellen Fall gemüntzt. Deshalb gleich zum Schließen und dem letzten Teil meines letzten Posts. Änder dein con_exit mal so ab
Option Explicit
Public schliessmode As String
Sub Exit_Workbook(control As IRibbonControl)
Dim ExcelApp As Object, i As Long
Set ExcelApp = CreateObject("Excel.Application")
MsgBox "Mappe " & vbCrLf & vbCrLf & ThisWorkbook.Name & vbCrLf & vbCrLf & "schließen?",  _
vbOKOnly + vbInformation, "Alles schließen"
Application.EnableEvents = False
If Application.Workbooks.Count > 1 Then
Calculate
ActiveWorkbook.Save
schliessmode = "ja"
ActiveWorkbook.Close
Exit Sub
ElseIf Application.Workbooks.Count = 1 Then
Calculate
ActiveWorkbook.Save
'ActiveWorkbook.Close
schliessmode = "ja"
ExcelApp.Quit
End If
Application.Quit
'ThisWorkbook.Close
Application.EnableEvents = True
'ExcelApp = Nothing 'Freigabe des Speichers
End Sub
und in dieser Arbeitsmappe änderst du das bevor_close so
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'    If Not Saved Then
'        Select Case MsgBox("Sollen Ihre Änderungen in '" & name & _
'            "' gespeichert werden", vbExclamation Or vbYesNoCancel, "Datei schließen")
'            Case vbYes
'                Save
'            Case vbNo
'                Saved = True
'            Case vbCancel
'                Cancel = True
'        End Select
'    End If
If schliessmode  "ja" Then
MsgBox "Schließen nur in der Symbolleiste möglich!", vbOKOnly + vbQuestion, "Meldung  _
anzeigen"
Cancel = True
Else
Call DeleteCommandBar
Cancel = False
End If
End Sub
Im con_Exit gibt es jetzt die Variable schliessmode. Habe da closemode verzichtet, da es den Begriff ja auch in den UFs gibt. Nicht das es da Verwicklungen gibt. Nur in dem Modul wird diese Variable beschrieben. Ansonsten ist sie leer.
In der before_close prüfst du sie nun. Wenn das x angeklickt wurde ist sie nicht gesetzt und das Beenden wird abgebrochen. Kommst du aus denem Modul steht ein Wert drin und das Programm und auch Excel werden beendet. Wobei ich immer noch denke, dass du die zusätzliche App weglassen kannst und dafür nur mit Application.quit arbeiten brauchst. Wenn das so klappt, kannst du ja dahingehend nochmal testen.
VG
Anzeige
AW: VBA Application.Quit
22.02.2020 15:11:06
Peer
Hallo Matthias.
Es funktionierte am Anfang schon. Und ich habe die erzeugte zweite Instanz auskommentiert und es geht ohne Probleme durch. Du hattest recht.
Jetzt habe ich mal den Versuch einer zweiten Mappe unternommen und ein weiteres Excel-File geöffnet und dann auf den Schließen Button des Ribbon gedrückt. Die Instanz mit der Beispiel-Mappe schließt er zwar, aber nicht ohne Meldung "Focus kann nicht auf das Steuerelement gesetzt werden. Es ist unsichtbar, nicht aktiviert oder von einem anderen Typ, der keinen Fokus akzeptiert.".
Eins verstehe ich auch nicht.
Warum kommt beim Schließen trotzdem nochmal der "Speichern"-Dialog?
Habe ich da noch etwas versteckt?
Gruß
Peer
Anzeige
AW: VBA Application.Quit
22.02.2020 17:35:44
Matthias
Moin!
Ändere mal den ersten Teile de Schleife in deinem con_Exit so um:
If Application.Workbooks.Count > 1 Then
Calculate
schliessmode = "ja"
ThisWorkbook.Save
'schliessmode = "ja"
ThisWorkbook.Activate
ActiveSheet.Cells(1, 1).Select
ThisWorkbook.Close
Das Problem ist, dass bei mehrern Mappen Excel eine genaue Zuordnung braucht. Deshalb aktiviere ich die Mappe nochmal und selektiere die Zelle im aktiven Blatt (kann du auch ändern - am besten auf eine Zelle, bei der kein Event losgeht). Damit sind wir auf Nummer sicher.
Dann habe ich die Zuweisung an schliessmode vor das save gepackt. Wenn es nach dem save kommt, ist ja was in der Datei geändert und die Frage zum Speichern kommt nochmal.
VG
Anzeige
AW: VBA Application.Quit
24.02.2020 16:33:21
Peer
Hallo Matthias.
Sorry, das ich mich so spät melde. Ich war das Wochenende außer Gefecht.
Jetzt wird der "Speichern"dialog nicht mehr angezeigt.
Danke dafür.
LG
Peer
;
Anzeige

Infobox / Tutorial

VBA Application.Quit für Excel: Alles, was Du wissen musst


Schritt-für-Schritt-Anleitung

Um die Excel-Anwendung kontrolliert zu schließen, kannst Du den folgenden VBA-Code verwenden. Dieser Code fragt den Benutzer, ob die aktuelle Arbeitsmappe geschlossen werden soll, und schließt anschließend die Excel-Anwendung.

Sub Exit_Workbook(control As IRibbonControl)
    MsgBox "Mappe " & vbCrLf & vbCrLf & ThisWorkbook.Name & vbCrLf & vbCrLf & " schließen?", _
    vbOKOnly + vbInformation, "Alles schließen"

    Application.EnableEvents = False
    If Application.Workbooks.Count > 1 Then
        For i = Application.Workbooks.Count To 1 Step -1
            Application.Workbooks(i).Close SaveChanges:=True
        Next i
    Else
        ThisWorkbook.Close SaveChanges:=True
    End If
    Application.Quit
    Application.EnableEvents = True
End Sub

Dieser Code schließt alle geöffneten Arbeitsmappen und beendet die Excel-Anwendung mit Application.Quit. Stelle sicher, dass Du alle Änderungen gespeichert hast, bevor Du die Anwendung schließt.


Häufige Fehler und Lösungen

  • Fehler: "Excel.quit nicht funktioniert"
    Überprüfe, ob der Code in der richtigen Umgebung ausgeführt wird. Möglicherweise gibt es andere Instanzen von Excel, die noch offen sind. Verwende die Methode GetObject zur Referenzierung der bestehenden Excel-Instanz.

  • Fehler: Laufzeitfehler 450
    Dieser Fehler tritt häufig auf, wenn eine falsche Anzahl an Argumenten übergeben wird. Stelle sicher, dass Du die richtigen Parameter bei den Methodenaufrufen verwendest.

  • Schließen des Excel-Fensters und Erhalten einer Fehlermeldung
    Wenn Du mehrere Arbeitsmappen geöffnet hast, aktiviere eine Zelle in der aktiven Arbeitsmappe, bevor Du sie schließt, um die Zuordnung zu klären.


Alternative Methoden

Eine weitere Möglichkeit, die Excel-Anwendung zu schließen, besteht darin, Application.Quit direkt zu verwenden, ohne eine neue Instanz von Excel zu erstellen. Hier ist ein Beispiel:

Sub Close_Excel()
    Application.DisplayAlerts = False
    Application.Quit
End Sub

Diese Methode schließt Excel ohne eine zusätzliche Bestätigungsnachricht, aber achte darauf, dass alle Änderungen gespeichert sind, um Datenverlust zu vermeiden.


Praktische Beispiele

Hier sind einige praktische Beispiele, wie Du Application.Quit in verschiedenen Szenarien einsetzen kannst:

  1. Beenden ohne Speichern
    Wenn Du Excel schließen möchtest, ohne die Änderungen zu speichern, kannst Du Folgendes verwenden:

    Sub Close_Without_Saving()
       Application.DisplayAlerts = False
       Application.Quit
    End Sub
  2. Beenden mit Abfrage
    Um den Benutzer zu fragen, ob er speichern möchte, bevor Excel geschlossen wird:

    Sub Confirm_Close()
       If MsgBox("Möchten Sie speichern?", vbYesNo) = vbYes Then
           ThisWorkbook.Save
       End If
       Application.Quit
    End Sub

Tipps für Profis

  • Verwendung von On Error Resume Next: Füge diese Zeile am Anfang Deines Codes hinzu, um Fehler zu ignorieren, die beim Schließen von Excel auftreten könnten. Dies kann helfen, unerwartete Abstürze zu vermeiden.

  • Fehlerbehandlung: Implementiere eine robuste Fehlerbehandlung, um sicherzustellen, dass Excel immer korrekt geschlossen wird, selbst wenn ein Fehler auftritt.

  • Nutze Variablen: Verwende Variablen wie schliessmode, um den Schließprozess zu steuern und Konflikte mit anderen Schließmethoden zu vermeiden.


FAQ: Häufige Fragen

1. Wie kann ich Excel beenden, ohne die Arbeitsmappe zu speichern?
Verwende Application.Quit zusammen mit Application.DisplayAlerts = False, um die Abfrage zu umgehen.

2. Warum funktioniert Application.Quit nicht?
Stelle sicher, dass Du keine weiteren Instanzen von Excel offen hast. Nutze GetObject zur Referenzierung der bestehenden Instanz.

3. Kann ich Excel über ein benutzerdefiniertes Ribbon schließen?
Ja, Du kannst einen Button in Deinem Ribbon erstellen, der den Code zum Schließen von Excel ausführt, wie im Beispiel gezeigt.

4. Was sind häufige Fehler beim Schließen von Excel via VBA?
Häufige Fehler sind Laufzeitfehler, wenn die Anzahl der Argumente nicht korrekt ist oder wenn Excel bereits beim Schließen ist.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige