TL;DR —
Workbook_BeforePrintist ein Ereignis, das Excel auslöst, bevor irgendetwas in der Arbeitsmappe gedruckt wird. Es reicht Ihnen ein einziges Argument,Cancel. Setzen SieCancel = True, und der Druck wird abgeblasen — so können Sie zuerst prüfen (einen Druck mit leeren Pflichtfeldern blockieren), das Druckdatum stempeln oder protokollieren, wer gedruckt hat. Zwei Dinge überraschen jeden: Es feuert auch für die Druckvorschau — nicht nur für einen echten Druck —, sodass jede aufwendige Arbeit hier jedes Mal läuft, wenn jemand eine Vorschau ansieht; und es feuert einmal für die gesamte Arbeitsmappe, nicht einmal je Blatt. Der Code liegt inThisWorkbook.
' Liegt in ThisWorkbook - NICHT in einem Module, NICHT in einem Blatt.
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If ThisWorkbook.Sheets("Invoice").Range("Total").Value = "" Then
MsgBox "Enter a Total before printing this invoice.", vbExclamation
Cancel = True ' <-- den Druck blockieren; nichts geht an den Drucker
End If
End Sub
Die meisten Makros laufen, wenn ein Benutzer danach verlangt — eine Schaltfläche, ein
Tastenkürzel. Workbook_BeforePrint läuft, wenn ein Benutzer zu drucken versucht, und es
läuft bevor der Auftrag den Drucker erreicht. Genau dieser Zeitpunkt ist es, den Sie
für Prüfungen und Stempel in letzter Sekunde wollen: bestätigen, dass das Blatt druckfertig
ist, das heutige Datum in eine Kopfzeile schreiben, festhalten, wer wann gedruckt hat —
oder den Druck ganz stoppen. Es ist zugleich ein Ereignis mit zwei Verhaltensweisen, die
die Leute überraschen, und beide ändern, wie Sie den Handler schreiben sollten.
Was Sie lernen
- Das mentale Modell — ein Kontrollpunkt auf dem Druck, mit einem
Cancel, mit dem Sie ein Veto einlegen können - Die wichtigste Regel —
Cancel = Trueblockiert den Druck, und eine stille Blockade ist ein Bug - Die Druckvorschau-Falle — das Ereignis feuert auch bei der Vorschau, halten Sie es also leichtgewichtig
- Warum es einmal für die gesamte Arbeitsmappe läuft, nicht je Blatt — und was das für Kopfzeilen bedeutet
- Wo der Code liegen muss und wie er sich von den Gesten-Ereignissen unterscheidet
Das mentale Modell: ein Kontrollpunkt auf dem Druck, keine Druck-Schaltfläche
Workbook_BeforePrint feuert in dem Moment, in dem ein Druck angefordert wird — Datei ▸
Drucken, Ctrl+P, ein Makro, das .PrintOut aufruft, oder das Öffnen der Druckansicht —
und es feuert bevor Excel irgendetwas an den Drucker sendet. Es übergibt einen
einzelnen Boolean per Referenz, Cancel. Sie rufen dieses Sub nie auf; Excel ruft Sie
auf, wartet und sieht dann nach, worauf Cancel gesetzt ist. Lassen Sie es unangetastet,
läuft der Druck weiter. Setzen Sie Cancel = True, gibt Excel den Druck auf.
Der Handler ist also ein Kontrollpunkt auf dem Weg zum Drucker, keine
Druck-Schaltfläche, die Sie drücken. Das ist dieselbe Form wie bei seinen
Wächter-Ereignis-Verwandten Workbook_BeforeClose und
Workbook_BeforeSave: Jedes reicht Ihnen ein Cancel,
das Sie setzen können, um gegen die Aktion, die Excel vorhat, ein Veto einzulegen. Lesen Sie
BeforePrint als „sag mir Bescheid, wenn jemand druckt“, und Ihnen entgeht das Veto, das es
lohnenswert macht. Und wie bei diesen beiden liegt sein Code im ThisWorkbook-Modul —
doppelklicken Sie im Projekt-Explorer unter „Microsoft Excel Objekte“ auf ThisWorkbook. In
einem gewöhnlichen Module feuert es nie.
Die wichtigste Regel: Cancel = True blockiert ihn — aber sagen Sie, warum
Einen Druck zu blockieren ist der ganze Grund, aus dem viele zu diesem Ereignis greifen —
vor dem Drucken prüfen oder einen Entwurf am Hinausgehen hindern. Der Mechanismus ist eine
Zeile, Cancel = True. Der Fehler besteht darin, es stillschweigend zu tun:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If Sheets("Invoice").Range("Approved").Value <> "Yes" Then Cancel = True ' blockiert ... stillschweigend
End Sub
Der Benutzer drückt Ctrl+P, nichts wird gedruckt, und es gibt keine Erklärung. Er nimmt
an, der Drucker sei kaputt oder Excel sei kaputt, und meldet einen Fehler gegen Sie. Ein
stiller Cancel ist ein Bug, kein Feature. Wenn Sie einen Druck blockieren, sagen Sie dem
Benutzer, warum, damit das Nicht-Ereignis offensichtlich Ihre Entscheidung ist:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If Sheets("Invoice").Range("Approved").Value <> "Yes" Then
MsgBox "This invoice isn't approved yet - printing is blocked.", vbExclamation
Cancel = True
End If
End Sub
Jetzt ist die Blockade lesbar: Der Benutzer weiß genau, was zu beheben ist. Dieselbe Höflichkeit gilt für Workbook_BeforeSave — jedes Veto, das ein Benutzer nicht erwartet hat, braucht einen Satz, der es erklärt.
Die Falle, die die Leistung ruiniert: die Druckvorschau löst es ebenfalls aus
Hier ist das Verhalten, das aus einem hilfreichen Handler einen trägen macht.
Workbook_BeforePrint feuert nicht nur bei einem echten Druck, sondern auch, wenn der
Benutzer die Druckvorschau öffnet (die Druckansicht in der Backstage-Ansicht). Tut Ihr
Handler also etwas Aufwendiges — eine Datenverbindung aktualisieren, eine Webabfrage
ausführen, ein riesiges Modell neu berechnen, ein Blatt neu aufbauen —, läuft diese Arbeit
jedes Mal, wenn jemand eine Vorschau ansieht, und eine Vorschau ist etwas, das die Leute
beiläufig und häufig tun. Das Blatt kriecht, und niemand bringt die Verzögerung mit einem
Druckereignis in Verbindung.
Die Regel: Halten Sie BeforePrint leichtgewichtig. Eine Prüfung, ein Datumsstempel,
eine Protokollzeile — in Ordnung. Aufwendige Aktualisierungen gehören auf eine ausdrückliche
Aktion (eine „Aktualisieren“-Schaltfläche) oder eine geplante Aufgabe, nicht auf ein
Ereignis, das bei jedem Blick auf die Druckvorschau feuert. Müssen Sie wirklich aufwendige
Arbeit nur für einen echten Druck erledigen, gibt es keinen sauberen, allgemeingültigen Weg,
im klassischen Ereignis die Vorschau vom Druck zu unterscheiden — was selbst das stärkste
Argument dafür ist, hier überhaupt keine aufwendige Arbeit unterzubringen.
Die Regel zum Geltungsbereich: es läuft einmal für die gesamte Arbeitsmappe
Workbook_BeforePrint feuert einmal je Druckanforderung für die gesamte Arbeitsmappe —
nicht einmal je Blatt, und es verrät Ihnen nicht, welches Blatt gedruckt wird. Es gibt kein
Worksheet_BeforePrint. Jede Logik nach dem Muster „das vor dem Drucken einrichten“ muss
die Arbeitsmappe als Einheit behandeln. Wollen Sie auf jedem Blatt einen Druckstempel,
durchlaufen Sie die Blätter selbst oder — besser — nutzen Sie eine PageSetup-Kopfzeile,
die Excel für Sie pflegt:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.PageSetup.LeftFooter = "Printed " & Format(Date, "yyyy-mm-dd")
Next ws
End Sub
Bevorzugen Sie PageSetup-Kopf- und -Fußzeilen — &D für das Datum, &P für die
Seitenzahl, &F für den Dateinamen — gegenüber dem Schreiben des Stempels in eine Zelle.
Eine Fußzeile ist nur für den Druck da und räumt sich selbst auf; eine Zelle, die Sie zum
Drucken verändern, muss danach wiederhergestellt werden, und da es kein zuverlässiges
Partnerereignis „AfterPrint“ gibt und die Vorschau diesen Handler ebenfalls auslöst, ist
diese Wiederherstellung heikel richtig hinzubekommen. Überlassen Sie Excel das Papier;
behalten Sie Ihre Zellen für Daten.
Die Unterscheidung, die den Themenblock rahmt: kein Target, nur Arbeitsmappe
Die beiden Gesten-Ereignisse dieser Familie —
Worksheet_BeforeDoubleClick und
Worksheet_BeforeRightClick — arbeiten je Blatt
und reichen Ihnen eine Target-Zelle, weil ein Klick irgendwo Bestimmtes geschieht.
Workbook_BeforePrint ist das Gegenteil: auf Arbeitsmappenebene, kein Target, weil ein
Druck eine Aktion für das ganze Dokument ist, kein Punkt auf einem Blatt. Was alle drei
teilen, ist das Cancel-Flag — das eine Argument, das ein Ereignis aus einer
Benachrichtigung in ein Veto verwandelt. Das ist das Rückgrat der ganzen Abfang-Familie:
Doppelklick, Rechtsklick, Druck — bei jedem fragt Excel Ihren Code „soll ich fortfahren?“,
und Ihr Cancel ist die Antwort.
Wie ExcelMaster hilft
Ein Druck-Wächter besteht aus ein paar kleinen Entscheidungen, die man leicht auf subtile
Weise falsch trifft: das Cancel = True, das den Auftrag blockiert, das MsgBox, das die
Blockade nicht rätselhaft bleiben lässt, die Disziplin, den Handler leichtgewichtig zu
halten, damit die Vorschau schnell bleibt, und das Verwenden von PageSetup, statt Zellen
zu verändern.
ExcelMaster
lässt Sie stattdessen das Verhalten beschreiben. Sagen Sie „blockiere vor dem Drucken den
Druck und weise den Benutzer darauf hin, falls die Rechnung nicht freigegeben ist, und
stemple das Druckdatum in die Fußzeile jedes Blatts“, und es schreibt ein
Workbook_BeforePrint in ThisWorkbook, das Cancel setzt, die Blockade erklärt und
PageSetup für den Stempel nutzt. Die Arbeitsmappe und der Code bleiben Ihnen; Sie ersparen
sich, die Vorschau-Falle auf die harte Tour zu lernen.
Häufig gestellte Fragen
Wie führe ich in Excel ein Makro vor dem Drucken aus?
Legen Sie eine Workbook_BeforePrint-Prozedur in das ThisWorkbook-Modul:
Private Sub Workbook_BeforePrint(Cancel As Boolean). Excel ruft sie vor jedem Druck der
Arbeitsmappe auf. Fügen Sie dort Ihre Einrichtung oder Prüfungen ein. Aus einem
gewöhnlichen Module feuert es nicht.
Wie verhindere ich in VBA, dass eine Arbeitsmappe gedruckt wird?
Setzen Sie Cancel = True innerhalb von Workbook_BeforePrint. Excel prüft Cancel,
nachdem Ihr Handler gelaufen ist, und True blockiert den Druck. Zeigen Sie stets ein
MsgBox, das erklärt, warum — eine stille Blockade wirkt auf den Benutzer wie ein kaputter
Drucker.
Feuert Workbook_BeforePrint bei der Druckvorschau?
Ja. Das Öffnen der Ansicht Drucken/Druckvorschau löst es aus, nicht nur ein echter Druck. Deshalb sollten Sie den Handler leichtgewichtig halten — jede aufwendige Aktualisierung oder Neuberechnung würde jedes Mal laufen, wenn jemand eine Vorschau ansieht.
Gibt es ein Worksheet_BeforePrint-Ereignis für ein einzelnes Blatt?
Nein. BeforePrint gibt es nur auf Arbeitsmappenebene und es feuert einmal für die gesamte
Arbeitsmappe, ohne Ihnen zu verraten, welches Blatt gedruckt wird. Um je Blatt zu handeln,
durchlaufen Sie ThisWorkbook.Worksheets innerhalb des Handlers oder setzen Sie die Kopf-/
Fußzeile jedes Blatts über PageSetup.
Wie füge ich jeder Seite das Druckdatum hinzu?
Nutzen Sie eine PageSetup-Fußzeile mit dem Datum, entweder den eingebauten Code &D oder
Format(Date, "yyyy-mm-dd"), angewendet auf jedes Blatt in Workbook_BeforePrint. Eine
Fußzeile ist nur für den Druck da und muss nicht aufgeräumt werden, anders als ein in eine
Zelle geschriebener Wert.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 06.08.2026.
Verwandte Anleitungen: VBA Worksheet_BeforeDoubleClick · VBA Worksheet_BeforeRightClick · VBA Workbook_BeforeSave · VBA Workbook_BeforeClose · VBA Workbook_Open
