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

VBA UsedRange gegen CurrentRegion in Excel — Den ganzen Datenblock greifen (und welchem Sie trauen sollten)

|

VBA UsedRange gegen CurrentRegion in Excel — Den ganzen Datenblock greifen (und welchem Sie trauen sollten)

TL;DR — Beide greifen „das ganze Rechteck", aber sie beantworten unterschiedliche Fragen. Worksheet.UsedRange ist 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.CurrentRegion ist der zusammenhängende Block um eine einzelne Zelle, live berechnet (dasselbe, was Strg + Umschalt + * auswählt), und er stoppt an der ersten vollständig leeren Zeile oder Spalte. Für eine einzelne saubere Tabelle ist Range("A1").CurrentRegion die verlässliche Wahl. Reservieren Sie UsedRange für „das ganze Blatt leeren", und lesen Sie UsedRange.Rows.Count niemals, 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 UsedRange zu viel meldet und sich weigert zu schrumpfen
  • Warum UsedRange möglicherweise nicht bei A1 beginnt — der Off-by-Count-Bug
  • Warum CurrentRegion an 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 LeerzeilenRange("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 die Row + Count - 1-Rechnung auf UsedRange.
  • 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