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

VBA Format in Excel — Datum, Zahlen & warum Formatieren deine Rechnung kaputtmacht

|

VBA Format in Excel — Datum, Zahlen & warum Formatieren deine Rechnung kaputtmacht

Getestet mit: Excel 365 v2509 · Excel 2021 · Excel 2019 · zuletzt geprüft am 10.06.2026

KurzfassungFormat 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" ergibt 0.

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-Zeichen n: 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

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.