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

VBA Selection in Excel — mit dem arbeiten, was markiert ist (und warum es nicht immer ein Range ist)

|

VBA Selection in Excel — mit dem arbeiten, was markiert ist (und warum es nicht immer ein Range ist)

TL;DRSelection ist ein Live-Zeiger auf das, was gerade markiert ist. Meistens ist das ein Range — eine Zelle oder viele —, sodass Sie ihn durchlaufen, summieren oder formatieren können. Aber Selection kann genauso gut ein Diagramm, eine Form oder eine Gruppe von Objekten sein, und dann wirft Code wie For Each c In Selection oder Selection.Value einen Laufzeitfehler. Die professionelle Gewohnheit ist zweiteilig: sichern Sie mit TypeName(Selection) = "Range" ab, bevor Sie Zellen anfassen, und verwenden Sie für alles, was kein benutzergesteuertes Werkzeug ist, Selection gar nicht — benennen Sie den Bereich, den Sie meinen.

Sub SumTheSelection()
    ' Zuerst absichern: Selection ist nicht immer ein Bereich
    If TypeName(Selection) <> "Range" Then
        MsgBox "Select some cells first.", vbExclamation
        Exit Sub
    End If

    Dim cell As Range, total As Double
    For Each cell In Selection.Cells
        If IsNumeric(cell.Value) Then total = total + cell.Value
    Next cell
    MsgBox "Sum of selection: " & total
End Sub

Selection wirkt einfach — es ist „das Zeug, das ich markiert habe“ — und für ein schnelles Werkzeug, das auf dem wirkt, was der Benutzer gewählt hat, ist es genau richtig. Ärger beginnt, wenn Code annimmt, die Auswahl sei ein ordentlicher Zellblock. Oft ist sie das nicht, und der Fehlschlag ist ein harter Absturz statt einer falschen Antwort. In dieser Anleitung geht es darum zu wissen, was Selection wirklich sein kann, und jeden Fall zu behandeln.

Was Sie lernen

  • Das mentale Modell — ein Live-Zeiger auf die Markierung, kein Bereich, den Sie benannt haben
  • Die Regel, die es nützlich macht — meist ein Bereich, den Sie durchlaufen können
  • Die Regel, die Code abstürzen lässt — Selection ist nicht immer ein Bereich
  • Selection gegen ActiveCell — die ganze Markierung gegen den einen Anker
  • Mehrbereichsauswahlen — die .Areas-Falle bei Strg-Klick
  • Die größere Lektion — Bereiche für nicht-interaktiven Code ausdrücklich referenzieren

Das mentale Modell: ein Live-Zeiger auf die Markierung

Wie ActiveCell hat Selection keine feste Identität. Es ist keine Zelle und kein Bereich, den Sie deklariert haben — es ist Excels Antwort auf die Frage „Was ist im aktiven Fenster in diesem Augenblick markiert?“ Klicken Sie eine andere Zelle an, und Selection bedeutet etwas anderes. Führen Sie ein Makro am Montag mit einer markierten Spalte und am Dienstag mit einem ausgewählten Diagramm aus, und Selection ist an einem Tag ein Range und am nächsten ein Chart.

Das macht Selection mächtig für Werkzeuge — eine Schaltfläche, die „was ich gewählt habe“ formatiert, braucht genau das — und gefährlich für Automatisierung, bei der die Markierung das ist, was der Benutzer zufällig hinterlassen hat. Das Wichtigste, das Sie über Selection wissen müssen, ist: Sie kontrollieren seinen Typ nicht.

Die Regel, die es nützlich macht: meist ein Bereich, den Sie durchlaufen können

Wenn die Auswahl aus Zellen besteht, ist Selection ein Range, und jeder Bereichstrick greift. Das häufigste Muster ist das Durchlaufen der ausgewählten Zellen:

Sub HighlightNegatives()
    Dim cell As Range
    For Each cell In Selection.Cells
        If IsNumeric(cell.Value) Then
            If cell.Value < 0 Then cell.Interior.Color = vbRed
        End If
    Next cell
End Sub

Nützliche Member, wenn die Auswahl ein Bereich ist:

  • Selection.Cells.Count — wie viele Zellen markiert sind
  • Selection.Rows.Count / Selection.Columns.Count — seine Form
  • Selection.Address — die markierte Adresse, z. B. $B$2:$D$10
  • Selection.Value — aber nur bei einer einzelnen Zelle sinnvoll; bei einer Mehrzellenauswahl liefert es ein 2D-Array, und die Zuweisung x = Selection.Value an einen Skalar gibt Ihnen nur die erste Zelle oder einen Fehler

Der letzte Punkt ist der unauffällige: Selection.Value gibt Ihnen nicht „die Summe“ oder „die Werte“ eines Blocks so, wie die meisten Anfänger es erwarten. Um über eine Mehrzellenauswahl zu arbeiten, durchlaufen Sie sie (wie oben) oder lesen Sie sie in ein Array.

Die Regel, die Code abstürzen lässt: Selection ist nicht immer ein Range

Das ist der häufigste Selection-Bug. Ihr Makro durchläuft die Auswahl, funktioniert wochenlang perfekt, dann führt ein Benutzer es mit angeklicktem Diagramm aus, und es stirbt mit „Objekt unterstützt diese Eigenschaft oder Methode nicht“ (Fehler 438) oder „Objekt erforderlich“ (Fehler 424). Nichts ist kaputt — die Auswahl ist schlicht kein Bereich:

' Was Selection sein kann, je nachdem, was angeklickt ist:
'   Zellen             -> Range
'   ein Diagrammobjekt -> ChartObject / Chart
'   eine Form          -> Shape
'   mehrere Objekte    -> DrawingObjects
'   nichts Brauchbares -> hängt vom Kontext ab

Die Lösung ist eine einzeilige Absicherung am Anfang jedes Makros, das Zellen erwartet — prüfen Sie den Typ, bevor Sie ihn anfassen:

Sub NeedsCells()
    If TypeName(Selection) <> "Range" Then
        MsgBox "This tool works on cells. Select a range first.", vbExclamation
        Exit Sub
    End If
    ' ...ab hier ist es sicher, Selection als Range zu behandeln...
End Sub

TypeName(Selection) liefert die Zeichenfolge "Range", wenn Zellen markiert sind, und andernfalls "ChartObject", "Rectangle", "Picture" und so weiter. Machen Sie diese Absicherung zum Reflex in jedem auswahlbasierten Werkzeug — sie ist der Unterschied zwischen einer freundlichen Aufforderung und einem Absturz vor den Augen des Benutzers.

Selection gegen ActiveCell: die ganze Markierung gegen den einen Anker

Sie werden ständig verwechselt, halten Sie die Aufteilung also klar:

Selection ActiveCell
Umfang Die gesamte Markierung Die eine Ankerzelle
Anzahl Eine oder viele Zellen (oder ein Nicht-Zellen-Objekt) Immer genau eine Zelle
Immer ein Bereich? Nein — kann eine Form/ein Diagramm sein Nur eine Zelle (Fehler auf einem Diagrammblatt)
.Value lesen Array bei mehreren Zellen Immer ein einzelner Wert
Verwenden für „Alles, was der Benutzer gewählt hat“ „Die eine fokussierte Zelle“

Sie arbeiten zusammen: ActiveCell ist der Anker innerhalb von Selection. Siehe VBA ActiveCell für die Einzelzellenseite des Paares.

Die Mehrbereichsfalle: Strg-Klick erzeugt mehrere Areas

Es gibt ein subtileres Formproblem, selbst wenn Selection ein Bereich ist. Wenn der Benutzer per Strg-Klick A1:A5 und C1:C5 markiert, ist das eine Auswahl aus zwei Areas. Eine einzelne Schleife über Selection.Cells besucht immer noch jede Zelle — aber Code, der über „den Bereich“ argumentiert (seine Adresse, seine Ecken, Selection.Rows.Count), kann die falsche Antwort bekommen, weil sich diese nur auf die erste Area beziehen:

Sub WalkAllAreas()
    Dim area As Range, cell As Range
    Debug.Print "Areas selected: " & Selection.Areas.Count   ' z. B. 2
    For Each area In Selection.Areas
        For Each cell In area.Cells
            ' ...jede Zelle in jeder Area verarbeiten...
        Next cell
    Next area
End Sub

Die Regel: Wenn eine Auswahl nicht zusammenhängend sein könnte, durchlaufen Sie Selection.Areas, nicht nur Selection. Es ist dieselbe Klasse von „die Form ist nicht das, was ich angenommen habe“-Bug wie der Nicht-Bereichs-Fall oben.

Die größere Lektion: den Bereich für nicht-interaktiven Code benennen

Alles oben handelt davon, Selection sicher zu behandeln — aber die tiefere Lektion ist zu wissen, wann man es vermeidet. Selection hängt vollständig vom UI-Zustand ab, ändert sich unter Ihnen und bedeutet nichts, wenn ein Makro unbeaufsichtigt läuft. Also:

  • Nehmen Sie Selection für wirklich interaktive Werkzeuge — eine Schaltfläche im Menüband, einen Rechtsklick-Helfer, ein „formatiere, was ich gewählt habe“-Makro. Dort ist „was auch immer der Benutzer markiert hat“ die Eingabe.
  • Nehmen Sie Selection nicht für Automatisierung, die auf bekannte Daten zielt. Referenzieren Sie den Bereich direkt — Worksheets("Data").Range("A1:A100") —, damit das Makro unabhängig davon ist, wo der Cursor gerade steht.

Das ist dasselbe Prinzip wie das, Zellen nicht auszuwählen, bevor man auf ihnen arbeitet, behandelt in VBA Select gegen Activate: Je weniger Ihrer Makros von der Live-Auswahl abhängen, desto weniger brechen, wenn ein Benutzer irgendwo Unerwartetes klickt.

Wie ExcelMaster hilft

Die Selection-Fallen — ein Diagramm statt Zellen, ein Strg-Klick, der in Areas zerfällt, ein Selection.Value, das nicht der gemeinte Wert ist — kompilieren alle einwandfrei und beißen erst zur Laufzeit, beim Klick eines anderen. Die Absicherungen und die Area-Schleifen von Hand zu schreiben, ist fummelig und leicht zu vergessen.

ExcelMaster lässt Sie stattdessen das Werkzeug beschreiben. Bitten Sie um „eine Schaltfläche, die summiert, welche Zellen ich auch ausgewählt habe“, und es schreibt die TypeName-Absicherung und die Area-bewusste Schleife für Sie; bitten Sie um „bereinige Spalte A auf dem Blatt Data“, und es überspringt Selection ganz und referenziert den Bereich direkt. Sie behalten ein lesbares Makro, ohne sich an jede Art erinnern zu müssen, wie eine Auswahl Sie überraschen kann.

Häufig gestellte Fragen

Wie durchlaufe ich in VBA ausgewählte Zellen?

Verwenden Sie For Each cell In Selection.Cells. Zum Beispiel: For Each cell In Selection.Cells: Debug.Print cell.Address: Next cell. Sichern Sie zuerst mit If TypeName(Selection) <> "Range" Then Exit Sub ab, denn eine Schleife über eine Nicht-Bereichs-Auswahl (wie ein Diagramm) löst einen Fehler aus. Bei Strg-Klick-Auswahlen durchlaufen Sie Selection.Areas und dann die Zellen jeder Area.

Warum gibt mein Selection-Code Fehler 438 oder 424?

Weil Selection in dem Moment kein Range ist — ein Diagramm, eine Form oder ein anderes Objekt war statt Zellen ausgewählt, und es unterstützt keine Bereichs-Member wie .Cells oder .Value. Fügen Sie If TypeName(Selection) <> "Range" Then Exit Sub am Anfang des Makros hinzu, damit es sauber beendet (oder den Benutzer auffordert), statt abzustürzen.

Was ist der Unterschied zwischen Selection und ActiveCell?

Selection ist der gesamte markierte Bereich und kann viele Zellen umfassen — oder sogar eine Form oder ein Diagramm. ActiveCell ist immer die einzelne Ankerzelle innerhalb dieser Auswahl. Nehmen Sie ActiveCell für die eine fokussierte Zelle und Selection, wenn Sie alles brauchen, was der Benutzer markiert hat.

Wie erhalte ich die Anzahl der ausgewählten Zellen?

Verwenden Sie Selection.Cells.Count für die Gesamtzahl der Zellen, Selection.Rows.Count und Selection.Columns.Count für seine Form und Selection.Areas.Count, um zu sehen, ob es ein einzelner Block oder ein Strg-Klick aus mehreren Areas ist. Denken Sie daran, dass die Zeilen-/Spaltenzahlen nur die erste Area beschreiben, wenn die Auswahl nicht zusammenhängend ist.

Sollte ich Selection verwenden oder den Bereich direkt referenzieren?

Nehmen Sie Selection nur für interaktive Werkzeuge, die auf „was auch immer der Benutzer gewählt hat“ wirken. Für Automatisierung, die auf bekannte Daten zielt, referenzieren Sie den Bereich ausdrücklich — zum Beispiel Worksheets("Data").Range("A1:A100") —, sodass das Makro nicht davon abhängt, wo der Cursor ist, und nicht auf die falschen Zellen wirken kann.

Getestet in

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

Verwandte Anleitungen: VBA ActiveCell · VBA Select gegen Activate · VBA Range · VBA For Each · VBA Worksheet_SelectionChange