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

VBA Worksheet_SelectionChange in Excel — Code ausführen, wenn sich der Cursor bewegt (die aktive Zeile ohne Ruckeln hervorheben)

|

VBA Worksheet_SelectionChange in Excel — Code ausführen, wenn sich der Cursor bewegt (die aktive Zeile ohne Ruckeln hervorheben)

TL;DRWorksheet_SelectionChange ist 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 als Target, 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 mit Application.EnableEvents ab, sonst feuert es erneut, so wie Worksheet_Change es 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 Target reicht
  • 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 Change teilt — das Ändern der Auswahl löst das Ereignis erneut aus
  • Was Target tatsä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 verschiebtTarget.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