Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1740to1744
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

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

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
Anzeige
AW: VBA Application.Quit
21.02.2020 16:05:24
onur
Und wieso nicht so:
Application.DisplayAlerts = False
Application.Quit

?
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

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige
Archiv - Verwandte Themen
Forumthread
Beiträge