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

VBA Resize in Excel — Einen Bereich vom Anker aus umformen (und warum es eine Anzahl ist, kein Delta)

|

VBA Resize in Excel — Einen Bereich vom Anker aus umformen (und warum es eine Anzahl ist, kein Delta)

TL;DRResize(rows, columns) hält den oberen linken Anker eines Bereichs fest und zeichnet das Rechteck so neu, dass es genau so viele Zeilen hoch und Spalten breit ist. Es bewegt den Bezug nicht (das ist Offset) und es wählt nichts aus — es gibt einen neuen Bereich zurück an derselben Ecke. Der Haken: die Argumente sind eine absolute, 1-basierte Anzahl der Endgröße, kein Delta. Range("A1").Resize(5, 3) ist A1:C5 (5 Zeilen, 3 Spalten insgesamt); Resize(0, ...) löst Fehler 1004 aus. Lassen Sie ein Argument weg, um diese Dimension unverändert zu lassen.

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Data")
' Anker bleibt bei A1; das Rechteck wird auf 5 Zeilen mal 3 Spalten neu gezeichnet.
ws.Range("A1").Resize(5, 3).Select        ' waehlt A1:C5 aus
' Die Spaltenanzahl weglassen, um die Breite zu behalten und nur die Hoehe zu vergroessern:
ws.Range("A1:D1").Resize(10).Select       ' A1:D10 (Breite bleibt 4)

Resize ist die Art, wie ein Makro aufhört, "A1:D100" fest zu verdrahten, und anfängt, den Bezug an das anzupassen, was die Daten tatsächlich sind. Es ist eine kleine Methode mit einem großen Missverständnis im Schlepptau: Leute lesen Resize(5) als „fünf Zeilen hinzufügen“, obwohl es „sei fünf Zeilen“ bedeutet. Diese Anleitung ruht auf der Idee, aus der jede spätere Regel folgt: Resize fixiert den Anker und nennt die Endgröße. Verinnerlichen Sie das, und die Regel Anzahl-nicht-Delta, die weggelassenen Argumente und das Kopfzeilen-Weglass-Idiom hören alle auf, Überraschungen zu sein.

Was Sie lernen

  • Das mentale Modell — Resize fixiert den oberen linken Anker und zeichnet das Rechteck neu
  • Die wichtigste Regel — die Argumente sind eine Gesamtanzahl, kein hinzuzufügendes Delta
  • Ein Argument weglassen, um eine Dimension unverändert zu lassen
  • Warum der Anker immer oben links ist, auch bei einem mehrzelligen Bereich
  • Die beiden Muster, die sich lohnen — eine Kopfzeile entfernen und ein Array in einen passenden Block schreiben
  • Wo Resize neben Offset und CurrentRegion steht

Das mentale Modell: Resize fixiert den Anker und zeichnet das Rechteck neu

Jeder Bereich hat eine obere linke Zelle — seinen Anker. Resize lässt diesen Anker genau dort, wo er ist, und zeichnet das Rechteck auf die Größe neu, die Sie angeben:

ws.Range("B2").Resize(3, 4)   ' Anker B2 bleibt; neuer Bereich ist B2:E4 (3 Zeilen, 4 Spalten)

Stellen Sie sich vor, Sie greifen den unteren rechten Anfasser einer Auswahl und ziehen: die obere linke Ecke ist fixiert, und die Größe ändert sich unter Ihrer Hand. Das ist die ganze Methode. Zwei Dinge, die es nicht ist: Es ist nicht Offset, das den ganzen Bezug an eine neue Position verschiebt, ohne seine Größe zu ändern; und es ist keine Auswahl und keine Aktion — Resize gibt einen Bereich zurück, und Sie müssen das Ergebnis verwenden (.Value =, .Select, Set r = ...). Ein Resize-Aufruf, der allein auf einer Zeile steht, tut überhaupt nichts.

Die wichtigste Regel: es ist eine Anzahl, kein Delta

Das ist das Missverständnis, das falsch dimensionierte Bereiche erzeugt. Resize(rows, columns) ist die absolute, 1-basierte Gesamtzahl des Endrechtecks — kein Betrag, der zur aktuellen Größe hinzukommt:

ws.Range("A1").Resize(5, 3)   ' A1:C5  -> 5 Zeilen und 3 Spalten INSGESAMT, nicht "5 weitere Zeilen"
ws.Range("A1").Resize(1, 1)   ' A1     -> eine einzelne Zelle (1 Zeile, 1 Spalte)

Resize(1) ist also eine Zeile, nicht „um eins verkleinern“. Und weil ein Bereich keine Größe von null oder negativ haben kann, löst Resize(0, 3) oder Resize(-1, 3) den Laufzeitfehler 1004 aus. Wenn Sie eine Zeilenanzahl berechnen, sichern Sie sie ab: ein Datenblock mit nur einer Kopfzeile ergibt Rows.Count - 1 = 0, und das an Resize zu geben stürzt ab. Prüfen Sie den leeren Fall, bevor Sie die Größe ändern.

Ein Argument weglassen, um eine Dimension unverändert zu lassen

Beide Argumente sind optional, und ein weggelassenes bedeutet „diese Dimension unverändert lassen“. Das ist der häufigste Praxiseinsatz — eine Seite festhalten, die andere ändern:

ws.Range("A1:D1").Resize(10)        ' Zeilen -> 10, Spalten bleiben bei 4  => A1:D10
ws.Range("A1:D1").Resize(, 6)       ' Spalten -> 6, Zeilen bleiben bei 1   => A1:F1

Beachten Sie das blanke Komma in Resize(, 6) — so überspringen Sie das erste Argument und setzen nur das zweite. Resize(10) als „10 Zeilen, gleiche Breite“ zu lesen ist genau richtig, und deshalb ist es ein Einzeiler, eine Kopfzeile zu einer vollen Tabelle wachsen zu lassen.

Resize rechnet vom Anker aus und ignoriert die bestehende Größe bis auf diese Ecke. Rufen Sie es auf einem mehrzelligen Bereich auf, und die alten Maße sind weg:

ws.Range("B2:D10").Resize(1, 1)   ' schrumpft auf B2 - nur der Anker

Das überrascht Leute, die erwarten, dass Resize ihren bestehenden Block relativ zu seiner aktuellen Größe anpasst. Tut es nicht — es gibt die Größe von oben links neu an. Wenn Sie einen Bereich absichtlich von der ersten Zelle aus umformen wollen, passiert genau das schon; wenn Sie es versehentlich auf einem großen Bereich aufgerufen haben, haben Sie die Größe gerade weggeworfen. Wenn Sie den Anker ausdrücklich brauchen, gibt Ihnen rng.Cells(1, 1) (siehe VBA Cells) die obere linke Zelle, von der aus Sie die Größe ändern.

Die beiden Muster, die sich lohnen

Fast jedes nützliche Resize ist eines dieser beiden. Erstens, eine Kopfzeile entfernen — kombinieren Sie es mit Offset, denn Offset allein behält dieselbe Höhe und würde eine Zeile über das untere Ende hinausragen:

Dim tbl As Range: Set tbl = ws.Range("A1").CurrentRegion   ' ganzer Block inkl. Kopfzeile
Dim body As Range
' Nach unten ueber die Kopfzeile hinaus, DANN die Hoehe um eins verkleinern, damit nichts uebersteht:
Set body = tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, tbl.Columns.Count)

Offset bewegt, Resize formt um — zusammen schneiden sie den Datenrumpf aus einem Block heraus. Zweitens, ein Array in einen Block schreiben, der dazu passt. Ein Array einer einzelnen, nicht in der Größe angepassten Zelle zuzuweisen füllt nur diese Zelle; passen Sie den Anker zuerst an die Maße des Arrays an:

Dim data(1 To 100, 1 To 3) As Variant
' ... data fuellen ...
ws.Range("A1").Resize(UBound(data, 1), UBound(data, 2)).Value = data   ' fuellt A1:C100 in einem Zug

Diese eine Zuweisung ist um Größenordnungen schneller als Zelle für Zelle zu schleifen, und Resize ist es, was das Ziel genau zu den Daten passen lässt.

Offset bewegt, Resize formt um

Halten Sie das Paar auseinander, und dynamische Bereiche hören auf, fummelig zu sein: Offset ändert, wo ein Bezug ist; Resize ändert, wie groß er ist. Sie positionieren mit dem einen neu und formen mit dem anderen um, und die meiste echte Arbeit nutzt beide — einen Anker finden, über das versetzen, was Sie überspringen wollen, und auf das zuschneiden, was übrig bleibt. Kombinieren Sie das mit CurrentRegion, um den Block überhaupt erst zu erkennen, und Sie haben den ganzen Werkzeugkasten, um auf Daten zu verweisen, deren Größe Sie nicht im Voraus kennen — ohne je eine fest verdrahtete Adresse zu tippen, die an dem Tag bricht, an dem die Daten um eine Zeile wachsen. Die Form lebt in den Daten; Resize passt den Bezug nur daran an.

Wie ExcelMaster hilft

Resize verbirgt eine Handvoll leiser Fallen: das Missverstehen von Anzahl gegen Delta, das einen falsch dimensionierten Block erzeugt, ein error 1004, wenn eine berechnete Zeilenanzahl auf null fällt, ein Anker, der Ihre bestehende Größe verwirft, und die Array-Zuweisung, die eine Zelle füllt, weil das Ziel nie in der Größe angepasst wurde. Keine davon meldet sich mit einer hilfreichen Nachricht in dem Moment, in dem Sie sie machen.

ExcelMaster lässt Sie stattdessen das Ergebnis beschreiben. Sagen Sie „schreibe diese Tabelle ab A1 auf das Blatt“ oder „wähle die Daten ohne die Kopfzeile aus“, und es passt den Anker an die genauen Maße des Arrays an oder versetzt über die Kopfzeile hinaus und verkleinert die Höhe um eins — und sichert den Fall des leeren Blocks ab, damit nichts abstürzt. Sie behalten die Arbeitsmappe und den Code; Sie sparen sich den Debugging-Durchgang, in dem nur die erste Zelle gefüllt war.

Häufig gestellte Fragen

Was macht Resize in Excel VBA?

Resize(rows, columns) gibt einen neuen Bereich zurück, der die obere linke Zelle (den Anker) des ursprünglichen Bereichs behält und genau rows hoch und columns breit ist. Es bewegt den Bezug nicht und es wählt von sich aus nichts aus — Sie verwenden den zurückgegebenen Bereich, zum Beispiel Range("A1").Resize(10, 3).Value = data.

Ist Resize ein Delta oder eine absolute Größe?

Es ist eine absolute, 1-basierte Anzahl der Endgröße, kein hinzuzufügender Betrag. Range("A1").Resize(5, 3) ist A1:C5 (fünf Zeilen und drei Spalten insgesamt), und Resize(1, 1) ist eine einzelne Zelle. Weil ein Bereich nicht leer sein kann, löst Resize(0, ...) oder eine negative Anzahl den Laufzeitfehler 1004 aus.

Was ist der Unterschied zwischen Resize und Offset in VBA?

Offset bewegt einen Bereich an eine neue Position, ohne seine Größe zu ändern; Resize ändert die Größe, während der obere linke Anker fixiert bleibt. Sie ergänzen sich und werden oft zusammen genutzt, etwa rng.Offset(1, 0).Resize(rng.Rows.Count - 1, rng.Columns.Count), um eine Kopfzeile zu überspringen und dann die Höhe zu kappen, damit das Ergebnis nicht übersteht.

Wie schreibe ich ein Array mit Resize in einen Bereich?

Passen Sie die Ankerzelle an die Maße des Arrays an und weisen Sie dann in einer Anweisung zu: Range("A1").Resize(UBound(data, 1), UBound(data, 2)).Value = data. Ein Array einer einzelnen, nicht angepassten Zelle zuzuweisen füllt nur diese Zelle, das Resize ist also das, was den ganzen Block die Daten empfangen lässt, und es ist weit schneller als eine Zelle-für-Zelle-Schleife.

Wie ändere ich nur die Zeilenanzahl und behalte die Spalten?

Lassen Sie das zweite Argument weg: Range("A1:D1").Resize(10) setzt die Höhe auf 10 Zeilen und lässt die Breite bei 4, ergibt A1:D10. Um nur die Spalten zu ändern, überspringen Sie das erste Argument mit einem blanken Komma: Range("A1:D1").Resize(, 6) ergibt A1:F1.

Getestet in

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

Verwandte Anleitungen: VBA Offset · VBA CurrentRegion · VBA Cells · VBA Range · VBA For-Schleife