Clever-Excel-Forum

Normale Version: Eine Sub Workbook_BeforeClose abbrechen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo Freunde,

ich habe hier ein Formular, welches in der Workbook_BeforeClose Sub nachfragt, ob es schon gespeichert worden ist oder ob es ungespeichert geleert und geschlossen werden soll.

Dazu müsste die BeforeClose Sub abgebrochen werden können, ohne dass die Datei geschlossen wird. Folgenden Code dazu habe ich bis jetzt:

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If ThisWorkbook.Name = MyName Then
        Warnung.Show
        If Flag = False Then GoTo weiter
        Cancel = False
        Exit Sub
    End If
weiter:
    With Sheets("Rechnung")
        .Range("Address").ClearContents
        .Range("Ansprache").ClearContents
        .Range("Textteil").ClearContents
        .Range("Beträge").ClearContents
    End With
    Application.DisplayAlerts = False
    ThisWorkbook.SaveAs Filename:=MyPfad & "\" & MyName
End Sub

Leider wird die Sub damit nicht abgebrochen, sondern das Schließen beendet.

Gehe ich mit F8 schrittweise vor, erhalte ich folgende Excel-Abfrage:
"Änderungen speichern? Ja - Nein -Abbrechen" • wähle ich "Abbrechen" wird die BeforeClose Sub unterbrochen und das Formular bleibt stehen.

Wie muss bzw. kann ich dieses Verhalten in meinen vorstehenden Code einfügen?
Hallo Günter,

eventuell reicht Cancel = True ?
Moin!
Ergänzend zu Andrés Hinweis drei Fragen:
  1. Warum soll die Systemmeldung durch ein UserForm "Warnung" ersetzt werden?
  2. If ThisWorkbook.Name = MyName? ThisWorkbook in einer (zusätzlichen) Variablen?
  3. Warum dieser Spaghetticode?
Gruß Ralf
@RPP

Vielleicht übersetzt Attilla 'Spaghetti' in "Nudel' ;)
Hallo,

erst einmal vielen Dank an André, so einfach war die Lösung!

Nun zu den Fragen von Ralf:
Zu 1. Die Nachfrage des Systems ist mir nicht deutlich genug und läßt keine weiteren Fragen und Entscheidungen zu dem Vorgang zu!
Zu 2. In MyName wird beim Workbook_open der Name ausgelesen und beim Schließen geprüft, ob der noch übereinstimmt, da damit der Nachweis des noch nicht Speichern erbracht wird. Die Vorlage kann nicht als Excel-Vorlage gespeichert werden, sondern als normale Datei und deshalb wird alles danach gelöscht und unter dem Namen der Öffnung (also MyName) leer wieder gespeichert, weil inzwischen einige Parameter für einen erneuten Aufruf geändert worden sind, die sonst verloren gehen.
Zu 3. Ich sehe keinen Spagetthicode - was soll das übrigens sein?

Wenn ich ein Projekt realisiere versuche ich das immer idiotensicher zu machen und setze keine Excelkenntnisse voraus - damit bin ich bisher immer seht gut angekommen und alle haben das begrüßt.
Zitat:Zu 1. Die Nachfrage des Systems ist mir nicht deutlich genug und läßt keine weiteren Fragen und Entscheidungen zu dem Vorgang zu!
Das sollte man schon bevor das schliessen der Datei erledigt haben.

Jedes redundantes Bemühen des Users sollte man ausschliessen.
Hi Günter,

(27.02.2017, 00:03)Glausius schrieb: [ -> ]Zu 3. Ich sehe keinen Spagetthicode - was soll das übrigens sein?

Spaghetticode ist ein Code der Gotos verwendet.

Dein Code könnte auch so als Nicht-Spaghetti geschrieben werden (ich hoffe, das "Cancel = True" ist an der richtigen Stelle):
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  If ThisWorkbook.Name = MyName Then
     Warnung.Show
     
     If Flag = False Then
        With Sheets("Rechnung")
           .Range("Address").ClearContents
           .Range("Ansprache").ClearContents
           .Range("Textteil").ClearContents
           .Range("Beträge").ClearContents
        End With
        Application.DisplayAlerts = False
        ThisWorkbook.SaveAs Filename:=MyPfad & "\" & MyName
     Else
        Cancel = True
        Exit Sub
     End If
  End If
End Sub
Hallo Ralf,

danke für den "entspaghettisierten" Code, er läuft genau, wie er soll!

@snb


Mit solchen Hinweisen sollte man ohne das Projekt überhaupt zu kennen, m.E. sehr vorsichtig sein - Fettnäpfchen stehen überall!
Da irrst du dich: diese Hinweisen gelten für alle Projekte, eben deine.
Dazu braucht man sie nicht zu kennen.