Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

EnableEvents crash

Betrifft: EnableEvents crash von: Heike
Geschrieben am: 07.10.2020 11:02:07

Hallo,

ich habe ein Makro geschrieben, dass Änderungen in diversen Sheets eines Workbooks in ein spezielles Sheet schreibt (zur Dokumentation) und bei diversen Events greift (Open, Sheet-Change, Print)

Nun habe ich das Problem, dass ab und zu dieses Change-Trail-Makro aufhört zu arbeiten. D.h. das manche Änderungen im Sheet nicht dokumentiert werden.

Da ich mit den üblichen Verdächtigen (Shift-Taste beim Öffnen gedrückt, manuelles Ausschalten o.ä.) nun durch bin habe ich den Verdacht, dass das EnableEvents = False, das ich bei workbook_open und beim wokbook_sheetchange am Anfang der Sub einsetze durch einen mir unbekannten Fehler nicht mehr zum EnableEvents = True am Ende der Sub kommt.

zugegeben nutze ich hauptsächlich on error resume next
Wie baue ich ein vernünftiges Errorhandling um sicherzustellen, dass das EnableEvents = True IMMER wieder eingeschaltet wird?

Ich habe irgendwie ein Brett vorm Kopf, Sorry.

Betrifft: AW: EnableEvents crash
von: Yal
Geschrieben am: 07.10.2020 11:32:31

Hallo Heike,

ich persönlich bin Fan vom Try-Catch-Finally Muster:
Public Sub Fehlertolerant()
On Error GoTo Catch
Try:
    '...
    GoTo Finally
Catch:
    '...
Finally:
    '...
End Sub
Nicht probiert ist, ob ein "Resume Next" in dem Catch-Block funktioniert. Notfalls alle kritische Aktionen in klein-klein zerteilen.

Viel Erfolg
Yal

Betrifft: AW: EnableEvents crash
von: onur
Geschrieben am: 07.10.2020 17:22:55

Es muss andere Gründe haben, denn wie soll denn die Zeile
Application.EnableEvents=True

einen Fehler verursachen können ?
Vielleicht springt ja dein Code dank "Exit For" oder "Exit Sub" irgendwo vorher raus.
Aber da du das Makro ja nicht gepostet hast, .....

Betrifft: AW: EnableEvents crash
von: Heike
Geschrieben am: 07.10.2020 20:24:41

Hallo Onur,

in meinem Code befindet sich kein einziges exit for oder exit sub, daran kann es nicht liegen.

Ich habe durch stundenlanges Googeln nach einer Möglichkeit gesucht, woran es liegen kann, dass Makros plötzlich aufhören zu "arbeiten" (nicht nur ein bestimmtes Makro, sondern alle!).
Und das Ergebnis war, dass es passieren kann, dass falls nach einem EnableEvents = FALSE ein Fehler passiert, das EnableEvents = TRUE nicht mehr ausgeführt wird und dadurch alle Makros ausgeschaltet sind.
Ich merke das z.B. daran, dass das ActiveWorkbook.Close SaveChanges:=True im Workbook_BeforeClose nicht mehr feuert wenn ich Excel schließe.

Da es ein sehr langes und individuelles Makro für einen Kunden ist kann ich es nicht posten. Aber vielleicht kann ich morgen Teile extrahieren.

Betrifft: AW: EnableEvents crash
von: onur
Geschrieben am: 07.10.2020 20:53:12

Hallo Heike,

"Ich merke das z.B. daran, dass das ActiveWorkbook.Close SaveChanges:=True im Workbook_BeforeClose nicht mehr feuert wenn ich Excel schließe." - klar, wenn die Events ausgeschaltet sind.
Mehr geht nur nach Posten des Makros/einer Datei mit dem selben Problem.

Grus
Onur

Betrifft: Das wäre eigentlich ein AnfängerFehler, ...
von: Luc:?
Geschrieben am: 08.10.2020 00:40:12

…Heike; ;-]
besser ist es bei SubProzeduren allemal, mit On Error GoTo fmarke zu arbeiten und dort eine ordentliche Fehlerbehandlung mit MsgBox für Err.Number und Err.Description einzurichten. Bestimmte Fehler könnte man darin, bei Vorliegen definierter Bedingungen, noch spezifizieren. Dann kann man auch bei besonderen Bedingungen mit Err.Raise fnummer spezifische (eigene) Fehler auslösen.
Das Zurücksetzen wichtiger, anfänglich vorgenommener Xl-Einstellungsänderungen hat dann stets nach der FehlerBehandlung zu erfolgen, damit auch gewährleistet ist, dass diese Befehle stets abgearbeitet wdn. Im NormalFall kann die F-Behandlung mit einem weiteren SprungBefehl zu dieser EndBehandlung umgangen wdn. Man kann die eigentl F-Behdl aber auch in ein If-Konstrukt einbinden: If CBool(Err.Number) Then usw
Eine eigene F-Bhdl hat außerdem den Vorteil, dass man hier beim Testen einen Stop-Befehl oder HaltePkt setzen kann, nach dem ein Resume folgen sollte, was veranlasst, dass das Pgm bei Abarbeitung an die Stelle (PgmZeile) des FehlerAuftritts zurückkehrt, so dass der leicht gefunden wdn kann.
Übrigens, ganz ohne anfängliches On Error ~ kann man Fehler auch in alle von einer SubProz aufgerufenen weiteren SubProx verschleppen…!
Morhn, Luc :-?
„Die universelle Befähigung zur Unfähigkeit macht jede menschliche Leistung zu einem unglaublichen Wunder.“ Stapps ironisches Paradoxon

Betrifft: AW: EnableEvents crash
von: Heike
Geschrieben am: 08.10.2020 06:30:33

Da ich das Problem bei mir nicht reproduzieren kann (er tritt auf meinem System niemals auf) habe ich jetzt die Fehlerbehandlung umgebaut und warte auf Rückmeldung vom Kunden.

Danke euch trotzdem.

Betrifft: AW: EnableEvents crash
von: Daniel
Geschrieben am: 08.10.2020 10:47:02

das Problem ist, das bei einer Standard-Fehlerbehandlung (dh ohne aufwendige Dokumentation und Logging) Informationen, die für das Auffinden der Ursache, verloren gehen.
Wenn es deinem Kunden zumutbar ist, wäre es das einfachste, wenn du deinem Kunden eine Version ohne Fehlerbehandlung schickst und er sich beim Auftreten eines Fehlers bei dir meldet, so dass ihr dann gemeinsam an seinem Rechner auf Ursachenforschung gehen könnt (welche Zeile hat den Fehler, welche Werte haben verwendete Variablen und Zellen, wie sind seine Einstellungen usw).
Dank moderner Technik ist sowas heute ja auch Online über größere Distanz möglich.
Gruß Daniel

Betrifft: AW: EnableEvents crash
von: Daniel
Geschrieben am: 07.10.2020 18:12:48

Hi
wenn du konsequentes OnErrorResumeNext hast, dann müsste ein EnableEvents=True am Ende jedes Events-Makros ausreichen.

das sinnvollste ErrorHandling ist immer kein ErrorHandling, sondern jede bekannte Fehlermöglichkeit vorher abzufragen so das kein Fehler entsteht.

je nachdem wie komplex deine Makros sind, kann es auch helfen, die Events nicht pauschal am Anfang und Ende des Makros ein- und auszuschalten, sondern gezielt nur diejenigen Aktionen darin zu "kapseln", für die es notwendig ist.
Dann wäre ein Fehler, der außerhalb so einer "Kapsel" passiert, unkritisch.

zur not baut man sich einen Rettungsbutton, dh man schreibt ein Makro mit dem Befehl die Events wieder zu aktivieren und weist dieses Marko einem Formularfeldsteuerelement-Button zu.
da dies keine ActiveX-Elemente sind und keine Events haben, funktioniert so ein Button auch bei ausgeschalteten Events.
du könntest also anweisen, nach einem Fehlerabbruch oder im Zweifel wenn was nicht richtig funktionert, da einmal draufzuklicken.

Gruß Daniel

Betrifft: AW: EnableEvents crash
von: onur
Geschrieben am: 07.10.2020 18:22:43

Hi Daniel,

In einem Punkt vertust du dich - Egal ob Formularsteuerelement-Button oder ActiveX-Button, beide bleiben von "Application.EnableEvents= False" unbeeindruckt.

GrussOnur

Betrifft: AW: EnableEvents crash
von: Daniel
Geschrieben am: 07.10.2020 18:36:10

na um so besser.
dann kann man beides nutzen.
hatte ich jetzt anders abgespeichert, weil das Click des ActiveX im Prinzip auch ein Event im selben Modul wie anderen Events ist.
Vielleicht hab ich auch mit dem Entwurfmodus verwechselt (der ja eine ähnliche Wirkung wie das EnableEvents hat) und auch die ActiveX-Steuerelemente "lahm legt", während die Formularformsteuerelemente weiter laufen.

Gruß Daniel