Microsoft Excel

Herbers Excel/VBA-Archiv

Workbook_BeforeClose + Cancel = True


Betrifft: Workbook_BeforeClose + Cancel = True von: madame_schischi
Geschrieben am: 26.09.2019 18:42:20

Hallo liebes Forum,

bin neu im Forum. Also erst mal "Hallo" an all die fleißigen VBA-Könner.
Ganz neu bin ich natürlich nicht, das Forum hat mir aber schon über die ein oder andere Hürde hinweggeholfen, wenn es um VBA geht. Aber ich stelle heute meine erste eigene Frage.

Nachdem ich jetzt gefühlt jedes Fitzelchen im WWW durchsucht habe und weiß ich mir jetzt nicht mehr anders zu helfen und hoffe Euch fällt etwas ein.

Vorweg, ich arbeite mit VBA ausschließlich im Unternehmen, wo ich ohne Adminrechte

Betriebssystem Windows 2010 64 bit mit Office 2016 32 bit zur Verfügung habe.

Das habe ich in der Liste nicht gefunden.

So nun zum Thema:

Ich möchte ein eigenes Workbook_BeforeClose-Ereignis formulieren und dazu möchte ich das Office-Eigene Event killen (Sollen Ihre Änderungen... Speichern/Nicht Speichern/Abbrechen) zuverlässig unterdrückt werden. Die Arbeitsmappe darf nicht ohne Speichern verlassen werden, da ich im Workbook-Open-Event Speichermöglichkeiten kille und über das Leere Blatt-Makro (Danke) das öffnen ohne Makros verhindern will. Ich kenne die Schwachstellen. Speichern unter ist nur als Arbeitsmappe/Vorlage mit Makros möglich. das läuft alles soweit.

Aber:

Cancel = True
Ich dachte ja ich bin zu doof. Mal killt der Befehl das Ereignis mal nicht. Erst freu dann heul.

Nach viel Grübeln, warum das so ist und nachdem ich wirklich alles nachgebaut habe, was dazu im www geschrieben wurde bin ich durch Zufall auf folgendes Phänomen gestossen und habe dies mit zwei leeren, jungfräulichen Arbeitsmappen nachgestellt

Zuerst habe ich in einem Arbeitsblatt in "Meine Arbeitsmappe" folgenden Code eingegeben:

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.EnableEvents = False
Cancel = True
Application.EnableEvents = True
End Sub

Dann habe ich als "Excel Vorlage mit Makros" gespeichert.
Dann habe ich über das Schließkreuz (x) den Schließvorgang ein Mal angestoßen. Nichts Workbook bleibt offen. Prima.
Stoße ich aber gleich nochmal den Schließvorgang über (X) an wird die Mappe geschlossen, d.h. das normale Exelverhalten bei (x) greift.

Ändere ich eine Kleinigkeit, und schließe mit (x) bleibt das WB offen. Prima.
Stoße ich aber gleich nochmal den Schließvorgang über (X) an kommt die Office-Eigene Msg-Box (Sollen Ihre Änderungen... Speichern/Nicht Speichern/Abbrechen). Also normales Office Verhalten, so als gäbe es meinen VB-Code nicht.
Irgendwie wird beim 2. Mal das Workbook_BeforeClose-Ereignis ignoriert.

Öffne ich eine 2. Arbeitsmappe (jungfräulich und so lasse ich es auch, ohne speichern...) und mache in der 1. Arbeitsmappe genau das selbe wie zuvor -schließen (x), dann bleibt mit jedem (x) die 1. Mappe geöffnet, so wie ich es eigentlich geplant habe.

??? ääähhhh

Ein ThisWorkbook.Saved = true alternativ ActiveWorkbook.Saved = True bringt auch nichs. Denn da ergibt sich ein anderes lustiges Phänomen, das funktioniert nämlich nur zuverlässig, wenn ausschließlich ein einziges Workbook geöffnet ist.

Ich habe jetzt sämtliche Varianten durch (2. Boolean-Variable, Modul, Funktion....) und immer das Gleiche irgendwann brauche ich/komme ich auf Cancel = true und dann geht es mit einem geöffneten Workbook nicht. Siehe oben.
Ist ein 2. WB offen funktioniert jede meiner Codevarianten wie geplant.

??? Ich weiß nicht weiter. Ich hoffe Ihr schon.

LG
madame_schischi

  

Betrifft: AW: Workbook_BeforeClose + Cancel = True von: Nepumuk
Geschrieben am: 26.09.2019 18:52:47

Hallo,

einfach so:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Cancel = True
End Sub

Verhindert zuverlässig dass die Mappe geschlossen wird.

Gruß
Nepumuk


  

Betrifft: AW: Workbook_BeforeClose + Cancel = True von: madame_schischi
Geschrieben am: 27.09.2019 10:09:42

Hallo Nepumuk,
Danke für deine schnelle Antwort.

Ohne Enable Events hatte ich auch schon getestet. Ich wollte durch den Zusatz vermeiden, dass der Vorschlag, es mit EnableEvents zu versuchen kommt.
Aber glaube mir einfach. Ob mit oder ohne EnableEvents bringt Cancel = True bei mir folgendes:
Öffne ich das WB und schließe es über (x), wird beim 1. Versuch abgebrochen, beim 2. Versuch wird der Code ignoriert und das WB geschlossen.
Bei Änderungen analog (1.Schließversuch: Code greift, 2. Versuch: Code wird ignoriert); nur, dass hier der normale Systemdialog aufgerufen wird.
Öffne ich zusätzlich zu dem WB, das ausschließlich die drei Zeilen Code / fünf Zeilen mit EnableEvents enthält ein neues oder beliebiges anderes WB funktioniert der Abbruch zuverlässig und das WB bleibt geöffnet.
Habe es wirklich umfassend getestet. Offline, im Firmennetz, Rechner neu gestartet, Rechner vom Kollegen….
Das Problem habe scheinbar nicht nur ich, sondern andere Nutzer beschreiben in verschiedenen Foren das Problem, das Cancel = true nicht greift, in verschiedenen Zusammenhängen und ich habe wirklich die meisten Lösungen, die mir für mein Problem vielversprechend erschienen, nachgebaut, und tatsächlich zum Laufen gebracht.
Bei der Umsetzung hatte ich immer noch eine zweite Mappe zum Testen von Codeabschnitten offen. Weswegen ich im Laufe des Tages auch immer dachte. Ok, jetzt habe ich es geschafft. Das war der Freu-Moment.
In Vorbereitung um weitere Lösungen in meine Arbeitsmappe einzubauen, habe ich meine Arbeitsmappe abgespeichert und mit neuem Namen geöffnet, Testmappe zu.
Alles nochmal schnell durchtesten um sicherzugehen. Das waren die Heul-Momente, weil dann war ja nur eine, nämlich meine Arbeitsmappe geöffnet und der Code hat nicht mehr funktioniert.
Ich war wieder ratlos und habe erneut im www gewühlt.

Dann hatte ich zufällig eine Testmappe mit dem absolut reduzierten Code (wb before close, cancel=true, end) offen, weil ich dachte „Fangen wir nochmal ganz von vorne an“ und meine Arbeitsmappe mit dem „Big-Code“ und siehe da, beide Mappen tun exakt was sie sollen.
Die Testmappe macht nicht viel, denn es sind ja nur die drei Zeilen mit einem "Befehl". Deshalb bleibt die Testmappe einfach offen und bringt keine Systemabfrage bei Änderungen. Es läuft wie geschnitten Brot.
Ich mache meine Arbeitsmappe zu und die Testmappe mit dem Dreizeiler macht plötzlich nicht mehr was Sie soll, denn Sie schließt beim 2. (x).
Dann habe ich mit dieser Testmappe in verschiedensten Konstellationen getestet, Dinge ergänzt und wieder verworfen. Aber es bleibt in meinem Fall bei allen Lösungen dabei:
Ein WB offen: 1. Versuch zu schließen: Top; 2. Versuch: Flop
2. WB öffnen: alle Schließversuche im 1. WB Top, weil nichts passiert, so wie es gemäß Code sein sollte.
Meine (aus dem Netz) Lösungsansätze waren bisher:
A:
“Alle Varianten mit/ohne EnableEvents, DisplayAlert,
ThisWB/ActiveWB
Cancel vor/nach/mittendrin in den anderen Codeabschnitten“
B:
2. Booleankonstante mit korrespondierender Sub, in verschiedensten Varianten, wie z.B.
Standardmodul:
P u b l i c bCancel as Boolean
S u b XY()
bcancel = true
Mach Irgendwas + Msg-Box, um zu prüfen, ob der Code hier überhaupt ankommt
E n d S u b
Diese Arbeitsmappe:
S u b Workbook_BeforeClose ()
If bcancel then Cancel = true
Call XY
E n d S u b
C:
Abfragen, ob das WB wirklich geschlossen wurde; über eine S u b/Function wahlweise in einem Modul/Diese Arbeitsmappe, mit Hilfe/ohne S u b Workbook_Deactivate ()“

Aber bei allen Varianten braucht man irgendwann Cancel=True und das funktioniert nicht. grrrrrh

Hat jemand noch eine Idee?

Wenn keiner was weiß, werde ich einfach mit dem Open-Event ein weiteres WB öffnen, damit Cancel=true greift. Das ist zwar (würg) unschön, aber dann läuft es wenigstens.
Ich bekomm bald Excel 2019. Die Meisten bei uns im Unternehmen haben es schon; ich wollte es wg. der Abwärtskompatibilität bisher nicht haben. Vielleicht wird, gemäß IT, dann alles besser ;-)
Schöne Grüße


  

Betrifft: Und sicher hast du auch sichergestellt, dass keine von: EtoPHG
Geschrieben am: 27.09.2019 10:35:31

anderen geladenen Add-Ins deine Test-Szenarios durchkreuzen, Madame

Hat z.B. eines davon ein unsauberes Error-Handling (ohne z.B. Events wieder einzuschalten) kann das zu deinen beschriebenen Effekten führen. Ich konnte jedenfalls unter XL2016 dieses Verhalten (2ter Close bricht nicht ab) nicht reproduzieren.

Gruess Hansueli


  

Betrifft: AW: Und sicher hast du auch sichergestellt, dass keine von: madame_schischi
Geschrieben am: 27.09.2019 11:01:07

Hallo EtoPHG,

keine Excel-/Com-Add-INS "angehakt", keine Deaktivierten Add-Ins. Das hatte ich schon mal gescheckt und es gleich nochmal überprüft. Unsere IT batcht andauernd.

Bei XML-Erweiterungspaketen MS Actions Pane 3, bei Aktionen ist Autokorrektur Datum aktiviert, aber das dürfte ja beides nicht stören.

Vielleicht lass ich mir doch Excel 2019 installieren und probiere mal was dabei rauskommt. Alle Nutzer, die das Dokument, das ich gerade baue nutzen müssten schon 2019 haben. Da frag ich am Montag mal unsere IT. Heute habe ich Home-Office :-)

Vielen Dank für Eure Antworten, aber dann scheint es ein individuelles Rechner-/Umgebungsproblem zu sein? Was meint Ihr?

Inzwischen konzentriere ich mich auf die weiteren Lösungen, die ich noch einbauen muss und hoffe, dass nicht weitere Ü-Eier aufpoppen, die mich Unmengen Zeit und Nerven kosten.

Viele Grüße

madame_schischi