🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Workbook_BeforeSave in Excel — ein Speichern prüfen oder blockieren, und was SaveAsUI Ihnen wirklich verrät

|

VBA Workbook_BeforeSave in Excel — ein Speichern prüfen oder blockieren, und was SaveAsUI Ihnen wirklich verrät

TL;DRWorkbook_BeforeSave ist ein Ereignis, das Excel in dem Moment auslöst, in dem ein Speichern angefordert wird — Ctrl+S, die Schaltfläche Speichern oder das .Save eines Makros — bevor es auf die Festplatte schreibt. Es reicht Ihnen zwei Argumente: SaveAsUI (steht das Dialogfeld Speichern unter kurz bevor?) und Cancel (auf True gesetzt, blockiert es das Speichern). Es ist also ein Qualitätstor für die Speicheraktion: Prüfen Sie die Arbeitsmappe und lassen Sie das Schreiben entweder durch oder verweigern Sie es. Das eine, was jeden erwischt — ruft Ihr Handler ThisWorkbook.Save auf, löst dieses Speichern BeforeSave erneut aus und schleift endlos, sofern Sie es nicht mit Application.EnableEvents absichern.

' Liegt in ThisWorkbook — NICHT in einem Module.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If ThisWorkbook.Sheets("Invoice").Range("Total").Value = "" Then
        MsgBox "Enter a Total before saving.", vbExclamation
        Cancel = True                         ' <-- das Speichern blockieren; nichts wird geschrieben
        Exit Sub
    End If
    ThisWorkbook.Sheets("Invoice").Range("LastSaved").Value = Now   ' stempeln — hier kein .Save-Aufruf
End Sub

Speichern fühlt sich wie das Sicherste an, was ein Benutzer tun kann, und genau deshalb ist es der richtige Ort, um Regeln durchzusetzen. Workbook_BeforeSave ist das Ereignis hinter „du kannst nicht mit einem leeren Pflichtfeld speichern“, automatisch gestempelten „zuletzt geändert“-Zellen, erzwungenen Dateinamen und Prüfprotokollen zum Speicherzeitpunkt. Es ist zugleich der Ort, an dem zwei subtile Fallen lauern: ein Speichern, das stillschweigend nichts tut, und ein Handler, der sich selbst in eine Endlosschleife speichert.

Was Sie lernen

  • Das mentale Modell — ein Tor vor dem Speichern, mit einem Cancel-Veto und einem SaveAsUI-Signal
  • Was SaveAsUI wirklich bedeutet und wie Sie damit einen Dateinamen oder Ordner erzwingen
  • Das Auto-Stempel-Muster — „wer und wann“ in die Datei schreiben, die gerade gespeichert wird
  • Die Rekursionsfalle — warum .Save innerhalb von BeforeSave schleift, und die EnableEvents-Lösung
  • Warum ein stilles Cancel = True ein Bug ist, kein Feature

Das mentale Modell: ein Tor vor dem Speichern, keine Quittung

Workbook_BeforeSave feuert, wenn ein Speichern angefordert wird, und läuft bevor Excel die Datei schreibt. Sie rufen es nicht auf — Excel ruft Sie auf, wartet und entscheidet dann anhand dessen, was Sie getan haben, wie es weitergeht. Es übergibt zwei Argumente per Referenz:

  • SaveAsUI As BooleanTrue, wenn Excel gleich das Dialogfeld Speichern unter anzeigt (der Benutzer hat „Speichern unter“ gewählt, oder es ist eine brandneue, noch ungespeicherte Datei), False bei einem einfachen Speichern über die bestehende Datei. Es ist Information: Welche Art von Speichern ist das?
  • Cancel As Boolean — Ihr Veto. Setzen Sie Cancel = True, und Excel bricht das Speichern ab; nichts wird geschrieben.

Der Handler ist also ein Tor, keine Quittung. Eine Quittung würde bestätigen, dass ein Speichern bereits stattgefunden hat; dieses läuft zuerst und darf „nein“ sagen. (Wollen Sie die Quittung — wissen, dass ein Speichern gelungen ist —, ist das das separate Ereignis Workbook_AfterSave, das danach mit einem Success-Flag feuert.)

Die Signatur ist fest und liegt, wie jedes Workbook-Ereignis, in ThisWorkbook: Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean). In einem gewöhnlichen Module feuert es nie.

Die Regel, die es nützlich macht: Cancel blockiert, SaveAsUI entscheidet wie

Die beiden Argumente erledigen zwei verschiedene Aufgaben, und sie zu verwechseln ist der Punkt, an dem man ins Stocken gerät.

Verwenden Sie Cancel, um eine Vorbedingung durchzusetzen — das Speichern verweigern, bis die Daten gültig sind:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If Sheets("Order").Range("CustomerID").Value = "" Then
        MsgBox "Can't save: Customer ID is required.", vbExclamation
        Cancel = True            ' das Speichern endet hier
    End If
End Sub

Verwenden Sie SaveAsUI, um zu steuern, wie die Datei gespeichert wird — meist um zu verhindern, dass Benutzer Kopien mit beliebigen Namen verstreuen, oder um eine Namenskonvention zu erzwingen:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If SaveAsUI Then
        MsgBox "Use File > Save only. This file must keep its name.", vbCritical
        Cancel = True            ' Speichern unter blockieren, einfaches Speichern erlauben
    End If
End Sub

Dieser Handler lässt ein normales Ctrl+S durch, verweigert aber „Speichern unter“ — eine kleine Richtlinie, die unmöglich ist, ohne zu wissen, welches Speichern gerade läuft. Die Regel: SaveAsUI verrät Ihnen die Absicht, Cancel entscheidet das Ergebnis.

Das merkenswerte Muster: die Datei stempeln, bevor sie geschrieben wird

Das mit Abstand Nützlichste, was BeforeSave tut, ist, im letztmöglichen Moment Metadaten in die Datei zu schreiben, sodass die gespeicherte Kopie sie trägt. Weil Ihr Code vor dem Schreiben auf die Festplatte läuft, wird alles, was Sie ändern, vom gleich stattfindenden Speichern erfasst:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    With Sheets("Log")
        .Range("LastSavedBy").Value = Environ("Username")
        .Range("LastSavedAt").Value = Now
    End With
    ' Hier kein .Save — das Speichern, das dieses Ereignis ausgelöst hat, wird die Stempel enthalten.
End Sub

Beachten Sie, was fehlt: Es gibt keinen ThisWorkbook.Save-Aufruf. Sie brauchen keinen — das Speichern findet bereits statt; Sie bearbeiten die Arbeitsmappe nur einen Moment, bevor sie auf der Festplatte landet. Ein .Save hier hinzuzufügen ist nicht nur überflüssig, es ist der Auftakt zur nächsten Falle.

Die Falle, die Excel einfrieren lässt: Save innerhalb von BeforeSave aufrufen

Ruft Ihr Handler ThisWorkbook.Save auf (ein naheliegender Reflex — „stemple es, dann speichere es“), löst dieses Speichern Workbook_BeforeSave erneut aus, was wieder speichert, was es wieder auslöst — dieselbe Endlosschleifen-Gestalt wie bei Worksheet_Change, das in eine Zelle schreibt. Das Ereignis hat keinen eingebauten Schutz davor, auf seine eigene Aktion zu reagieren.

Wenn Sie ein Speichern wirklich aus einem Speicher-Handler heraus auslösen müssen — oder aus einem beliebigen Ereignis, das anschließend schreibt —, schalten Sie Ereignisse rundherum ab und stellen Sie sie stets in einem Fehlerhandler wieder her, damit ein Absturz sie nicht abgeschaltet zurücklassen kann:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    On Error GoTo CleanExit
    Application.EnableEvents = False        ' unsere eigenen Aktionen lösen dieses Ereignis nicht erneut aus
    ' ... Arbeit, die selbst speichern oder schreiben könnte ...
CleanExit:
    Application.EnableEvents = True         ' läuft, ob wir erfolgreich waren oder einen Fehler hatten
End Sub

Application.EnableEvents ist ein einziger, anwendungsweiter Schalter, den Excel nicht für Sie zurücksetzt. Setzt ein Handler ihn auf False und läuft in einen Fehler, bevor er ihn wiederherstellt, verstummt jedes Ereignis in Excel, bis Sie neu starten oder Application.EnableEvents = True im Direktfenster ausführen — derselbe Fehlermodus, der in VBA On Error beschrieben ist.

Die Regel, die man vergisst: nicht stillschweigend abbrechen

Ein Cancel = True ohne Erklärung ist ein echter Bug. Der Benutzer drückt Ctrl+S, sieht nichts und geht in dem Glauben davon, die Datei sei gespeichert — doch BeforeSave hat es klammheimlich blockiert, und Workbook.Saved ist weiterhin False. Stunden an Arbeit können beim nächsten Absturz verpuffen. Wann immer Sie Cancel = True setzen, sagen Sie dem Benutzer, warum — mit einem MsgBox, damit ein blockiertes Speichern eine sichtbare Entscheidung ist, keine stille. Ein Tor, das der Benutzer nicht sehen kann, ist eine Falle.

BeforeSave bewacht das Speichern; sein Geschwister Workbook_BeforeClose bewacht das Schließen mit derselben Art Cancel-Veto, und beide gehören zur Workbook-Ereignisfamilie neben Workbook_Open.

Wie ExcelMaster hilft

Ein Speicher-Tor hat viele kleine Details, die entweder stimmen oder brechen: der Handler in ThisWorkbook, Cancel zur Prüfung, aber nicht stillschweigend eingesetzt, SaveAsUI richtig herum gelesen, der Stempel ohne .Save-Aufruf geschrieben und ein EnableEvents-Schutz, falls doch etwas speichert.

ExcelMaster lässt Sie stattdessen die Regel benennen. Sagen Sie „lass diese Datei nicht speichern, wenn die Zelle Total leer ist, und stemple, wer wann gespeichert hat“, und es schreibt ein Workbook_BeforeSave, das das Speichern mit einer klaren Meldung blockiert, das Log-Blatt vor dem Schreiben stempelt und die Selbstauslöse-Schleife absichert. Die Arbeitsmappe und der Code bleiben Ihnen; Sie überspringen das Einfrieren, das Sie sonst verursachen, während Sie sich die Regel selbst beibringen.

Häufig gestellte Fragen

Wie verhindere ich in VBA, dass eine Arbeitsmappe gespeichert wird?

Setzen Sie das Argument Cancel innerhalb von Workbook_BeforeSave auf True: Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)Cancel = True. Excel prüft Cancel, nachdem Ihr Handler gelaufen ist; True bricht das Speichern ab und schreibt nichts. Zeigen Sie stets eine Meldung, die erklärt, warum — damit die Blockade nicht stillschweigend geschieht.

Was bedeutet der Parameter SaveAsUI?

SaveAsUI ist True, wenn Excel gleich das Dialogfeld Speichern unter anzeigt — weil der Benutzer „Speichern unter“ gewählt hat oder die Datei noch nie gespeichert wurde — und False bei einem einfachen Speichern über die bestehende Datei. Lesen Sie es, um die beiden Fälle unterschiedlich zu behandeln, etwa um Ctrl+S zu erlauben, aber „Speichern unter“ zu blockieren, damit die Datei ihren Namen behält.

Warum verursacht mein BeforeSave-Makro eine Endlosschleife?

Weil es ThisWorkbook.Save (oder ein anderes Speichern) aufruft, und dieses Speichern Workbook_BeforeSave erneut auslöst — endlos. Meist brauchen Sie gar kein .Save — Bearbeitungen, die Sie im Handler vornehmen, werden vom bereits laufenden Speichern erfasst. Müssen Sie wirklich speichern, umschließen Sie es mit Application.EnableEvents = False … = True und stellen Sie Ereignisse in einem Fehlerhandler wieder her.

Wie füge ich automatisch einen Zeitstempel „zuletzt gespeichert“ hinzu?

Schreiben Sie in Workbook_BeforeSave den Wert ohne Save-Aufruf in eine Zelle: Sheets("Log").Range("LastSavedAt").Value = Now. Weil der Handler läuft, bevor Excel auf die Festplatte schreibt, enthält das Speichern, das das Ereignis ausgelöst hat, Ihren Stempel. Ergänzen Sie Environ("Username") für die Angabe, wer gespeichert hat.

Wohin gehört Workbook_BeforeSave-Code?

In das Codemodul von ThisWorkbook — doppelklicken Sie im Projekt-Explorer unter „Microsoft Excel Objekte“ auf ThisWorkbook und fügen Sie Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) ein. Aus einem gewöhnlichen Module feuert es nicht, und Makros müssen aktiviert sein.

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 05.08.2026.

Verwandte Anleitungen: VBA Workbook_BeforeClose · VBA Worksheet_Activate & Deactivate · VBA Workbook_Open · VBA Worksheet_Change · VBA On Error