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

VBA NumberFormat in Excel — die Anzeige einer Zahl ändern, ohne ihren Wert zu ändern

|

VBA NumberFormat in Excel — die Anzeige einer Zahl ändern, ohne ihren Wert zu ändern

Kurz gesagtRange.NumberFormat ist die Anzeigeebene: Es ändert, wie eine gespeicherte Zahl sich liest, und rührt die Zahl selbst nie an. Range("A1").Value = 5.4999 mit Range("A1").NumberFormat = "0" zeigt 5 auf dem Bildschirm — aber A1.Value ist immer noch 5.4999, und A1 + A1 ist 10.9998. NumberFormat ist kein Runden. Das ist die Ebene, auf der „Aussehen gegenüber Wert“ Sie wirklich Geld kostet, denn ein Datum ist nur eine Seriennummer im Kostüm, und NumberFormat ist das Kostüm — nicht die Zahl.

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Report")
ws.Range("A1").Value = 5.4999
ws.Range("A1").NumberFormat = "0"           ' zeigt 5...
Debug.Print ws.Range("A1").Value            ' ...aber der Wert ist immer noch 5.4999

Von den drei Formatierungsebenen — Font für den Text, Interior für die Füllung und NumberFormat für die Anzeige — ist dies die, die die Leute täuscht, weil die Verkleidung überzeugend ist. Eine rote Schrift bringt niemanden auf den Gedanken, der Wert habe sich geändert. Eine Zelle, die 5 zeigt, sehr wohl. Diese Anleitung dreht sich um diese eine Tatsache: NumberFormat ändert, was Sie sehen, nie, was gespeichert ist, und sobald Sie das halten, ergeben Datumsangaben, Währung, Prozentsätze und der klassische „meine Summen gehen nicht auf“-Bug alle einen Sinn.

Was Sie lernen

  • Das mentale Modell — NumberFormat ist die Anzeigeebene, und Anzeige ist nicht Wert
  • Die wichtigste Regel — es ist kein Runden, und die gespeicherte Zahl bleibt unverändert
  • Warum ein Datum eine Seriennummer im Kostüm ist
  • NumberFormat (die Zelleigenschaft) gegenüber der Format-Funktion (eine Zeichenkette)
  • Die Sprache der Formatcodes — #, 0, die vier Abschnitte, Währung und Farbe
  • Die Gebietsschema-Falle — NumberFormat gegenüber NumberFormatLocal

Das mentale Modell: NumberFormat ist die Anzeigeebene

Jede Zelle speichert einen Wert und, getrennt davon, eine Regel, wie dieser Wert gezeichnet wird. NumberFormat ist diese Regel. Sie auf "0.00", "$#,##0", "yyyy-mm-dd" oder "0%" zu setzen ändert die Darstellung — die Zeichen, die Excel malt —, während die zugrunde liegende Zahl unberührt in Range.Value sitzt. Denken Sie sich die Zelle als Halter einer Zahl und NumberFormat als Linse, die Sie davor setzen. Wechseln Sie die Linse, ändert sich die Sicht; die Zahl dahinter bewegt sich nicht.

Diese Trennung ist das ganze Thema. Sie ist der Grund, warum Sie dieselbe 0.5 als 50%, 0.50 oder 1/2 zeigen können, ohne je den Wert zu ändern, den Formeln nutzen — und warum das Verbergen von Nachkommastellen für die Anzeige sie nicht verschwinden lässt.

Die wichtigste Regel: es ist kein Runden

Sagen Sie es einmal und vergessen Sie es nie: NumberFormat rundet den gespeicherten Wert nicht. Es rundet das Bild.

ws.Range("A1").Value = 5.4999
ws.Range("A2").Value = 5.4999
ws.Range("A1:A2").NumberFormat = "0"        ' beide zeigen 5
ws.Range("A3").Formula = "=A1+A2"           ' zeigt 11? Nein - es zeigt 10.9998, auf die Anzeige gerundet...
' Die echte Summe ist 10.9998. Die Formatierung verbarg die Nachkommastellen; sie entfernte sie nicht.

Das ist der mit Abstand häufigste NumberFormat-Bug: eine Spalte auf "0" formatieren, um sie „aufzuräumen“, und dann zusehen, wie eine Summe um eins danebenliegt, weil jede Zelle noch Nachkommastellen trägt, die das Auge nicht sieht. Wenn Sie den Wert selbst wirklich 5 brauchen, müssen Sie den Wert ändern, nicht das Format:

ws.Range("A1").Value = WorksheetFunction.Round(ws.Range("A1").Value, 0)   ' jetzt ist er wirklich 5

Faustregel: formatieren, wenn es nur richtig aussehen muss; Round, wenn die Zahl richtig sein muss. Berichte, die auf den Cent aufgehen müssen, runden die Werte; Dashboards, die sich nur sauber lesen sollen, formatieren die Anzeige. Die zwei zu verwechseln ist der Weg, auf dem Tabellen am Ende „um einen Rundungsfehler daneben“ liegen.

Ein Datum ist eine Seriennummer im Kostüm

Datumsangaben machen die Trennung von Aussehen und Wert anschaulich. Excel speichert ein Datum als Seriennummer — Tage seit 1899-12-30 — und ein Datum „ist“ nur wegen seines NumberFormat ein Datum:

ws.Range("B1").Value = 45900                 ' nur eine Zahl
ws.Range("B1").NumberFormat = "yyyy-mm-dd"   ' jetzt LIEST es sich als Datum - die Zahl ist immer noch 45900

Zwei Folgen ergeben sich direkt daraus. Erstens: Um ein echtes, rechenbares Datum zu bekommen, müssen Sie einen echten Datumswert in die Zelle legen (ws.Range("B1").Value = DateSerial(2025, 9, 15)) und es dann formatieren — bloßes Formatieren auf dem falschen Wert zeigt ein falsches Datum. Zweitens: "yyyy-mm-dd" auf eine Text-Zeichenkette wie "2025-09-15" anzuwenden tut nichts Nützliches — Text hat keine Seriennummer dahinter, es gibt also keine Zahl zum Verkleiden. Kommen Datumsangaben als Text an, wandeln Sie sie um (CDate, oder siehe VBA CStr für das umgekehrte Problem), bevor Sie formatieren. Das Kostüm funktioniert nur über einer echten Zahl.

NumberFormat gegenüber der Format-Funktion

Es gibt in VBA zwei Dinge mit „format“ im Namen, und sie zu verwechseln ist eine echte Fehlerquelle. Sie sind in einem wichtigen Punkt Gegensätze:

  • Range.NumberFormat ist eine Eigenschaft der Zelle. Es setzt eine dauerhafte Anzeigeregel und lässt die zugrunde liegende Zahl voll intakt und bearbeitbar. Das ist es, was Sie auf einem Arbeitsblatt wollen.
  • Format(value, "pattern") ist eine Funktion, die einen String zurückgibt. Sie wird in VBA Format behandelt und dient dem Bau von Text — einer Meldung, einem Dateinamen, einer zusammengesetzten Beschriftung — nicht der Formatierung einer Zelle.

Die Falle ist, Format zu nutzen, um eine „formatierte Zahl“ in eine Zelle zu legen:

ws.Range("C1").Value = Format(1234.5, "$#,##0.00")   ' schreibt die ZEICHENKETTE "$1,234.50"
' C1 ist jetzt Text. Sie koennen es nicht summieren, numerisch sortieren oder in ein Diagramm bringen.

Diese Zelle sieht formatiert aus, hält aber jetzt Text, und ihre Zahl ist weg. Die richtige Fassung behält die Zahl und setzt die Anzeigeregel:

ws.Range("C1").Value = 1234.5
ws.Range("C1").NumberFormat = "$#,##0.00"            ' zeigt $1,234.50, immer noch eine echte Zahl

Die Regel: NumberFormat für Zellen, Format für Zeichenketten. Wenn das Ergebnis eine Zahl bleiben muss, leiten Sie es nie durch Format.

Die Sprache der Formatcodes

Formatcodes sind eine kleine Sprache, und vier Regeln lesen fast alle von ihnen:

  • 0 ist eine erzwungene Ziffer, # eine optionale. "0.00" zeigt immer zwei Nachkommastellen (5 wird zu 5.00); "#.##" zeigt bis zu zwei und lässt nachlaufende Nullen weg (5 bleibt 5).
  • , gruppiert Tausender. "#,##0" macht aus 1234567 die 1,234,567.
  • Literale Symbole gehen durch. $, %, Leerzeichen und Text in Anführungszeichen erscheinen wie geschrieben — "$#,##0.00", "0%" (was für die Anzeige auch mit 100 multipliziert), "0.0 kg".
  • Semikolons teilen ihn in Abschnitte: positive;negative;zero;text. Das ist der mächtige:
' Positiv schwarz, negativ rot in Klammern, null als Strich, Text in Anfuehrungszeichen literal gezeigt.
ws.Range("D2:D100").NumberFormat = "#,##0.00;[Red](#,##0.00);\-;@"

[Red] (und andere Farbnamen in eckigen Klammern) setzt die Anzeigefarbe pro Abschnitt, und @ ist der Text-Platzhalter. Sie brauchen selten alle vier Abschnitte, aber zu wissen, dass es sie gibt, lässt Sie jede Formatzeichenkette lesen, die Ihnen begegnet. Für Datumsangaben sind die Zeichen d/m/y und h/m/s"yyyy-mm-dd hh:mm" — mit der Eigenart, dass m nach y oder d Monat bedeutet und nach h Minute.

Die Gebietsschema-Falle: NumberFormat gegenüber NumberFormatLocal

Die letzte Falle beißt bei geteilten Arbeitsmappen. NumberFormat nutzt immer US-englische Formatcodes — , für Tausender, . für das Dezimalzeichen, m/d/y für Datumsangaben — egal, welche Regionseinstellungen der Nutzer hat. NumberFormatLocal nutzt die lokalen Symbole des Nutzers (im Deutschen gruppiert . die Tausender und , ist das Dezimalzeichen).

ws.Range("E1").NumberFormat = "#,##0.00"        ' portabel: gleiches Ergebnis auf jeder Maschine
ws.Range("E2").NumberFormatLocal = "#.##0,00"   ' Codes im deutschen Stil - nur auf einem deutschen Gebietsschema richtig

Schreiben Sie Ihre Makros gegen NumberFormat mit US-Codes, und sie verhalten sich überall identisch. Greifen Sie nur zu NumberFormatLocal, wenn Sie bewusst lesen oder abgleichen, was ein Nutzer in seinem eigenen Gebietsschema getippt hat. Codes im lokalen Stil in NumberFormat zu füttern (oder umgekehrt) ist ein subtiler Bug, der auf Ihrer Maschine funktioniert und auf der eines Kollegen bricht.

Wie ExcelMaster hilft

NumberFormat verbirgt mehr Entscheidungen als jede andere Formatierungsebene: ob Sie den Wert oder nur die Anzeige runden müssen, ob eine Datumszelle eine echte Seriennummer oder eine Textzeichenkette hält, ob eine „formatierte“ Zelle heimlich Text aus Format ist und welches von NumberFormat oder NumberFormatLocal den Code portabel hält. Jede falsche Abzweigung liefert eine plausibel aussehende Zelle mit einer kaputten Zahl dahinter.

ExcelMaster lässt Sie sagen, wie die Zahlen aussehen sollen. Bitten Sie es „zeige Spalte D als Währung mit roten negativen Werten“ oder „lass die Datumsangaben als 2025-09-15 lesen“, und es setzt NumberFormat auf die Zelle — behält den Wert als echte, rechenbare Zahl —, rundet mit Round, wenn die Summe tatsächlich sich ändern muss, und nutzt portable US-Formatcodes. Sie behalten die Arbeitsmappe und den Code; Sie sparen sich den Bericht, der falsch aufging, weil die Nachkommastellen nur verborgen waren, nicht weg.

Häufig gestellte Fragen

Ändert NumberFormat den tatsächlichen Wert einer Zelle in VBA?

Nein. Range.NumberFormat ändert nur, wie die gespeicherte Zahl angezeigt wird. Eine Zelle, die 5.4999 hält und als "0" formatiert ist, zeigt 5, enthält aber weiterhin 5.4999, und Formeln nutzen den vollen Wert — Summen können also „um eins daneben“ wirken. Um den Wert selbst zu ändern, nutzen Sie WorksheetFunction.Round(value, digits) und weisen ihn zurück; bloßes Formatieren rundet die gespeicherte Zahl nie.

Wie formatiere ich eine Zelle in VBA als Währung oder Datum?

Setzen Sie den Wert, dann das Format. Für Währung Range("A1").Value = 1234.5, dann Range("A1").NumberFormat = "$#,##0.00". Für ein Datum Range("B1").Value = DateSerial(2025, 9, 15), dann Range("B1").NumberFormat = "yyyy-mm-dd". Das Format allein auf eine Textzeichenkette zu setzen tut nichts, weil es keine zugrunde liegende Zahl zum Anzeigen gibt.

Was ist der Unterschied zwischen NumberFormat und der Format-Funktion?

Range.NumberFormat ist eine Zelleigenschaft, die eine Anzeigeregel setzt und den Wert als echte Zahl behält. Format(value, "pattern") ist eine Funktion, die einen String zurückgibt. Nutzen Sie NumberFormat auf Arbeitsblattzellen; nutzen Sie Format, um Text für Meldungen, Dateinamen oder Beschriftungen zu bauen. Format(...) in eine Zelle zu schreiben macht sie zu Text, den Sie nicht mehr summieren oder in ein Diagramm bringen können.

Warum kommen meine Summen falsch heraus, nachdem ich die Zahlen formatiert habe?

Weil NumberFormat Nachkommastellen verbirgt, ohne sie zu entfernen. Eine Spalte auf "0" zu formatieren zeigt ganze Zahlen, aber jede Zelle speichert weiterhin ihre Nachkommastellen, die echte Summe schließt sie also ein und kann von der Summe der angezeigten Zahlen abweichen. Wenn die Summe zu dem passen muss, was gezeigt wird, runden Sie die Werte mit WorksheetFunction.Round, statt sie nur zu formatieren.

Was ist der Unterschied zwischen NumberFormat und NumberFormatLocal?

NumberFormat nutzt auf jeder Maschine US-englische Formatcodes (Komma für Tausender, Punkt für das Dezimalzeichen), es ist also portabel. NumberFormatLocal nutzt die regionalen Symbole des Nutzers, die sich je nach Gebietsschema unterscheiden. Schreiben Sie Makros gegen NumberFormat für überall gleiches Verhalten und nutzen Sie NumberFormatLocal nur, wenn Sie bewusst abgleichen, was ein Nutzer in seinen eigenen Einstellungen sieht.

Getestet in

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

Verwandte Anleitungen: VBA Font · VBA Zellfarbe · VBA Format · VBA CStr · VBA Range