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

VBA Workbook_BeforePrint in Excel — einen Druck blockieren, eine Kopfzeile stempeln und die Druckvorschau-Falle

|

VBA Workbook_BeforePrint in Excel — einen Druck blockieren, eine Kopfzeile stempeln und die Druckvorschau-Falle

TL;DRWorkbook_BeforePrint ist ein Ereignis, das Excel auslöst, bevor irgendetwas in der Arbeitsmappe gedruckt wird. Es reicht Ihnen ein einziges Argument, Cancel. Setzen Sie Cancel = 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 in ThisWorkbook.

' 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 = True blockiert 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