TL;DR —
Worksheet_Activatefeuert, wenn ein Blatt zum aktiven wird (Sie landen darauf);Worksheet_Deactivatefeuert genau dann, wenn Sie es verlassen (bevor ein anderes Blatt übernimmt). Es sind die Ankunfts- und Abgangsereignisse eines Blatts — nutzen SieActivate, um ein Dashboard beim Ansehen zu aktualisieren, undDeactivate, um etwas zu prüfen, bevor der Benutzer weiterzieht. Der Haken, der sie prägt: Keines hat einCancel-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
Cancelgibt — 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_Activateauf Blattebene gegenüberWorkbook_SheetActivateauf 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
