TL;DR — Eine Zelle hat drei Lese-Gesichter.
.Value2ist die rohe gespeicherte Zahl (ein Datum kommt als seine Seriennummer46261zurück, keine Umwandlung — am schnellsten)..Valueist diese Zahl in einen VBA-Typ umgewandelt — einDatefür eine Datumszelle, einCurrencyfür eine Währungszelle (was sehr große Zahlen runden kann)..Textist die angezeigte Zeichenkette —"$1,235", oder"###", wenn die Spalte zu schmal ist — und sie ist schreibgeschützt. Zum Rechnen lesen Sie.Value2..Textzu lesen, um eine Zahl zu bekommen, ist der klassische stille Bug.
' Zelle A1 haelt 1234.5, formatiert als Waehrung "$#,##0"
Debug.Print Range("A1").Value2 ' 1234.5 - die rohe Zahl
Debug.Print Range("A1").Value ' 1234.5 - hier ein Currency, umgewandelt
Debug.Print Range("A1").Text ' "$1,235" - die Anzeige-Zeichenkette (gerundet, schreibgeschuetzt)
Jeder lernt zuerst .Value und nimmt an, es sei der Wert in der Zelle. Es ist eines von dreien, und die
Idee, auf der diese Anleitung aufbaut, ist, dass eine Zelle mehrere Gesichter hat und jedes eine andere
Frage beantwortet: .Value2 fragt „welche Zahl ist gespeichert", .Value fragt „welche Zahl,
typisiert, wie VBA sie sieht", und .Text fragt „was ist auf den Bildschirm gemalt". Greifen Sie zum
falschen Gesicht, und nichts wirft einen Fehler — Sie bekommen einfach stillschweigend die falsche
Antwort. Halten Sie die drei auseinander, und eine ganze Familie von „meine Zahlen stimmen nicht"-Bugs
verschwindet.
Was Sie lernen
- Das mentale Modell — drei Lese-Gesichter, geordnet danach, wie stark Excel die Antwort bearbeitet
- Die wichtigste Regel —
.Textist eine Anzeige-Zeichenkette, nicht der Wert, und schreibgeschützt .Valuegegenüber.Value2— wo die Currency- und Date-Umwandlung die Zahl ändert- Warum
.Value2der schnelle, verlustfreie Standard für Massen-Lesevorgänge ist - Datumsangaben: ein
Dateaus.Value, ein seriellesDoubleaus.Value2 - Zu welchem Gesicht Sie jedes Mal greifen sollten
Das mentale Modell: drei Gesichter, von roh bis angezeigt
Ordnen Sie die drei danach, wie stark Excel die gespeicherte Zahl verarbeitet, bevor es sie Ihnen reicht:
.Value2— die Zahl genau wie gespeichert. Überhaupt keine Typumwandlung: eine ganze Zahl ist einDouble, Text ist einString, und ein Datum ist seine zugrunde liegende Seriennummer (46261, kein Datum). Es kommt dem am nächsten, „was wirklich in der Zelle steht"..Value— die gespeicherte Zahl in einen passenden VBA-Typ umgewandelt. Ist die Zelle als Datum formatiert, liefert.ValueeinDate; ist sie als Währung formatiert, liefert.ValueeinCurrency. Die Zahl ist in den meisten Fällen dieselbe, aber ihr VBA-Typ — und manchmal ihre Genauigkeit — ist es nicht..Text— die angezeigte Zeichenkette: der Wert durch das Zahlenformat der Zelle geführt, genau wie er auf dem Bildschirm erscheint."$1,235","12.3%","1-Jan-2026"oder"###", wenn die Spalte zu schmal ist. Immer einString, immer schreibgeschützt.
Die drei sind nicht austauschbar; sie beantworten drei verschiedene Fragen. Alles Weitere ist eine Folge davon, welche Frage Sie eigentlich stellen wollten.
Die wichtigste Regel: .Text ist die Anzeige, nicht der Wert
Das ist die, die Bugs erzeugt, die Sie nicht reproduzieren können, weil sie von Formatierung und
Spaltenbreite abhängen. .Text gibt Ihnen das, was der Bildschirm zeigt, durch das Zahlenformat der
Zelle geführt:
' A1 haelt 1234.5, formatiert "$#,##0"
Dim n As Double
n = Range("A1").Text ' n bekommt "$1,235" umgewandelt -> entweder ein Type-Mismatch-Fehler oder 1235
Zwei Dinge gingen schief. Das Dollarzeichen und das Komma machen es zu einer Zeichenkette, nicht zu
einer Zahl, also bricht die Rechnung oder wirft einen Fehler. Und das Format rundete 1234.5 auf
1,235, sodass Sie selbst nach dem Entfernen der Symbole das .5 verloren haben. Schlimmer noch: Ist die
Spalte zu schmal, um die Zahl zu zeigen, liefert .Text wörtlich "###" — sodass genau derselbe Code auf
Ihrem Bildschirm einen brauchbaren Wert liest und auf dem schmaleren eines Nutzers Müll. Und weil .Text
schreibgeschützt ist, löst Range("A1").Text = "5" einen Fehler aus — Sie können nicht durch es
schreiben. Die Regel ist unmissverständlich: lesen Sie .Text nie, um eine Zahl zu bekommen. Nutzen
Sie .Text nur, wenn Sie wirklich die formatierte Zeichenkette wollen, die ein Mensch sieht — für eine
Berichtsbeschriftung oder eine Log-Zeile — und nie zum Rechnen.
.Value gegenüber .Value2: wo die Umwandlung die Zahl ändert
.Value und .Value2 liefern für gewöhnliche Daten dieselbe Zahl. Sie gehen bei zwei Formaten
auseinander: Währung und Datumsangaben.
Für eine als Währung formatierte Zelle liefert .Value den Datentyp Currency, der 15 Stellen mit
genau 4 Nachkommastellen hält. Das ist perfekt für Geld und vermeidet Fließkomma-Wackeln — aber eine Zahl
mit mehr als vier Nachkommastellen oder eine jenseits des Currency-Bereichs wird gerundet oder läuft
über:
' A1 haelt 1234567.891234, formatiert als Waehrung
Debug.Print Range("A1").Value ' 1234567.8912 - Currency, Rest hinter 4 Nachkommastellen ist weg
Debug.Print Range("A1").Value2 ' 1234567.891234 - volles Double, nichts verloren
Die Lehre ist nicht, dass eines richtig und eines falsch ist — sondern dass sie verschiedene Bedürfnisse
bedienen. Wenn Sie mit Geld hantieren und exakte Arithmetik mit vier Nachkommastellen wollen, ist
.Value (Currency) das sicherere Gesicht. Wenn Sie eine rohe Messgröße oder irgendeine Zahl lesen, bei
der Sie keine Genauigkeit verlieren dürfen, ist es .Value2 (Double). Der stille Bug ist, bei einer
hochgenauen Zahl zu .Value zu greifen und stillschweigend den Rest abzuschneiden.
Warum .Value2 der schnelle, verlustfreie Standard ist
Weil .Value2 keine Umwandlung vornimmt, ist es sowohl der schnellste Lesevorgang als auch der, der
Sie nie mit einem Typ überrascht. Für Massen-Lesevorgänge in ein Array — das Performance-Muster aus
VBA Cell Value — ist .Value2 der Standard, zu dem Profis greifen:
Dim arr As Variant
arr = Range("A1:Z100000").Value2 ' rohe Doubles und Strings - am schnellsten, keine Date/Currency-Umwandlung
Sie bekommen schlichte Doubles und Strings ohne verstecktes Date- oder Currency-Typisieren, über
das Sie nachdenken müssten, und der Lesevorgang ist über große Ranges geringfügig schneller. Der
Kompromiss ist, dass Datumsangaben als Seriennummern ankommen, wenn Ihre Daten also Datumsangaben sind und
Sie sie als Date typisiert wollen, nutzen Sie .Value. Ansonsten nutzen Sie standardmäßig .Value2
zum Lesen und steigen nur dann auf .Value um, wenn Sie ausdrücklich Date- oder Currency-Typisierung
brauchen.
Datumsangaben: ein Date aus .Value, eine Seriennummer aus .Value2
Datumsangaben sind der Ort, an dem die Trennung .Value / .Value2 am härtesten zubeißt:
' A1 haelt das Datum 2026-08-31
Debug.Print Range("A1").Value ' 2026-08-31 - ein echter Date-Wert
Debug.Print Range("A1").Value2 ' 46265 - die Seriennummer darunter
Wenn Sie eine Datumsspalte mit .Value2 lesen und dann „Datumsrechnen" darauf betreiben, rechnen Sie in
Wahrheit mit Seriennummern — was in Ordnung ist, wenn Sie es wissen, und verwirrend, wenn nicht (+1 ist
ein Tag, aber der Wert erscheint als 46266, nicht als Datum). Wenn Sie wollen, dass VBA die Zelle als
Datum behandelt, lesen Sie .Value; wenn Sie rohe Zahlen hin- und herreichen und später formatieren, ist
.Value2 sauberer. Das ist dieselbe zugrunde liegende Idee vom Double-mit-einer-Maske hinter
VBA Now, Date & Time und VBA DateAdd.
Das ehrliche Fazit: eine Zelle, vier Gesichter, bewusst wählen
Eine Zelle ist nicht ein einzelner Wert. Sie lesen und schreiben sie über vier Gesichter, und bewusst zu wählen ist die ganze Kunst:
.Formulaist das Rezept — die lebende Formel, geschrieben im neutralen US-englischen Dialekt (VBA Formula)..Valueist die typisierte Antwort — die Zahl, umgewandelt in einDateoderCurrency, wenn die Zelle so formatiert ist; nutzen Sie es, wenn Sie diese Typisierung wollen, im Wissen, dass Currency hinter vier Nachkommastellen rundet..Value2ist die rohe Antwort — ein schlichtesDoubleoderString, Datumsangaben als Seriennummern; der schnelle, verlustfreie Standard zum Lesen und für Massen-Arrays..Textist das, was auf dem Bildschirm steht — eine formatierte, schreibgeschützte Zeichenkette; nur zur Anzeige, nie zum Rechnen, und nie vertrauenswürdig, wenn eine Spalte zu schmal sein könnte.
Lesen Sie das falsche, und der Bug ist still: .Value rundet Geld stillschweigend hinter vier
Nachkommastellen, .Text reicht Ihnen "###" oder "$1,235" statt einer Zahl, und .Formula weist
einen lokalisierten Funktionsnamen ab. Wissen Sie, welches Gesicht Sie meinten, und die Zelle hört auf,
Sie anzulügen.
Wie ExcelMaster hilft
Die Wert-Gesicht-Bugs sind die, die nie einen Fehler werfen: Geld, gerundet durch eine
Currency-Umwandlung, ein Datum, als Seriennummer gelesen und durch „Datumsrechnen" verstümmelt, ein
.Text-Lesevorgang, der auf dem schmaleren Bildschirm eines anderen "###" zurückgab. Sie bestehen jeden
Test auf Ihrer Maschine und scheitern still auf echten Daten.
ExcelMaster liest jede Zelle über das
richtige Gesicht. Bitten Sie es, „die rohen Beträge zu summieren", und es liest .Value2 für verlustfreie
Doubles; bitten Sie um „die Rechnungssummen als Geld", und es nutzt .Value für Currency-Typisierung;
bitten Sie um „die Beschriftung genau wie gezeigt", und es nimmt .Text — und nutzt .Text nie zum
Rechnen. Es weiß, dass Datumsangaben aus .Value2 als Seriennummern und aus .Value als Date
zurückkommen, und wählt entsprechend. Sie beschreiben, wofür die Zahl da ist; es liest das Gesicht, das
sie korrekt hält.
Häufig gestellte Fragen
Was ist der Unterschied zwischen Value und Value2 in VBA?
.Value2 liefert die rohe gespeicherte Zahl ohne Typumwandlung — ein Datum kommt als sein serielles
Double zurück, eine Währungszelle als schlichtes Double. .Value liefert dieselbe Zahl, umgewandelt
in einen passenden VBA-Typ: ein Date für eine als Datum formatierte Zelle, ein Currency für eine als
Währung formatierte Zelle. Sie stimmen für gewöhnliche Zahlen überein, aber .Value kann einen
hochgenauen Währungswert auf vier Nachkommastellen runden, während .Value2 das volle Double behält.
Soll ich Value oder Value2 in Excel VBA verwenden?
Nutzen Sie standardmäßig .Value2 zum Lesen: Es ist am schnellsten und überrascht Sie nie mit Date-
oder Currency-Typisierung oder Genauigkeitsverlust, was es ideal für Massen-Lesevorgänge in ein Array
macht. Nutzen Sie .Value, wenn Sie ausdrücklich die Zelle als Date typisiert wollen oder
Currency-Arithmetik für Geld. Meiden Sie .Text für jeden Wert, mit dem Sie rechnen werden — es liefert
eine formatierte, schreibgeschützte Zeichenkette.
Warum sollte ich .Text nicht zum Lesen eines Zellwerts verwenden?
.Text liefert die auf dem Bildschirm angezeigte Zeichenkette, durch das Zahlenformat der Zelle geführt —
eine Währungszelle liest sich also als "$1,235" (eine Zeichenkette, und gerundet), ein Prozentsatz als
"12%" und eine zu schmale Spalte wörtlich als "###". Das lässt die Rechnung scheitern oder falsche
Ergebnisse erzeugen, und der "###"-Fall bedeutet, dass derselbe Code auf Ihrem Bildschirm funktioniert
und auf einem schmaleren bricht. .Text ist außerdem schreibgeschützt, Sie können ihm also nichts
zuweisen. Lesen Sie .Value2 oder .Value für Zahlen und nutzen Sie .Text nur zur Anzeige.
Warum kommt mein VBA-Datum als Zahl zurück?
Sie haben es mit .Value2 gelesen, das das rohe serielle Double unter dem Datum (zum Beispiel 46265)
liefert statt eines Date. Excel speichert Datumsangaben als Seriennummern, und .Value2 gibt Ihnen
diese Zahl ohne Umwandlung. Um einen echten Date-Wert zu bekommen, lesen Sie stattdessen .Value;
nutzen Sie .Value2 nur, wenn Sie die Seriennummer wollen, zum Beispiel für schnelle Massen-Lesevorgänge,
die Sie später formatieren.
Kann ich einen Zellwert mit .Text in VBA setzen?
Nein. .Text ist schreibgeschützt — es meldet die auf dem Bildschirm gezeigte formatierte Zeichenkette,
und ihm etwas zuzuweisen, etwa Range("A1").Text = "5", löst einen Fehler aus. Um eine Zelle zu
schreiben, weisen Sie .Value (oder .Value2) zu und steuern über das Zahlenformat der Zelle, wie sie
erscheint, statt eine formatierte Zeichenkette zu schreiben.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 31.08.2026.
Verwandte Anleitungen: VBA Cell Value · VBA Formula · VBA Number Format · VBA Now, Date & Time · VBA Format
