TL;DR —
Selectionist ein Live-Zeiger auf das, was gerade markiert ist. Meistens ist das einRange— eine Zelle oder viele —, sodass Sie ihn durchlaufen, summieren oder formatieren können. AberSelectionkann genauso gut ein Diagramm, eine Form oder eine Gruppe von Objekten sein, und dann wirft Code wieFor Each c In SelectionoderSelection.Valueeinen Laufzeitfehler. Die professionelle Gewohnheit ist zweiteilig: sichern Sie mitTypeName(Selection) = "Range"ab, bevor Sie Zellen anfassen, und verwenden Sie für alles, was kein benutzergesteuertes Werkzeug ist,Selectiongar 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 —
Selectionist nicht immer ein Bereich SelectiongegenActiveCell— 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 sindSelection.Rows.Count/Selection.Columns.Count— seine FormSelection.Address— die markierte Adresse, z. B.$B$2:$D$10Selection.Value— aber nur bei einer einzelnen Zelle sinnvoll; bei einer Mehrzellenauswahl liefert es ein 2D-Array, und die Zuweisungx = Selection.Valuean 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
Selectionfü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
Selectionnicht 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
