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

VBA Worksheet_Activate und Deactivate in Excel — Code ausführen, wenn Sie das Blatt wechseln (und warum Sie ein Verlassen nicht abbrechen können)

|

VBA Worksheet_Activate und Deactivate in Excel — Code ausführen, wenn Sie das Blatt wechseln (und warum Sie ein Verlassen nicht abbrechen können)

TL;DRWorksheet_Activate feuert, wenn ein Blatt zum aktiven wird (Sie landen darauf); Worksheet_Deactivate feuert genau dann, wenn Sie es verlassen (bevor ein anderes Blatt übernimmt). Es sind die Ankunfts- und Abgangsereignisse eines Blatts — nutzen Sie Activate, um ein Dashboard beim Ansehen zu aktualisieren, und Deactivate, um etwas zu prüfen, bevor der Benutzer weiterzieht. Der Haken, der sie prägt: Keines hat ein Cancel-Argument. Anders als BeforeClose und BeforeSave können Sie einen Blattwechsel beobachten, ihn aber nicht blockieren — das Beste, was Sie tun können, ist, den Benutzer zurückzuschnellen.

' Im eigenen Modul des Blatts (z. B. Dashboard) — NICHT ThisWorkbook, NICHT ein Module.
Private Sub Worksheet_Activate()
    Me.Range("A1").Select              ' bei jeder Ankunft ganz oben landen
    ActiveWindow.ScrollRow = 1
    Me.Calculate                       ' die Zahlen dieses Blatts beim Ansehen aktualisieren
End Sub

Private Sub Worksheet_Deactivate()
    ' Hier existiert kein Cancel-Parameter — Sie können warnen, aber das Verlassen nicht stoppen.
    If Me.Range("Signoff").Value = "" Then _
        MsgBox "Heads up: you left the Dashboard without signing off.", vbInformation
End Sub

Das Blatt zu wechseln ist das Gewöhnlichste, was ein Benutzer tut, und diese beiden Ereignisse lassen ein Blatt darauf reagieren. Worksheet_Activate treibt „aktualisiere, wenn ich diesen Reiter ansehe“ an — neu berechnen, neu abfragen, nach oben scrollen, schützen oder entschützen. Worksheet_Deactivate treibt „prüfe, bevor ich weggehe“ an. Der Kniff liegt darin, zu verstehen, was diese Ereignisse nicht können, denn genau das trennt sie von den Wächter-Ereignissen.

Was Sie lernen

  • Das mentale Modell — Ankunfts- und Abgangsereignisse, eines je Blatt
  • Warum es kein Cancel gibt — und der Zurückschnellen-Umweg, wenn Sie einen Benutzer halten müssen
  • Das Aktualisieren-beim-Ansehen-Muster (und der Stolperstein „lief beim Öffnen nicht“)
  • Worksheet_Activate auf Blattebene gegenüber Workbook_SheetActivate auf Arbeitsmappenebene
  • Warum Diagrammblätter und der EnableEvents-Schutz hier beide eine Rolle spielen

Das mentale Modell: Ankunfts- und Abgangs-Gates

Stellen Sie sich jedes Blatt als ein Gate an einem Flughafen vor. Worksheet_Activate feuert in dem Augenblick, in dem Sie dieses Gate betreten — das Blatt ist gerade aktiv geworden. Worksheet_Deactivate feuert, während Sie hinausgehen — Sie haben einen anderen Reiter angeklickt, und dieses Blatt ist im Begriff zu übergeben. Sie rufen keines von beiden auf; Excel löst sie beim Wechsel aus, und zwar der Reihe nach: zuerst das Deactivate des alten Blatts, dann das Activate des neuen.

Beide sind parameterlos, und beide liegen im Codemodul des betreffenden Blatts — nicht ThisWorkbook, nicht ein gewöhnliches Module. Doppelklicken Sie unter „Microsoft Excel Objekte“ auf das Blatt (etwa Dashboard) und schreiben Sie dort Private Sub Worksheet_Activate(). Darin verweist Me auf genau dieses Blatt, weshalb sich Me.Calculate und Me.Range(...) sauber lesen.

Die Regel, die diese Ereignisse prägt: es gibt kein Veto

Das ist die Einsicht, die den ganzen Themenblock zusammenhält. BeforeClose und BeforeSave reichen Ihnen jeweils ein Cancel-Flag — Ihr Handler ist ein Kontrollpunkt, der die Aktion stoppen kann. Worksheet_Activate und Worksheet_Deactivate haben keinen solchen Parameter. Sehen Sie sich die Signaturen an: Worksheet_Deactivate() nimmt nichts entgegen. Es gibt kein Cancel zu setzen, also gibt es keine Möglichkeit, den Benutzer am Verlassen eines Blatts zu hindern. Wenn Deactivate läuft, ist die Entscheidung zu wechseln bereits gefallen.

Das ist kein Versehen — ein Blattwechsel ist kein riskanter, unwiderruflicher Akt wie das Schließen oder Speichern, also bietet Excel kein Veto an. Aber es bedeutet, dass „lass sie diesen Reiter nicht verlassen, bis B2 ausgefüllt ist“ nicht direkt möglich ist. Der ehrliche Umweg ist ein Zurückschnellen: das Problem erkennen und das Blatt erneut aktivieren, abgesichert gegen die erneute Auslösung:

Private Sub Worksheet_Deactivate()
    If Me.Range("B2").Value = "" Then
        Application.EnableEvents = False    ' unser Activate unten darf keine Kaskade auslösen
        Me.Activate                         ' den Benutzer zurück auf dieses Blatt zerren
        Application.EnableEvents = True
        MsgBox "Fill in B2 before leaving this sheet.", vbExclamation
    End If
End Sub

Verstehen Sie, was das ist: kein abgebrochener Wechsel, sondern ein vollzogener Wechsel, dem sofort ein Wechsel zurück folgt. Es flackert, es ist schwerfälliger als ein echtes Veto, und es löst Ereignisse erneut aus — daher der Application.EnableEvents-Schutz, dieselbe Disziplin wie in Worksheet_Change. Wenn Sie einen Benutzer wirklich halten müssen, bis die Daten gültig sind, ist ein modal angezeigtes UserForm ein saubereres Werkzeug, als gegen die Blattereignisse anzukämpfen. Kennen Sie die Grenze, und Sie werden um sie herum entwerfen, statt einem Cancel nachzujagen, das es nicht gibt.

Das Muster, das Activate lohnenswert macht: beim Ansehen aktualisieren

Der beste Einsatz von Worksheet_Activate ist „mach dieses Blatt in dem Moment richtig, in dem jemand es ansieht“. Ein Übersichtsreiter berechnet neu, ein Bericht fragt seine Quelle neu ab, ein Eingabeblatt scrollt nach oben und hebt den Schutz der Eingabezellen auf:

Private Sub Worksheet_Activate()
    Me.Unprotect Password:="x"
    Me.Range("Inputs").Locked = False
    Me.Calculate
    Application.Goto Me.Range("A1"), Scroll:=True   ' A1 bei der Ankunft oben links platzieren
End Sub

Es gibt einen Stolperstein, der einen steten Strom von „mein Activate lief nicht“-Fragen erzeugt: Das Blatt, das beim Öffnen der Arbeitsmappe bereits aktiv ist, feuert Worksheet_Activate nicht — es wurde nie angesteuert, es war schlicht das Startblatt. Soll die Aktualisierung auf diesem ersten Blatt zum Öffnungszeitpunkt geschehen, führen Sie sie zusätzlich aus Workbook_Open heraus aus oder rufen Sie Ihre Aktualisierungsroutine aus beiden auf.

Die Unterscheidung, die man richtig treffen muss: Blattebene gegenüber Arbeitsmappenebene

Worksheet_Activate in einem Blattmodul feuert nur für dieses eine Blatt. Wollen Sie reagieren, sobald der Benutzer auf irgendeinem Blatt landet, fügen Sie nicht denselben Handler in zwölf Blattmodule ein — nutzen Sie die Ereignisse auf Arbeitsmappenebene in ThisWorkbook:

' In ThisWorkbook — feuert für JEDES Blatt und verrät Ihnen über Sh, welches.
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Application.StatusBar = "You are on: " & Sh.Name
End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    ' Sh ist das Blatt, das verlassen wird.
End Sub

Die Arbeitsmappen-Varianten reichen Ihnen Sh — das betroffene Blatt —, sodass ein einziger Handler die ganze Datei abdeckt. Die Regel: ein bestimmtes Blatt → Worksheet_Activate in diesem Blatt; irgendein Blatt → Workbook_SheetActivate in ThisWorkbook. Blattebene zu wählen, wo Sie Arbeitsmappenebene meinten (oder umgekehrt), ist der häufigste Grund dafür, dass „das Ereignis auf den falschen Reitern feuert“.

Zwei weitere Grenzfälle, die man kennen sollte. Worksheet_Activate ist nur für Arbeitsblätter da — die Auswahl eines Diagrammblatts löst Chart_Activate aus, nicht dieses Ereignis, sodass ein Handler, der es erwartet, stillschweigend nie läuft. Und jedes Schreiben oder Auswählen, das Sie in diesen Handlern vornehmen, kann in weitere Ereignisse kaskadieren; halten Sie sie leichtgewichtig und greifen Sie zu Application.EnableEvents, wenn sie die Arbeitsmappe verändern.

Wie ExcelMaster hilft

Blattwechsel-Ereignisse sehen einfach aus, verbergen aber echtes Fingerspitzengefühl: welches Ereignis (Ankunft oder Abgang), welche Ebene (Blatt oder Arbeitsmappe), die Tatsache, dass Sie ein Verlassen nicht abbrechen können, der Stolperstein mit dem ersten Blatt beim Öffnen und der EnableEvents-Schutz bei jedem Zurückschnellen.

ExcelMaster lässt Sie das Ergebnis beschreiben. Sagen Sie „jedes Mal, wenn ich den Reiter Dashboard öffne, berechne ihn neu und scrolle nach oben“, und es schreibt ein Worksheet_Activate im richtigen Blatt — und bitten Sie um „warne mich, wenn ich ohne Freigabe gehe“, fügt es ein Worksheet_Deactivate hinzu, das warnt, statt vorzugeben, es könne blockieren, denn das kann es nicht. Die Arbeitsmappe und der Code bleiben Ihnen; Sie sparen sich, die Grenzen auf die harte Tour zu lernen.

Häufig gestellte Fragen

Was ist der Unterschied zwischen Worksheet_Activate und Worksheet_Deactivate?

Worksheet_Activate läuft, wenn ein Blatt zum aktiven wird — Sie sind gerade dorthin gewechselt. Worksheet_Deactivate läuft, während Sie dieses Blatt verlassen, kurz bevor ein anderes aktiv wird. Bei einem Wechsel feuert Excel zuerst das Deactivate des alten Blatts, dann das Activate des neuen. Beide liegen im Codemodul des betreffenden Blatts und nehmen keine Parameter entgegen.

Kann ich in VBA verhindern, dass ein Benutzer ein Arbeitsblatt verlässt?

Nicht direkt — Worksheet_Deactivate hat keinen Cancel-Parameter, also können Sie den Wechsel nicht so per Veto stoppen, wie Workbook_BeforeClose ein Schließen stoppt. Der Umweg ist ein Zurückschnellen: Rufen Sie in Deactivate Me.Activate auf, um den Benutzer auf das Blatt zurückzuholen (abgesichert mit Application.EnableEvents = False … = True), und zeigen Sie dann eine Meldung. Für eine echte Blockade zeigen Sie stattdessen ein modales UserForm.

Warum läuft Worksheet_Activate nicht, wenn die Arbeitsmappe geöffnet wird?

Weil das Startblatt nie angesteuert wurde — es war beim Öffnen der Datei bereits aktiv, also feuert für es kein Aktivierungsereignis. Wegwechseln und zurückwechseln löst es aus, doch für das anfängliche Blatt zum Öffnungszeitpunkt führen Sie Ihre Aktualisierung zusätzlich aus Workbook_Open heraus aus.

Wie führe ich Code aus, wenn irgendein Blatt ausgewählt wird, nicht nur eines?

Nutzen Sie die Ereignisse auf Arbeitsmappenebene in ThisWorkbook: Private Sub Workbook_SheetActivate(ByVal Sh As Object) feuert für jedes Blatt und übergibt Sh, das aktivierte Blatt. Das ist sauberer, als ein Worksheet_Activate in jedes Blattmodul zu kopieren.

Wohin gehört Worksheet_Activate-Code?

In das Codemodul des betreffenden Arbeitsblatts — doppelklicken Sie im Projekt-Explorer unter „Microsoft Excel Objekte“ auf dieses Blatt (z. B. Sheet1 oder Dashboard) und fügen Sie Private Sub Worksheet_Activate() hinzu. Aus einem gewöhnlichen Module feuert es nicht; die Variante für alle Blätter, Workbook_SheetActivate, gehört in ThisWorkbook.

Getestet in

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

Verwandte Anleitungen: VBA Workbook_BeforeClose · VBA Workbook_BeforeSave · VBA Workbook_Open · VBA Worksheet_SelectionChange · VBA On Error