Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1508to1512
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

Abbruch des Schließens über workbook_beforeclose P

Abbruch des Schließens über workbook_beforeclose P
09.08.2016 12:37:15
Oliver
Hallo beisammen,
Ich habe ein eigenartiges Problem:
Ich möchte beim Schließen einer Arbeitsmappe den üblichen Dialog zum Speichern und Abbrechen von Excel manuell vorwegnehmen (um eine Reihe von Fehlern zu umgehen, die aufgrund von Active-X Steuerelementen beim Schließen dieser Datei hervorgerufen werden, weil die zugehörigen Ereignisprozeduren komischerweise trotz Einstellung application.enableevents=false beim Schließen ausgeführt werden und scheinbar die Steuerelemente beim Schließen der Arbeitsmappe entladen werden (?!?), so dass die Objekt-Bezüge in den Prozeduren nicht mehr gefunden werden ... aber das ist ein anderes Thema.).
Ich habe hier mal einen vereinfachten Auszug der workbook_beforeclose Prozedur beigelegt, den ich so an einer komplett leeren, neuen Arbeitsmappe getestet habe.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim ans As VbMsgBoxResult, SV As Boolean
ans = MsgBox("Speichern?", vbYesNoCancel, "Achtung")
SV = ans = vbYes
Cancel = ans = vbCancel
If SV Then ThisWorkbook.Save
ThisWorkbook.Saved = True
If Not Cancel Then
appplication.DisplayAlerts = False
If Application.Workbooks.Count = 1 Then Application.Quit
ThisWorkbook.Close False
End If
End Sub

Eigentlich sollte doch nun, wenn man bei der Abfrage "Abbrechen" auswählt, das Beenden abgebrochen werden. Hier liegt nun mein Problem. Die Variable "Cancel" wird wie gewünscht auf true gesetzt, aber die Arbeitsmappe schließt sich trotzdem.
Hat jemand dafür eine Erklärung?
(Ich arbeite mit Office 2013 mit Windows 8.1)
Ein weiteres Problem ist, dass hier in der leeren Beispieldatei der Befehl application.quit korrekt funktioniert. In meiner eigentlichen Datei wird aber immer nur die Arbeitsmappe geschlossen und Excel bleibt als leeren Fenster offen. Das kann ich mir auch nicht recht erklären.
Liebe Grüße,
Oliver

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Abbruch des Schließens über workbook_beforeclose P
09.08.2016 12:42:59
Oliver
Kleine Korrektur:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim ans As VbMsgBoxResult, SV As Boolean
ans = MsgBox("Speichern?", vbYesNoCancel, "Achtung")
SV = ans = vbYes
Cancel = ans = vbCancel
If Not Cancel Then
Application.DisplayAlerts = False
If SV Then ThisWorkbook.Save
ThisWorkbook.Saved = True
If Application.Workbooks.Count = 1 Then Application.Quit
ThisWorkbook.Close False
End If
End Sub
Und auch bei dieser Arbeitsmappe bleibt Excel als leere Anwendung geöffnet...
Excelfenster bleibt offen
09.08.2016 12:57:52
Daniel
das erste Problem kann ich nicht nachvollziehen, wenn ich den Code bei mir einfüge und ausführe, bleibt die Datei offen, wenn man "Abbrechen" gewählt hat.
Nachdem aber bei dir noch ein Tippfehler im Code ist (appplication), würde ich dir raten, deinen Code nochmal dahingehend zu überprüfen, ob du alle Variablennamen immer richtig geschrieben hast (hier hilft oft auch, mit Option Explicit zu arbeiten)
Die Erklärung für das zweite Phänomen:
das liegt wahrscheinlich daran, dass noch weitere aber ausgeblendete Dateien geöffnet sind.
Diese werden beim Workbooks.Count natürlich mitgezählt.
Im Regelfall ist das die Datei Personl.xlsb aus dem Autostartordner.
Gruß Daniel
Anzeige
AW: Excelfenster bleibt offen
10.08.2016 16:46:44
Oliver
Hallo Daniel,
Danke für die schnelle Antwort. Den Schreibfehler hatte ich auch schon bemerkt, daher der nachgeschobene Text.
Ich habe es auch heute getestet, aber obwohl im Einzelschritt die Prozedur gut durchläuft und der Wert für Cancel auf wahr steht, wird die Mappe geschlossen... sehr seltsam. Hat dafür jemand eine Erklärung? Kann es in Excel Grundeinstellungen oder geladene Verweise o.ä. geben, die die Funktionen blockieren?
Zum zweiten Punkt - der workbook.count ergibt hier 1 und der Befehl application.quit wird auch angesprungen - nur scheinbar nicht ausgeführt. Die Mappe wird trotzdem nur geschlossen und eine leere Excel-Instanz bleibt offen.
Gleich dazu noch eine Antwort an den Vorschlag von Chris...
VG,
Oliver
Anzeige
AW: Abbruch des Schließens über workbook_beforeclose P
09.08.2016 13:03:26
ChrisL
Hi Oliver
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim ans As VbMsgBoxResult, SV As Boolean
ans = MsgBox("Speichern?", vbYesNoCancel, "Achtung")
SV = ans = vbYes
Cancel = ans = vbCancel
If Not Cancel Then
If SV Then ThisWorkbook.Save
ThisWorkbook.Saved = True
If Application.Workbooks.Count = 1 Then Application.Quit
End If
End Sub

cu
Chris
Wieder Fehlfunktionen
10.08.2016 17:58:56
Oliver
Hallo Chris, auch Dir vielen Dank für die schnelle Antwort.
Das Beenden der Mappe funktioniert jetzt, wenn nach dem "application.quit" kein "workbook.close" mehr steht. Das liegt aber daran, dass, wie unten beschrieben, die Methode quit überhaupt nicht ausgeführt wird (im Einzelschrittverfahren wird diese angesprungen und ausgeführt, aber es passiert nichts).
Was ich mir dabei auch nicht erklären kann ist, dass die Zuweisung "application.displayalerts=false" ein paar Zeilen vorher auch nicht übernommen wird.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim ws As Worksheet, SaveWB As Boolean, Speich As VbMsgBoxResult
Application.EnableEvents = False: Me.EventsOff = True
Me.Manual = False
Speich = MsgBox("Sollen Änderungen gespeichert werden?", vbYesNo, "Schliessen")
SaveWB = Speich = vbYes
'    Cancel = Speich = vbCancel
'    If Not Cancel Then
Application.CalculateBeforeSave = False
For Each ws In ThisWorkbook.Worksheets
ws.EnableCalculation = False
Next ws
Application.DisplayAlerts = False
If SaveWB Then ThisWorkbook.Save
ThisWorkbook.Saved = True
If Application.Workbooks.Count = 1 Then Application.Quit
'    End If
'Application.EnableEvents = True: Me.EventsOff = False
End Sub
Im Einzelschrittverfahren wird beim vorstehenden Code bei meiner eigentlichen Tabelle direkt nach dem Abarbeiten der Zeile trotzdem der Wert "true" angezeigt. Erst wenn ich im Direktfenster die Zuweisung manuell mache, wird sie auch übernommen. Kann das irgend jemand nachvollziehen?
Vielleicht liegt hier ja auch der Hund mit der "Cancel" und "application.quit" Fehlfunktion begraben?
Nachdem dann die Prozedur workbook_close durchgelaufen ist, hagelt es beim Schließen der Datei Fehlermeldungen, wie schon in der ersten mail beschrieben, da scheinbar beim "Entladen" der Active-X Steuerelemente (Dropdowns und Textfelder) der Code des Tabellenblattes (Change-Prozeduren der Active-X Steuerelemente und andere) durchlaufen oder zumindest compiliert wird. Dabei werden dann verschiedene Active-X Objekte nicht mehr gefunden und es kommen Fehlermeldungen, dass die calculate-Methode des application-Objektes nicht ausgeführt werden konnte. Ich komme leider nicht dahinter, warum das so ist.
Zu diesem Zeitpunkt führt im Direktfenster auch die manuelle Eingabe "application.displayalerts=false" zum Fehler 1004 (Anwendungs- oder Objektdefinierter Fehler).
Wenn ich am Ende der workbook_close Prozedur, nach der Zeile mit dem application.quit noch die Zeile "thisworkbook.close false" einfüge, dann wird die Mappe ohne die vorgenannten Fehlermeldungen geschlossen (aber die leere Instanz bleibt offen...).
Falls noch jemand Lust zu tüfteln hat, kann ich die eigentliche Datei auch per mail zusenden. Online stellen geht aus rechtlichen Gründen nicht.
Bei der beigefügten leeren Tabelle nur mit dem bereits bekannten Makro sieht es bei mir ähnlich aus.
Das "application.quit" wird nicht ausgeführt und die cancel-Funktion funktioniert einfach nicht...kann das vielleicht mal jemand bei sich testen?
https://www.herber.de/bbs/user/107540.xlsm
Viele Grüße,
Oliver
Anzeige
unerklärlicher Absturz
11.08.2016 09:56:28
ChrisL
Hi Oliver
Wenn mehrere Mappen geöffnet sind und Close ausgeführt wird, stürzt bei mir Excel ab. Kann ich mir nicht erklären und ich habe bis jetzt keine Lösung gefunden, darum die Frage als offen gekennzeichnet.
Alles andere sollte OK sein.

Public bNurClose As Boolean
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If bNurClose Then Exit Sub
Dim ans As VbMsgBoxResult, SV As Boolean
ans = MsgBox("Speichern?", vbYesNoCancel, "Achtung")
SV = ans = vbYes
Cancel = ans = vbCancel
If Not (Cancel = True) Then
If SV Then
Application.DisplayAlerts = False
ThisWorkbook.Save
Application.DisplayAlerts = True
End If
ThisWorkbook.Saved = True
If Application.Workbooks.Count = 1 Then
Application.Quit
Else
bNurClose = True
ThisWorkbook.Close False
End If
End If
End Sub

cu
Chris
Anzeige
Rückzug
11.08.2016 12:56:56
ChrisL
Hallo
Hatte nun nochmals kurz Zeit um zu Testen und jetzt scheint alles zu funktionieren. War wohl ein temporäres Problem.
cu
Chris

85 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige