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

VBA Column Width & Row Height in Excel — Größe ändern und AutoFit im Code (und die Einheiten, die Sie stolpern lassen)

|

VBA Column Width & Row Height in Excel — Größe ändern und AutoFit im Code (und die Einheiten, die Sie stolpern lassen)

Kurz gesagt — Die Größe ist eine Eigenschaft der ganzen Spalte oder Zeile, und die zwei Dimensionen nutzen unterschiedliche Einheiten: ColumnWidth ist in Zeichen der Normal-Schrift, RowHeight ist in Punkt. ColumnWidth = 10 und RowHeight = 10 sind also in keinem Sinne dieselbe Größe. AutoFit ist die Falle — es läuft nur auf einer ganzen Spalte oder Zeile (Columns("A:C").AutoFit oder rng.EntireColumn.AutoFit) und misst den angezeigten Text, also übergeht es verbundene Zellen still.

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Report")
ws.Columns("A:C").AutoFit                 ' A:C auf ihren breitesten Inhalt anpassen
ws.Columns("D").ColumnWidth = 18          ' 18 Zeichen der Normal-Schrift
ws.Rows(1).RowHeight = 28                 ' 28 Punkt

Größe zu ändern wirkt wie das Einfachste in der Formatierungs-Familie, und meist ist es das auch — bis ein AutoFit nichts tut oder eine Breite, die Sie setzen, nicht zu der Breite passt, die Sie erwartet haben. Beides kommt aus derselben Wurzel, der Idee, auf der diese Anleitung ruht: Sie dimensionieren die ganze Spalte oder Zeile, und Breite und Höhe sprechen in unterschiedlichen Einheiten. Halten Sie das fest, und die schreibgeschützte .Width-Eigenschaft, die AutoFit-Regeln und die Verwirrung „warum blendet sich das nicht aus“ lösen sich alle.

Was Sie lernen

  • Das mentale Modell — Sie dimensionieren die ganze Spalte oder Zeile, in zwei unterschiedlichen Einheiten
  • Die wichtigste Regel — AutoFit braucht eine ganze Spalte oder Zeile und misst die Anzeige
  • ColumnWidth (Zeichen) gegenüber dem schreibgeschützten .Width (Punkt)
  • RowHeight, Textumbruch und wann eine Zeile von selbst wächst
  • Der blinde Fleck von AutoFit — verbundene Zellen
  • Eine Spalte richtig ausblenden, und warum Breite null eine Falle ist

Das mentale Modell: Sie dimensionieren die ganze Spalte oder Zeile, in zwei Einheiten

Breite und Höhe gehören nicht zu einer Zelle — sie gehören zu der Spalte und der Zeile, in der sie sitzt. Sie können sie von einer Zelle aus erreichen, aber der Wert gilt für die ganze Linie:

ws.Range("D5").EntireColumn.ColumnWidth = 18   ' verbreitert die GANZE Spalte D, nicht nur D5
ws.Range("D5").EntireRow.RowHeight = 28        ' erhoeht die GANZE Zeile 5

Die zweite Hälfte des Modells sind die Einheiten, und das ist der Teil, der die Leute stolpern lässt. ColumnWidth wird in Zeichen gemessen — genauer, wie viele 0-Ziffern der Schrift im Normal-Stil in die Spalte passen (der Standard 8.43 bedeutet etwa acht Nullen). RowHeight wird in Punkt gemessen, derselben 1/72-Zoll-Einheit wie die Schriftgröße. Die zwei Zahlen sind nicht vergleichbar, und es gibt keine saubere Umrechnung zwischen ihnen, weil die eine von der Schrift abhängt und die andere nicht. Wenn ein Layout schief aussieht, ist es sehr oft ein Breitenwert, über den man nachgedacht hat, als wäre er Punkt.

Die wichtigste Regel: AutoFit braucht eine ganze Spalte oder Zeile

AutoFit ist der schnellste Weg, auf den Inhalt zu dimensionieren, und es hat eine feste Bedingung: es muss auf einer ganzen Spalte oder einer ganzen Zeile aufgerufen werden, nie auf einem beliebigen Zellbereich.

ws.Columns("A:C").AutoFit          ' OK - ganze Spalten
ws.Rows("1:5").AutoFit             ' OK - ganze Zeilen
ws.Range("A1:C5").EntireColumn.AutoFit   ' OK - zuerst zu ganzen Spalten hochgestuft

ws.Range("A1:C5").AutoFit          ' FALSCH - ein Zellblock ist keine Zeile oder Spalte -> error 1004

Die Lösung ist immer dieselbe: Stufen Sie den Bereich zuerst mit .EntireColumn oder .EntireRow zu ganzen Linien hoch. Die zweite Hälfte der Regel ist subtiler — AutoFit misst, was angezeigt wird, nicht, was gespeichert ist. Es dimensioniert auf den breitesten gezeichneten Text, eine Spalte von Zahlen, die als "0" gezeigt wird, passt sich also auf 5 an, nicht auf das zugrunde liegende 5.4999; und eine Spalte, deren Inhalt hinter einem schmalen NumberFormat verborgen ist, passt sich auf das Format an, nicht auf den Wert.

ColumnWidth gegenüber dem schreibgeschützten Width

Es gibt zwei Breiten-Eigenschaften, und nur eine davon ist setzbar — eine häufige Quelle der Verwirrung „warum kompiliert das nicht“:

  • ColumnWidth ist setzbar, gemessen in Zeichen. Das ist die, der Sie zuweisen.
  • .Width ist schreibgeschützt, gemessen in Punkt. Es sagt Ihnen die gezeichnete Breite eines Bereichs auf dem Bildschirm, aber Sie können ihm nichts zuweisen — Columns("A").Width = 100 scheitert.
ws.Columns("A").ColumnWidth = 20          ' setzen - Zeichen
Debug.Print ws.Columns("A").Width          ' lesen - Punkt (eine andere Zahl)

Wenn Sie eine Spalte auf eine bestimmte Zahl von Punkt oder Pixel dimensionieren müssen, gibt es keinen direkten Setter; Sie setzen ColumnWidth in Zeichen, lesen dann .Width zurück und justieren in einer kurzen Schleife, bis die Punkte passen. Es ist bewusst fummelig — Excels Spaltenbreite war immer ein Zeichenmaß, und .Width wurde nachträglich als schreibgeschützte Bequemlichkeit angebaut.

RowHeight und Textumbruch

RowHeight in Punkt ist unkompliziert, mit einem Verhalten, das zu wissen sich lohnt: Wenn eine Zelle Textumbruch an hat, wächst Excel die Zeilenhöhe automatisch, um die umbrochenen Zeilen zu fassen — außer Sie haben eine ausdrückliche RowHeight gesetzt, die sie fixiert und den Text abschneiden kann:

ws.Range("B2").WrapText = True     ' langen Text auf mehrere Zeilen umbrechen lassen
ws.Rows(2).EntireRow.AutoFit       ' die Zeile wachsen lassen, um den umbrochenen Text zu fassen
' Setzen Sie danach NICHT Rows(2).RowHeight = 15 - das fixiert sie und schneidet den Umbruch ab

Die Faustregel: Wenn eine Zeile umbrochenen Inhalt fassen soll, schalten Sie WrapText ein und lassen AutoFit (oder Excels automatisches Wachsen) sie dimensionieren. Danach eine feste RowHeight zu setzen überschreibt das und ist der Weg, auf dem umbrochener Text abgeschnitten endet.

Der blinde Fleck von AutoFit: verbundene Zellen

Hier ist der, der die meiste Zeit verschwendet, und er führt direkt zurück zu VBA Merge Cells: AutoFit ignoriert verbundene Zellen. Eine Zeile, deren einziger hoher Inhalt eine verbundene, umbrochene Zelle ist, wächst nicht, um sie zu fassen — AutoFit misst unverbundene Zellen und sieht nichts, was die zusätzliche Höhe braucht, also bleibt der Text abgeschnitten. Das ist ein weiterer Grund, warum verbundene Zellen im Code Ärger machen: Sie vereiteln genau den Befehl, nach dem Sie greifen würden, um sie lesbar zu machen. Wenn Sie einen verbundenen, umbrochenen Block behalten müssen, setzen Sie seine RowHeight ausdrücklich (messen Sie den Text und berechnen Sie die Höhe selbst); besser, meiden Sie die Verbindung und nehmen Sie Center Across Selection, das AutoFit sehen kann.

Eine Spalte ausblenden: nicht Breite null

Eine verlockende Abkürzung, um eine Spalte auszublenden, ist, ihre Breite auf null zu setzen. Widerstehen Sie — nehmen Sie die .Hidden-Eigenschaft, behandelt in VBA Hide Columns:

ws.Columns("B").Hidden = True      ' der richtige Weg - umkehrbar, offensichtlich, stellt die alte Breite wieder her
ws.Columns("B").ColumnWidth = 0    ' die Falle - "versteckt", aber die urspruengliche Breite ist verloren

Hidden = True merkt sich die echte Breite der Spalte und stellt sie wieder her, wenn Sie sie einblenden. ColumnWidth = 0 wirft diese Breite weg — sie später einzublenden heißt raten, wie sie einmal war — und eine Spalte ohne Breite ist leicht zu übersehen, wenn sich später jemand fragt, warum Daten zu fehlen scheinen. Breite ist zum Dimensionieren; nehmen Sie Hidden für die Sichtbarkeit.

Wie ExcelMaster hilft

Größe ändern verbirgt mehr Kanten, als es scheint: zwei unterschiedliche Einheiten für Breite und Höhe, ein AutoFit, das auf einem Zellbereich einen Fehler wirft und verbundene Zellen still überspringt, ein .Width, das Sie lesen, aber nicht setzen können, und ein „Ausblenden“ über Breite null, das die ursprüngliche Größe verliert. Jede scheitert leise — abgeschnittener Text, eine unerwartete Zahl oder eine Spalte, die nicht zurückkommt.

ExcelMaster lässt Sie sagen, was das Layout tun soll. Bitten Sie es, „die Spalten A bis C automatisch anzupassen und Zeile 1 etwas Luft zu geben“, und es stuft den Bereich zu EntireColumn hoch, bevor es AutoFit aufruft, setzt RowHeight in Punkt, schaltet WrapText ein, wo Text fließen muss, und blendet Spalten mit .Hidden aus statt über eine Breite von null. Sie behalten die Arbeitsmappe und den Code; Sie sparen sich das Layout, das abgeschnitten herauskam, weil AutoFit die verbundene Zelle nie sah.

Häufig gestellte Fragen

Wie setze ich Spaltenbreite und Zeilenhöhe in Excel VBA?

Weisen Sie ColumnWidth und RowHeight auf ganzen Spalten und Zeilen zu: Columns("A").ColumnWidth = 20 und Rows(1).RowHeight = 28. Denken Sie daran, dass die Einheiten sich unterscheiden — ColumnWidth ist in Zeichen der Normal-Schrift, RowHeight ist in Punkt —, dieselbe Zahl bedeutet also für jede unterschiedliche Größen. Von einer Zelle aus nehmen Sie Range("A1").EntireColumn.ColumnWidth, um die ganze Spalte zu dimensionieren.

Wie führe ich AutoFit für Spalten in VBA aus?

Rufen Sie AutoFit auf einer ganzen Spalte oder Zeile auf: Columns("A:C").AutoFit oder Range("A1:C5").EntireColumn.AutoFit. AutoFit auf einem schlichten Zellbereich wie Range("A1:C5").AutoFit aufzurufen wirft error 1004, weil AutoFit nur auf ganzen Spalten oder Zeilen funktioniert. Stufen Sie den Bereich zuerst mit .EntireColumn oder .EntireRow hoch.

Warum funktioniert AutoFit bei meinen verbundenen Zellen nicht?

AutoFit ignoriert verbundene Zellen — es misst nur unverbundenen Inhalt, eine Zeile, deren hoher Inhalt in einer verbundenen, umbrochenen Zelle sitzt, wächst also nicht, um ihn zu fassen, und der Text bleibt abgeschnitten. Setzen Sie die RowHeight für diese Zeile ausdrücklich, oder meiden Sie die Verbindung und nehmen Sie Center Across Selection, das AutoFit messen kann.

Was ist der Unterschied zwischen ColumnWidth und Width in VBA?

ColumnWidth ist setzbar und wird in Zeichen der Normal-Schrift gemessen — das ist die Eigenschaft, der Sie zuweisen. .Width ist schreibgeschützt und wird in Punkt gemessen; es meldet die gezeichnete Breite, aber Sie können es nicht setzen. Um auf eine bestimmte Zahl von Punkt zu dimensionieren, setzen Sie ColumnWidth in Zeichen, lesen dann .Width zurück und justieren, bis es passt.

Sollte ich die Spaltenbreite auf null setzen, um eine Spalte in VBA auszublenden?

Nein. Nehmen Sie Columns("B").Hidden = True, das die Spalte umkehrbar ausblendet und ihre ursprüngliche Breite wiederherstellt, wenn Sie sie einblenden. ColumnWidth = 0 zu setzen verwirft die ursprüngliche Breite, macht die Spalte leicht übersehbar und zwingt Sie, ihre Größe später zu raten. Behalten Sie die Breite zum Dimensionieren und nehmen Sie Hidden für die Sichtbarkeit.

Getestet in

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

Verwandte Anleitungen: VBA Hide Columns · VBA Merge Cells · VBA Borders · VBA Range · VBA With