TL;DR —
Workbook_BeforeSaveist ein Ereignis, das Excel in dem Moment auslöst, in dem ein Speichern angefordert wird — Ctrl+S, die Schaltfläche Speichern oder das.Saveeines Makros — bevor es auf die Festplatte schreibt. Es reicht Ihnen zwei Argumente:SaveAsUI(steht das Dialogfeld Speichern unter kurz bevor?) undCancel(aufTruegesetzt, 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 HandlerThisWorkbook.Saveauf, löst dieses SpeichernBeforeSaveerneut aus und schleift endlos, sofern Sie es nicht mitApplication.EnableEventsabsichern.
' 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 einemSaveAsUI-Signal - Was
SaveAsUIwirklich 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
.Saveinnerhalb vonBeforeSaveschleift, und dieEnableEvents-Lösung - Warum ein stilles
Cancel = Trueein 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 Boolean—True, wenn Excel gleich das Dialogfeld Speichern unter anzeigt (der Benutzer hat „Speichern unter“ gewählt, oder es ist eine brandneue, noch ungespeicherte Datei),Falsebei einem einfachen Speichern über die bestehende Datei. Es ist Information: Welche Art von Speichern ist das?Cancel As Boolean— Ihr Veto. Setzen SieCancel = 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
