TL;DR —
Worksheet_SelectionChangeist ein Ereignis, das Excel jedes Mal auslöst, wenn sich die Auswahl bewegt — ein Klick, eine Pfeiltaste, das Drücken von Enter. Es reicht Ihnen die neue Auswahl alsTarget, sodass Sie dem Cursor folgen können: die aktive Zeile hervorheben, ein Kontextpanel anzeigen, eine Statuszelle aktualisieren. Die eine Regel, die es beherrscht: es feuert ununterbrochen, also muss der Handler federleicht sein — alles Langsame lässt das ganze Blatt träge und kaputt wirken. Und wenn es die Auswahl selbst ändert, sichern Sie es mitApplication.EnableEventsab, sonst feuert es erneut, so wieWorksheet_Changees tut.
' Liegt im eigenen Objekt des Blatts (z. B. Sheet1), NICHT in einem Module oder in ThisWorkbook.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' Die aktive Zeile hervorheben — nur löschen, was wir gesetzt haben, dann neu anwenden.
Cells.Interior.ColorIndex = xlNone ' vorherige Hervorhebung löschen
Target.EntireRow.Interior.Color = RGB(255, 255, 200)
End Sub
Während Worksheet_Change auf Bearbeitungen reagiert,
reagiert SelectionChange auf Bewegung. Es ist das Ereignis hinter jedem „dem
Cursor folgen“-Effekt — die hervorgehobene aktive Zeile, die breite Tabellen lesbar
macht, das Seitenpanel, das sich aktualisiert, während Sie eine Liste hinunterpfeilen,
der Zellbezug in einer Statusleiste. Es ist zugleich das Ereignis, das eine
Arbeitsmappe am ehesten langsam wirken lässt, weil Excel es bei jeder
Cursorbewegung aufruft — Dutzende Male pro Sekunde, wenn Sie eine Pfeiltaste gedrückt
halten.
Was Sie lernen
- Das mentale Modell — ein Cursor-Tracker, der Ihnen die neue Auswahl als
Targetreicht - Die Regel, die alles beherrscht — es feuert ununterbrochen, also halten Sie es leicht
- Der Kniff, den alle wollen — die aktive Zeile hervorheben, ohne die Formatierung zu ruinieren
- Die Falle, die es mit
Changeteilt — das Ändern der Auswahl löst das Ereignis erneut aus - Was
Targettatsächlich ist — die neue Auswahl, die viele Zellen umfassen kann
Das mentale Modell: ein Cursor-Tracker, kein Bearbeitungssensor
SelectionChange ist ein Tracker, der mit dem Cursor verdrahtet ist. Sie rufen es nie
auf; jedes Mal, wenn sich die ausgewählte Zelle oder der ausgewählte Bereich bewegt,
ruft Excel Sie auf und übergibt die neue Auswahl als Range namens Target. An
den Daten hat sich nichts geändert — nur, wohin der Benutzer schaut. Das ist die
saubere Trennlinie zwischen den beiden „auf den Benutzer reagieren“-Ereignissen:
Change = ein Wert hat sich geändert; SelectionChange = der Cursor hat sich
bewegt.
Wie alle Arbeitsblatt-Ereignisse liegt der Handler im Codeobjekt des betreffenden
Blatts (Sheet1 im Projekt-Explorer), nicht in ThisWorkbook und nicht in einem
Module, mit der festen Signatur
Private Sub Worksheet_SelectionChange(ByVal Target As Range). Die
arbeitsmappenweite Variante, die für jedes Blatt feuert, ist
Workbook_SheetSelectionChange in ThisWorkbook.
Die Regel, die alles beherrscht: es feuert ununterbrochen, also halten Sie es leicht
Das ist die Regel, die ein flottes Blatt von einem trägen trennt. SelectionChange
läuft bei jeder Bewegung der Auswahl — jedem Druck auf eine Pfeiltaste, jedem Klick,
jedem Tab und Enter. Halten Sie die Pfeiltaste nach unten gedrückt, kann es viele Male
pro Sekunde feuern. Was auch immer der Handler tut, der Benutzer zahlt diesen Preis bei
jeder einzelnen Bewegung.
Der Handler muss also O(winzig) sein. Der Fehlermodus ist unverkennbar: Packen Sie
eine langsame Abfrage, eine große For-Schleife oder eine vollständige
Neuformatierung des Blatts hier hinein, und das Blatt entwickelt eine sichtbare
Verzögerung — der Cursor stockt, Pfeiltasten fühlen sich matschig an, und die Benutzer
schließen, die Datei sei „kaputt“. Die Regel: Tun Sie in SelectionChange das
Minimum; iterieren Sie nie über große Bereiche, greifen Sie nicht auf die Festplatte
zu und berechnen Sie nichts von darin neu. Brauchen Sie schwere Arbeit, lösen Sie sie
über eine Schaltfläche aus, nicht durch das Bewegen des Cursors.
Der Kniff, den alle wollen: die aktive Zeile hervorheben (richtig gemacht)
Die mit Abstand am häufigsten gewünschte Verwendung dieses Ereignisses ist es, die Zeile der aktiven Zelle hervorzuheben, damit eine breite Tabelle quer gut lesbar ist. Die naive Variante funktioniert, richtet aber klammheimlich Schaden an:
' Naiv — zerstört alle vorhandenen Füllungen und Farben aus bedingter Formatierung auf dem Blatt
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Cells.Interior.ColorIndex = xlNone ' löscht die Füllung JEDER Zelle
Target.EntireRow.Interior.Color = RGB(255, 255, 200)
End Sub
Zwei echte Probleme stecken darin. Erstens löscht Cells.Interior.ColorIndex = xlNone
die Füllung jeder Zelle — auch bewusste Füllungen und die von Hand gesetzten
Ergebnisse einer Streifenbildung im Stil der bedingten Formatierung —, sodass Ihre
Hervorhebung die Formatierung des Benutzers auffrisst. Zweitens leert das Ändern von
.Interior den Rückgängig-Stapel von Excel: Nachdem das Ereignis gelaufen ist, ist
das Strg+Z des Benutzers weg. Auf einem Dateneingabeblatt sind das echte Kosten für die
Bedienbarkeit.
Der robuste Ansatz ist, die Anzeige zu ändern, nicht die Zellformatierung — steuern Sie eine Regel der bedingten Formatierung über eine Hilfszelle, die Sie im Handler aktualisieren:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' Die aktive Zeilennummer in einer Hilfszelle speichern (etwa Z1);
' eine Regel der bedingten Formatierung =ROW()=$Z$1 färbt die Zeile.
Application.EnableEvents = False ' das Schreiben in Z1 ist eine Bearbeitung — Ereignisse nicht erneut auslösen
Range("Z1").Value = Target.Row
Application.EnableEvents = True
End Sub
Jetzt übernimmt die bedingte Formatierung das Färben, keine echten Füllungen werden angetastet, und der Rückgängig-Stapel überlebt. Der Handler bleibt winzig — er schreibt eine einzige Zahl. Das ist das Muster, zu dem Sie greifen, wenn „die aktive Zeile hervorheben“ mit echter Formatierung koexistieren muss.
Die Falle, die es mit Change teilt: erneutes Auswählen löst das Ereignis erneut aus
SelectionChange birgt dieselbe Gefahr der Selbstauslösung wie
Worksheet_Change, nur über eine andere Aktion. Wenn Ihr
Handler die Auswahl verschiebt — Target.Offset(1, 0).Select oder
Range("A1").Select —, ist das selbst eine Änderung der Auswahl, die SelectionChange
erneut auslöst. Tun Sie das bedingungslos, bekommen Sie eine Rekursion oder einen
Cursor, der gegen den Benutzer ankämpft.
Dieselbe Lösung gilt: Klammern Sie jede Änderung der Auswahl (oder jeden
Zellschreibvorgang, wie die Hilfszelle oben) mit
Application.EnableEvents = False … = True ein und aktivieren Sie Ereignisse in einem
Fehlerhandler wieder, damit ein Absturz sie nicht global abgeschaltet zurücklassen
kann:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo Done
Application.EnableEvents = False
Range("Z1").Value = Target.Row ' oder ein abgesichertes .Select, falls Sie den Cursor bewegen müssen
Done:
Application.EnableEvents = True
End Sub
Wenn Sie hier je nach dem Experimentieren erleben, dass Ereignisse nicht mehr
funktionieren, hat ein fehlgeschlagener Handler EnableEvents abgeschaltet gelassen —
dieselbe Geschichte, die in VBA On Error erzählt wird. Führen
Sie Application.EnableEvents = True im Direktfenster aus, um sich zu erholen.
Was Target tatsächlich ist: die neue Auswahl, vielleicht viele Zellen
Target ist alles, was jetzt ausgewählt ist — und das ist nicht immer eine Zelle.
Klicken Sie auf eine Spaltenüberschrift, und Target ist die gesamte Spalte; ziehen
Sie einen Block auf, und Target ist dieser Block; Strg-Klick, und es ist ein Bereich
aus mehreren Teilbereichen. Code, der eine einzelne Zelle annimmt — Target.Value,
Target.Row als „die eine Zeile“ behandelt —, kann sich bei einer großen Auswahl
falsch verhalten.
Zwei Gewohnheiten halten es sicher: Lesen Sie Target.Cells(1, 1), wenn Sie wirklich
die aktive Zelle oben links wollen, und brechen Sie kurz ab, wenn eine riesige Auswahl
die Arbeit sinnlos macht: If Target.Cells.Count > 1000 Then Exit Sub. Das schützt
sowohl die Leistung (zurück zur Regel „halten Sie es leicht“) als auch davor, etwas
Unsinniges zu tun, wenn der Benutzer eine ganze Spalte auswählt. SelectionChange
vervollständigt das Trio: Es reagiert auf den Cursor,
Worksheet_Change reagiert auf Bearbeitungen, und
Workbook_Open reagiert auf das Öffnen der Datei.
Wie ExcelMaster hilft
Ein dem Cursor folgendes Makro ist ein Balanceakt: bei jeder Bewegung reagieren, aber fast nichts tun; die Zeile hervorheben, aber nicht die Formatierung des Benutzers oder sein Rückgängig auffressen; die eigenen Änderungen der Auswahl absichern, damit das Ereignis nicht gegen sich selbst ankämpft. Es ist leicht, eines zu schreiben, das funktioniert und das Blatt trotzdem kaputt wirken lässt.
ExcelMaster
lässt Sie stattdessen den Effekt beschreiben. Sagen Sie „hebe die Zeile der Zelle
hervor, auf der ich gerade bin, ohne meine vorhandenen Farben zu stören“, und es
schreibt ein leichtgewichtiges Worksheet_SelectionChange im richtigen Blattobjekt —
steuert die bedingte Formatierung über eine Hilfszelle, abgesichert mit EnableEvents
und klein genug gehalten, um nicht zu ruckeln. Sie behalten die volle Kontrolle über
den Code; Sie überspringen den Teil, in dem eine gut gemeinte Hervorhebung die
Formatierung eines ganzen Tages auslöscht.
Häufig gestellte Fragen
Was ist Worksheet_SelectionChange in VBA?
Es ist ein Arbeitsblatt-Ereignis, das Excel jedes Mal auslöst, wenn sich die Auswahl
bewegt — ein Klick, eine Pfeiltaste, Tab oder Enter. Excel übergibt die neue Auswahl an
Ihren Handler als Range namens Target. Anders als Worksheet_Change feuert es bei
Bewegung, nicht bei Bearbeitungen, also wird es verwendet, um dem Cursor zu folgen (die
aktive Zeile hervorheben, ein Statuspanel aktualisieren).
Wie hebe ich die aktive Zeile in Excel mit VBA hervor?
Der robuste Weg ist, die aktive Zeilennummer aus einem
Worksheet_SelectionChange-Handler in einer Hilfszelle zu speichern und eine Regel der
bedingten Formatierung (=ROW()=$Z$1) die Zeile färben zu lassen. Das vermeidet den
naiven Ansatz Cells.Interior.ColorIndex = xlNone, der vorhandene Füllungen auslöscht
und den Rückgängig-Stapel bei jeder Cursorbewegung leert.
Warum ist mein Blatt nach dem Hinzufügen von SelectionChange langsam oder ruckelig?
Weil das Ereignis bei jeder Cursorbewegung feuert — viele Male pro Sekunde, wenn Sie
eine Pfeiltaste gedrückt halten — und Ihr Handler zu viel tut. Halten Sie es
federleicht: keine Schleifen über große Bereiche, keine Neuberechnung, kein
Festplattenzugriff. Verlagern Sie schwere Arbeit stattdessen auf eine Schaltfläche und
steigen Sie bei großen Auswahlen früh aus mit
If Target.Cells.Count > 1000 Then Exit Sub.
Was ist der Unterschied zwischen SelectionChange und Change?
Worksheet_SelectionChange feuert, wenn sich der Cursor zu einer neuen Zelle oder
einem neuen Bereich bewegt; Worksheet_Change feuert, wenn sich der Inhalt einer
Zelle ändert (getippt, eingefügt, gelöscht oder von VBA geschrieben). Das Bewegen über
ein Blatt löst nur SelectionChange aus; das Bearbeiten eines Werts löst nur Change
aus.
Feuert SelectionChange, wenn ich die Auswahl mit VBA verschiebe?
Ja. Range("A1").Select aus dem Code zählt als Änderung der Auswahl und löst das
Ereignis aus, was zu Rekursion führen kann, wenn es innerhalb des Handlers geschieht.
Umschließen Sie jede Änderung der Auswahl mit Application.EnableEvents = False … = True und aktivieren Sie Ereignisse stets in einem Fehlerhandler wieder.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 02.08.2026.
Verwandte Anleitungen: VBA Worksheet_Change · VBA Workbook_Open · VBA On Error · VBA Range · VBA For-Schleife
