Das Range-Objekt – Zellen in VBA ansprechen und bearbeiten
Fast jedes Excel-Makro dreht sich um Zellen – und in VBA steht dafür das Range-Objekt im Mittelpunkt. Es steht für eine einzelne Zelle, einen zusammenhängenden Bereich oder auch mehrere getrennte Bereiche gleichzeitig.
Zellen ansprechen: Range und Cells
Range("A1")– eine Zelle über ihre Excel-Adresse.Range("A1:C5")– ein zusammenhängender Bereich.Cells(1, 1)– dieselbe Zelle A1, aber über Zeile und Spalte als Zahlen angesprochen:Cells(Zeile, Spalte).
Cells ist besonders praktisch in Schleifen, weil sich Zeile und Spalte dort als Variable durchzählen lassen – Range braucht dafür erst eine zusammengesetzte Textadresse.
| A | B | |
|---|---|---|
| 1 | 100 | Range("A1") / Cells(1,1) |
| 2 | 200 | Range("A2") / Cells(2,1) |
| 3 | 300 | Range("A3") / Cells(3,1) |
Werte lesen und schreiben
Range("A1").Value = 42 ' Wert schreiben
MsgBox Range("A1").Value ' Wert auslesen
Für reine Zahlenwerte funktioniert auch .Value2 (etwas schneller, ohne Währungs-/Datumsformatierung), für den angezeigten Text .Text.
Offset und Resize
Range("A1").Offset(1, 0)– die Zelle eine Zeile unter A1, also A2.Range("A1").Offset(0, 1)– die Zelle eine Spalte rechts von A1, also B1.Range("A1").Resize(3, 2)– vergrößert den Bereich ab A1 auf 3 Zeilen und 2 Spalten, also A1:B3.
Letzte Zelle eines Bereichs ermitteln
Feste Bereichsgrößen sind unpraktisch, wenn sich die Datenmenge ändert. Üblich ist stattdessen, die letzte belegte Zeile dynamisch zu ermitteln:
Dim letzteZeile As Long
letzteZeile = Cells(Rows.Count, 1).End(xlUp).Row
Das entspricht der Tastenkombination Strg+Pfeil-runter/hoch: von der letzten Zeile des Blatts aus nach oben zur letzten befüllten Zelle in Spalte A springen. Alternativ liefert Range("A1").CurrentRegion den gesamten zusammenhängenden Datenbereich ab A1.
Über einen Bereich schleifen
Mit For Each lässt sich jede Zelle eines Bereichs einzeln bearbeiten – hier werden alle Werte über 150 fett markiert:
Sub GrosseWerteMarkieren()
Dim zelle As Range
For Each zelle In Range("A1:A3")
If zelle.Value > 150 Then
zelle.Font.Bold = True
End If
Next zelle
End Sub
Auf die Tabelle oben angewendet, würden die Zellen A2 (200) und A3 (300) fett formatiert, A1 (100) bliebe unverändert.
Vermeide Range("A1").Select gefolgt von Selection.Value = …. Direkt Range("A1").Value = … zu schreiben ist kürzer, schneller und weniger fehleranfällig – das Aktivieren einer Zelle ist für die meisten Aktionen schlicht überflüssig.
Häufige Fehler
- Cells(Zeile, Spalte) vertauscht –
Cellserwartet zuerst die Zeile, dann die Spalte;Cells(1, 2)ist B1, nicht A2. - Fester Bereich statt dynamischer Ermittlung –
Range("A1:A100")übersieht neue Zeilen oder läuft bei weniger Daten über leere Zellen. - .Value vs. .Value2 bei Datumswerten – führt in Sonderfällen zu abweichenden Formatierungen; im Zweifel
.Valueverwenden.