Getestet mit: Excel 365 v2509 · Excel 2021 · Excel 2019 · zuletzt geprüft am 10.06.2026
Kurzfassung — Format nimmt einen Wert und einen Formatcode und gibt dir eine Zeichenkette zurück, die so aussieht, wie du es verlangt hast. Großartig für Dateinamen, Meldungen und Berichtsbeschriftungen — und eine stille Bug-Fabrik, sobald du das Ergebnis in eine Datenzelle schreibst, denn diese Zelle enthält dann Text, keine Zahl und kein Datum.
Sub FormatDemo()
Debug.Print Format(1234.5, "#,##0.00") ' 1.234,50
Debug.Print Format(0.75, "0.0%") ' 75,0%
Debug.Print Format(Now, "yyyy-mm-dd") ' 2026-06-10
Debug.Print Format(Now, "dddd, d. mmmm") ' Mittwoch, 10. Juni
Debug.Print Format(38740, "#,##0 €") ' 38.740 €
End Sub
Die Signatur, mit den zwei optionalen Argumenten, die fast jeder vergisst:
Format(expression, [format], [firstDayOfWeek], [firstWeekOfYear])
' der Wert Code für Wochentag-Rechnung, selten nötig
Das Denkmodell: Format ist Schminke, keine Operation
Format ändert, wie ein Wert aussieht, nie, was er ist. Gib ihm die Datums-Seriennummer 46183 und den Code "yyyy-mm-dd", und du bekommst die Zeichenkette "2026-06-10". Der zugrunde liegende Wert ändert beim Hineingehen seinen Typ nicht — aber was herauskommt, ist immer ein String. Das ist der wichtigste Satz über Format: die Ausgabe ist Text.
Hast du das im Kopf, ordnet sich das ganze Werkzeug ein. Nimm Format, wenn das Ziel eine Zeichenkette ist — eine Meldung, ein Blattname, ein Dateiname "bericht_" & Format(Date, "yyyymmdd") & ".xlsx", eine Beschriftung, die du zusammensetzt. Nimm es nicht, wenn das Ziel eine Zelle ist, die eine Zahl oder ein Datum bleiben muss — sonst gießt du Text in ein Fach, in dem der Rest deiner Mappe rechnen will.
Die eine Regel: Format liefert einen String — und zerstört damit die Rechnung danach
Das ist die Regel, die die häufigste Format-Katastrophe erklärt:
In dem Moment, in dem du
cell.Value = Format(einDatum, "yyyy-mm-dd")schreibst, hört diese Zelle auf, ein Datum zu sein, und wird zu Text, der aussieht wie ein Datum. Er sortiert nicht chronologisch, lässt sich nicht nach Monat filtern, und=SUMMEüber eine Spalte „formatierter Zahlen" ergibt0.
Hier die Falle, vollständig zusammengebaut:
' ⚠ FALSCH — füllt die Spalte mit Text, der nur numerisch aussieht
Range("C2").Value = Format(1234.5, "#,##0.00") ' die Zelle enthält jetzt die ZEICHENKETTE "1.234,50"
' =SUMME(C:C) ignoriert sie. Sortieren behandelt "1.234,50" als Text. Diagramme überspringen sie.
Willst du in Wahrheit, dass die Zelle mit Tausenderpunkten angezeigt wird und dabei eine echte Zahl bleibt, nimmst du gar kein Format — du setzt das Zahlenformat der Zelle und lässt den Wert in Ruhe:
' ✓ RICHTIG — Wert bleibt numerisch, nur die Anzeige ändert sich
Range("C2").Value = 1234.5
Range("C2").NumberFormat = "#,##0.00" ' SUMME, Sortieren, Diagramme funktionieren weiter
Dieser Unterschied — Format erzeugt Text, NumberFormat ändert die Anzeige — ist das ganze Spiel. Präge ihn dir ein: Format für Zeichenketten, NumberFormat für Zellen.
Die zweite Falle: m heißt Monat, bis es das nicht tut
Datum- und Zeitcodes teilen sich den Buchstaben m, und diese Mehrdeutigkeit erwischt jeden mindestens einmal:
- Ein alleinstehendes
"mm"sind Monate:Format(Now, "mm")→06. - Dasselbe
"mm"direkt nach"hh:"wird als Minuten gelesen:Format(Now, "hh:mm")→09:05. Die Nähe zur Stunde dreht die Bedeutung um. - Bei einer abgelaufenen Zeit ohne Stunde daneben ergibt
"mm:ss"Monat:Sekunde— fast nie das Gemeinte. Nimm VBAs explizites Minuten-Zeichenn:Format(t, "nn:ss").
Debug.Print Format(Now, "yyyy-mm-dd hh:mm:ss") ' 2026-06-10 09:05:30 (erstes mm = Monat, zweites = Minuten)
Debug.Print Format(Now, "mm:ss") ' 06:30 <- MONAT:Sekunde, die klassische Überraschung
Debug.Print Format(Now, "nn:ss") ' 05:30 <- Minuten, der Fix
Die Platzhalterziffern haben ihre eigene Regel: 0 erzwingt eine Ziffer (mit Nullen aufgefüllt), # zeigt eine Ziffer nur, wenn vorhanden. Format(5, "00") → 05; Format(5, "##") → 5. So füllst du Rechnungsnummern mit Nullen auf oder hältst eine saubere Ganzzahl.
Benannte Formate und die Format*-Geschwister
Du brauchst nicht immer einen eigenen Code. VBA bringt benannte Formate und gebietsabhängige Geschwisterfunktionen mit:
Debug.Print Format(1234.5, "Currency") ' 1.234,50 € (nutzt die regionale Währung des Rechners)
Debug.Print Format(Now, "Short Date") ' 10.06.2026 (regionale Reihenfolge)
Debug.Print Format(0.75, "Percent") ' 75,00%
Debug.Print FormatCurrency(1234.5, 2) ' 1.234,50 €
Debug.Print FormatNumber(1234.5, 2) ' 1.234,50
Debug.Print FormatPercent(0.75, 1) ' 75,0%
Debug.Print FormatDateTime(Now, vbLongDate) ' Mittwoch, 10. Juni 2026
Die benannten Formate und die Format*-Geschwister achten auf die Regionseinstellungen des Rechners — ein Vorteil für die Anzeige beim Nutzer und eine Gefahr für Daten, die du hin- und zurückführen willst: "Short Date" ist 6/10/2026 in den USA und 10.06.2026 in den meisten Teilen Europas. Brauchst du eine feste, maschinenunabhängige Zeichenkette (einen Dateinamen, einen CSV-Schlüssel, einen ISO-Zeitstempel), buchstabiere den Code explizit aus — "yyyy-mm-dd" — und niemals "Short Date".
Wann was
| Du willst… | Nimm | Warum |
|---|---|---|
| Eine Zeichenkette für Meldung, Dateiname, Beschriftung | Format(Wert, Code) |
Ausgabe ist Text — genau das, was du brauchst |
| Eine Zelle formatiert anzeigen, aber numerisch halten | Range.NumberFormat = Code |
Wert bleibt Zahl; SUMME/Sortieren/Diagramme gehen |
| Eine gebietsabhängige Währungs-/Zahlzeichenkette | FormatCurrency / FormatNumber |
Folgt den Regionseinstellungen |
| Eine feste, maschinenunabhängige Datumszeichenkette | Format(d, "yyyy-mm-dd") |
Expliziter Code ignoriert die regionale Reihenfolge |
| Text tatsächlich zurück in Zahl/Datum wandeln | CStr / CDate / Val | Format geht nur Wert → Text, nie zurück |
Die Meinung: landet es in einer Zelle, ist es NumberFormat, nicht Format
Diese Linie verteidige ich: Format sollte fast nie in eine Datenzelle schreiben. Neunzig Prozent der „meine SUMME ist null"- und „meine Daten sortieren nicht"-Tickets führen zu jemandem zurück, der Format benutzt hat, wo er NumberFormat wollte. Beide lesen sich im Code fast gleich — genau deshalb ist der Bug so häufig und im Review so unsichtbar.
Mach also eine Gewohnheit mit klarer Trennung daraus. Eine Zeichenkette bauen — ein Blattname, eine Logzeile, ein Dateinamen-Stempel, Text, den du in eine MsgBox setzt? Format. Eine Zelle richtig aussehen lassen und sie als Zahl oder Datum halten, mit der die Mappe rechnet? NumberFormat, Wert unangetastet. Triffst du diese Trennung, verschwindet eine ganze Klasse stiller Datenbugs. Und denk an die Einbahnstraße: Format geht nur Wert → Text. Für die Gegenrichtung — Text, der eine echte Zahl oder ein Datum sein soll — brauchst du CStr, CDate und Val, nicht Format.
Häufige Format-Fehler (und die Lösung)
| Symptom | Ursache | Lösung |
|---|---|---|
=SUMME über die Spalte ergibt 0 |
Format() (Text) in die Zellen geschrieben |
Wert + Range.NumberFormat, kein Format |
| Daten sortieren nicht chronologisch | Zellen enthalten formatierten Text, keine Daten | Echtes Datum speichern, NumberFormat setzen |
mm zeigt den Monat, nicht die Minuten |
Alleinstehendes mm ist Monat |
nn nehmen, oder mm neben hh setzen |
| Datumszeichenkette dreht Tag/Monat auf anderem PC | "Short Date" (regional) benutzt |
Explizites "yyyy-mm-dd" nehmen |
| Führende Null fehlt im Code | # (optionale Ziffer) benutzt |
0 nehmen, um die Ziffer zu erzwingen: "00" |
| Zahl erscheint nach Makro als Text | Format-Ergebnis an .Value zugewiesen |
Die Zahl zuweisen; über NumberFormat formatieren |
Wenn das Formatieren das halbe Makro ist — beschreibe das Ergebnis stattdessen
Formatieren ist nie das Ziel; der Bericht ist es. Du wolltest „ein Monatsblatt, in dem Beträge als Euro, Daten als ISO erscheinen und die Summen trotzdem aufgehen" — und stattdessen steckst du drei Ebenen tief in der Frage, ob dieses mm ein Monat ist, ob diese Spalte Text oder Zahl ist und warum das Diagramm eine Zeile übersprungen hat. ExcelMaster Agent lässt dich das Ergebnis in klarem Deutsch formulieren — „formatiere Spalte C als Währung, Spalte A als yyyy-mm-dd, halte sie numerisch, damit die Summen stimmen" — und schreibt Python, das Zahlenformate setzt, statt deine Daten in Text zu verwandeln, und sichert vorher die Datei. Kostenlos testen →
Verwandte Anleitungen
- VBA Trim — warum es deine Leerzeichen nicht entfernt (und der Chr(160)-Fix)
- VBA CStr, CDate & Val — Text richtig in Zahlen und Datum umwandeln
- VBA InStr — Text in einer Zeichenkette finden
- VBA Split — eine Zeichenkette in ein Array verwandeln
- VBA For-Schleife in Excel — 8 praxisnahe Beispiele
FAQ
Was macht die Format-Funktion in VBA?
Format wandelt einen Wert mit einem Formatcode in eine formatierte Zeichenkette um — Format(1234.5, "#,##0.00") gibt den Text "1.234,50" zurück. Es ändert, wie der Wert aussieht, nicht, was er ist, und das Ergebnis ist immer Text.
Wie formatiere ich ein Datum in VBA?
Mit einem expliziten Code: Format(Now, "yyyy-mm-dd") ergibt 2026-06-10; Format(Now, "dd.mm.yyyy") ergibt Tag zuerst. Vermeide das benannte "Short Date", wenn die Zeichenkette auf jedem Rechner gleich sein muss, denn es folgt den Regionseinstellungen jedes PCs.
Warum zeigt mein VBA-Format den Monat statt der Minuten?
Weil m standardmäßig Monat bedeutet. Ein alleinstehendes "mm" ist der Monat; es bedeutet nur Minuten, wenn es direkt nach "hh:" steht. Bei einer abgelaufenen Zeit nimm VBAs explizites Minuten-Zeichen: Format(t, "nn:ss").
Warum ergibt SUMME 0, nachdem ich eine Spalte mit VBA formatiert habe?
Mit großer Sicherheit hast du Format()-Ergebnisse in die Zellen geschrieben, was Text speichert, der nur numerisch aussieht. Speichere die echte Zahl und setze das Aussehen stattdessen mit Range.NumberFormat = "#,##0.00" — dann gehen SUMME, Sortieren und Diagramme wieder.
Was ist der Unterschied zwischen Format und NumberFormat in VBA?
Format gibt eine Textzeichenkette zurück; Range.NumberFormat ändert, wie eine Zelle angezeigt wird, während der gespeicherte Wert eine echte Zahl oder ein Datum bleibt. Nimm Format, um Zeichenketten zu bauen, und NumberFormat, um Zellen richtig aussehen zu lassen, ohne Berechnungen zu zerstören.
