Kurz gesagt —
Range.NumberFormatist die Anzeigeebene: Es ändert, wie eine gespeicherte Zahl sich liest, und rührt die Zahl selbst nie an.Range("A1").Value = 5.4999mitRange("A1").NumberFormat = "0"zeigt 5 auf dem Bildschirm — aberA1.Valueist immer noch5.4999, undA1 + A1ist10.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, undNumberFormatist 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 —
NumberFormatist 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 derFormat-Funktion (eine Zeichenkette)- Die Sprache der Formatcodes —
#,0, die vier Abschnitte, Währung und Farbe - Die Gebietsschema-Falle —
NumberFormatgegenüberNumberFormatLocal
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.NumberFormatist 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:
0ist eine erzwungene Ziffer,#eine optionale."0.00"zeigt immer zwei Nachkommastellen (5wird zu5.00);"#.##"zeigt bis zu zwei und lässt nachlaufende Nullen weg (5bleibt5).,gruppiert Tausender."#,##0"macht aus1234567die1,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
