TL;DR — Beide greifen „das ganze Rechteck", aber sie beantworten unterschiedliche Fragen.
Worksheet.UsedRangeist alles, was Excel jemals angefasst hat — ein zwischengespeicherter Umgrenzungsrahmen, der reine Formatierungszellen einschließt und nicht schrumpft, wenn Sie Daten löschen, also meldet er zu viel.Range.CurrentRegionist der zusammenhängende Block um eine einzelne Zelle, live berechnet (dasselbe, wasStrg + Umschalt + *auswählt), und er stoppt an der ersten vollständig leeren Zeile oder Spalte. Für eine einzelne saubere Tabelle istRange("A1").CurrentRegiondie verlässliche Wahl. Reservieren SieUsedRangefür „das ganze Blatt leeren", und lesen SieUsedRange.Rows.Countniemals, als wäre es die Nummer der letzten Zeile.
Sobald Sie die letzte Zeile finden können, lautet die nächste Frage meist „gib mir den ganzen Block auf einmal, damit ich ihn durchlaufen, kopieren oder formatieren kann". VBA hat zwei eingebaute Wege, die austauschbar aussehen und es nicht sind. Die falsche Wahl ist die Quelle zweier der häufigsten Makro-Bugs: das Verarbeiten Hunderter Phantomzeilen und das Lesen einer Zeilen-Anzahl, als wäre sie eine Zeilen-Nummer.
Was Sie lernen
- Das mentale Modell: ein zwischengespeicherter Umgrenzungsrahmen gegen einen live ermittelten zusammenhängenden Block
- Warum
UsedRangezu viel meldet und sich weigert zu schrumpfen - Warum
UsedRangemöglicherweise nicht bei A1 beginnt — der Off-by-Count-Bug - Warum
CurrentRegionan leeren Zeilen stoppt und wann genau das gewünscht ist - Eine klare Regel, welches Sie für welche Aufgabe nehmen
Das mentale Modell: eine veraltete Momentaufnahme gegen eine Live-Messung
UsedRange ist eine Momentaufnahme, die Excel für sich selbst führt. Es ist
das kleinste Rechteck, das jemals alles umschlossen hat, was Sie auf dem Blatt
getan haben — einen Wert getippt, einen Rahmen gesetzt, eine Füllung vergeben.
Excel speichert es zwischen und aktualisiert es träge, sodass es der Realität
hinterherhinkt: Es wächst eifrig und schrumpft widerwillig.
CurrentRegion ist eine Live-Messung von dort, wo Sie gerade stehen. Geben Sie
ihm eine Zelle, und es dehnt sich nach außen aus — nach oben, unten, links, rechts
—, bis es auf jeder Seite auf eine vollständig leere Zeile oder Spalte trifft. Es
ist die Code-Variante davon, eine Zelle anzuklicken und Strg + Umschalt + * (oder
einmal Strg + A) zu drücken. Nichts wird zwischengespeichert; es wird in dem
Moment berechnet, in dem Sie fragen.
Sub GrabTheBlock()
Dim ws As Worksheet
Set ws = ActiveSheet
Debug.Print ws.UsedRange.Address ' zwischengespeicherter Umgrenzungsrahmen des Blatts
Debug.Print ws.Range("A1").CurrentRegion.Address ' live ermittelter Block um A1
End Sub
Dieser Unterschied — zwischengespeichert-und-klebrig gegen live-und-lokal — erklärt jede Falle weiter unten.
Die Regel, die den Phantomzeilen-Bug verhindert: UsedRange meldet zu viel
Der Fehlermodus, der die meiste Zeit kostet: Sie schleifen über UsedRange und
verarbeiten weit mehr Zeilen, als Sie Daten haben, weil UsedRange Zellen
mitzählt, die nur Formatierung tragen. Setzen Sie einmal einen Rahmen auf A1000,
löschen Sie den Wert, und A1000 lebt weiterhin innerhalb von UsedRange. Schlimmer
noch: Das Löschen des Inhalts von Zeilen lässt UsedRange nicht schrumpfen —
Excel behält den alten Umgrenzungsrahmen, bis die Arbeitsmappe gespeichert wird
oder Sie einen Reset erzwingen.
' UsedRange kann weit größer sein als Ihre tatsächlichen Daten
Dim r As Range
For Each r In ws.UsedRange.Rows
' ...das kann über Hunderte leere, nur formatierte Zeilen laufen
Next r
Wenn Sie UsedRange nach umfangreichem Bearbeiten verwenden müssen, zwingen Sie
Excel zur Neuberechnung, indem Sie es einmal lesen, oder setzen Sie es ausdrücklich
zurück:
Dim junk As Range
Set junk = ws.UsedRange ' es anzufassen stößt eine Aktualisierung an
Die tiefere Lektion: UsedRange beantwortet „Was hat Excel angefasst?", nicht „Wo
sind meine Daten?". Das sind unterschiedliche Fragen — und nur manchmal dieselbe
Antwort.
Die Regel über Anzahlen gegen Nummern: UsedRange beginnt möglicherweise nicht bei A1
Der zweite klassische Bug. Wenn Ihre Daten bei C5 beginnen, dann beginnt auch
UsedRange bei C5 — nicht bei A1. Sein .Rows.Count ist also die Höhe des
Blocks, nicht die Nummer der letzten Zeile, und .Cells(1, 1) ist C5, nicht A1.
' Daten liegen in C5:F20
ws.UsedRange.Rows.Count ' -> 16 (eine ANZAHL: Zeilen 5..20)
ws.UsedRange.Row ' -> 5 (wo es beginnt)
' Nummer der letzten Zeile = erste Zeile + Anzahl - 1
ws.UsedRange.Row + ws.UsedRange.Rows.Count - 1 ' -> 20 (die tatsächliche letzte Zeile)
UsedRange.Rows.Count als „die letzte Zeile" zu lesen ist nur dann korrekt, wenn
die Daten zufällig bei Zeile 1 beginnen. Verlassen Sie sich nicht auf diesen Zufall
— machen Sie entweder die Row + Count - 1-Rechnung oder nehmen Sie .End(xlUp)
für eine echte Nummer der letzten Zeile.
Die Regel über Zusammenhang: CurrentRegion stoppt an Leerstellen
CurrentRegion greift eine zusammenhängende Insel. Eine einzige vollständig
leere Zeile oder Spalte ist eine Wand, die es nicht überschreitet. Das ist ein
Vorteil, wenn Ihr Blatt eine Tabelle enthält, die von leerem Raum umgeben ist — Sie
erhalten genau diese Tabelle, beginnend an ihrer echten oberen linken Ecke, ohne
Phantomzeilen:
Dim block As Range
Set block = ws.Range("A1").CurrentRegion ' Überschrift + alle zusammenhängenden Daten
Aber es ist eine Falle, wenn Ihre Daten eine absichtliche leere Trennzeile haben
(eine Zwischensummen-Lücke, ein optischer Trenner): CurrentRegion gibt nur das
Stück zurück, das Ihre Startzelle berührt, und übergeht den Rest stillschweigend.
Und die Startzelle muss innerhalb des Blocks liegen — Range("A1").CurrentRegion
gibt, wenn A1 leer ist, nur A1 zurück.
Die Ermessensentscheidung: welches wann
- Eine saubere Tabelle mit Überschrift und ohne interne Leerzeilen →
Range("A1").CurrentRegion. Live, beginnt an der echten oberen linken Ecke, respektiert Lücken, keine Phantomzeilen. Das ist der Standard für „greif meine Tabelle". - „Das ganze Blatt leeren / zurücksetzen / formatieren" →
ws.UsedRange. Das Zuviel-Melden ist harmlos — sogar hilfreich —, wenn Sie löschen oder Formatierung entfernen. - „Wie viele Datenzeilen habe ich?" → weder noch, direkt. Nutzen Sie die
Letzte-Zeile-Erkennung (
.End(xlUp)oder.Find) aus der Anleitung zur letzten Zeile oder machen Sie dieRow + Count - 1-Rechnung aufUsedRange. - Daten mit absichtlichen leeren Trennzeilen → nicht
CurrentRegion(es stoppt an der ersten Lücke). Finden Sie die echte letzte Zeile und bauen Sie den Bereich ausdrücklich.
Kurz gesagt: CurrentRegion zum Lesen einer Tabelle, UsedRange zum Leeren
eines Blatts und die Letzte-Zeile-Erkennung zum Zählen von Zeilen.
Wie ExcelMaster hilft
Den Block zu greifen ist immer ein Mittel zum Zweck — ihn sortieren, entdoppeln, kopieren, zusammenfassen. ExcelMaster nimmt dieses Endziel in einfachem Deutsch entgegen — „räum die ganze Bestelltabelle auf und entferne doppelte Zeilen" — und wählt die Daten auf die robuste Weise aus, sodass Sie nie ein Makro ausliefern, das über 900 leere, formatierte Zeilen läuft oder eine Zeilenanzahl mit einer Zeilennummer verwechselt.
Sie werden CurrentRegion weiterhin in einem geplanten Makro schreiben. Aber für
einmalige „Arbeite auf meiner ganzen Tabelle"-Aufgaben umgeht das Beschreiben der
Operation die gesamte UsedRange-gegen-CurrentRegion-Entscheidung — und ihre zwei
berühmten Bugs.
Häufig gestellte Fragen
Was ist der Unterschied zwischen UsedRange und CurrentRegion in VBA?
UsedRange ist ein zwischengespeicherter Umgrenzungsrahmen auf Blattebene über
jede Zelle, die Excel jemals angefasst hat, einschließlich reiner
Formatierungszellen; er meldet zu viel und schrumpft erst beim Speichern.
CurrentRegion wird live um eine bestimmte Zelle herum berechnet und dehnt sich
aus, bis es auf eine leere Zeile oder Spalte trifft, sodass es einen
zusammenhängenden Block zurückgibt. Nehmen Sie CurrentRegion zum Lesen einer
Tabelle, UsedRange zum Leeren eines Blatts.
Warum ist mein UsedRange größer als meine Daten?
Weil UsedRange Zellen mitzählt, die nur Formatierung haben (Rahmen, Füllungen),
und nicht schrumpft, wenn Sie Werte löschen — Excel behält den alten
Umgrenzungsrahmen, bis die Datei gespeichert wird. Löschen Sie die überzähligen
Zeilen/Spalten vollständig oder nutzen Sie Range("A1").CurrentRegion, um nur die
zusammenhängenden Daten zu erhalten.
Beginnt UsedRange immer bei Zelle A1?
Nein. UsedRange beginnt an der oberen linken Ecke des benutzten Bereichs, sodass
es bei C5 beginnt, wenn Ihre Daten bei C5 beginnen. Deshalb ist
UsedRange.Rows.Count eine Zeilen-Anzahl, nicht die Nummer der letzten Zeile —
berechnen Sie die letzte Zeile als UsedRange.Row + UsedRange.Rows.Count - 1.
Warum übersieht CurrentRegion einen Teil meiner Daten?
CurrentRegion greift nur den zusammenhängenden Block um die Startzelle und stoppt
an jeder vollständig leeren Zeile oder Spalte. Wenn Ihre Daten eine absichtliche
leere Trennzeile haben, gibt CurrentRegion nur das Stück zurück, das Ihre Zelle
berührt. Nutzen Sie die Letzte-Zeile-Erkennung und bauen Sie den Bereich
ausdrücklich, wenn Ihre Daten interne Lücken haben.
Wie wähle ich die ganze Datentabelle in VBA aus?
Bei einer einzelnen sauberen Tabelle greift Range("A1").CurrentRegion.Select die
Überschrift plus alle zusammenhängenden Daten, beginnend an der echten oberen
linken Ecke. Stellen Sie sicher, dass die Startzelle innerhalb der Tabelle liegt —
eine leere Startzelle gibt nur diese eine Zelle zurück.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 30.07.2026.
Verwandte Anleitungen: VBA Letzte Zeile · VBA Offset · VBA Range · VBA For-Schleife
