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

VBA Value vs Value2 vs Text in Excel — welches liest die Zelle richtig

|

VBA Value vs Value2 vs Text in Excel — welches liest die Zelle richtig

TL;DR — Eine Zelle hat drei Lese-Gesichter. .Value2 ist die rohe gespeicherte Zahl (ein Datum kommt als seine Seriennummer 46261 zurück, keine Umwandlung — am schnellsten). .Value ist diese Zahl in einen VBA-Typ umgewandelt — ein Date für eine Datumszelle, ein Currency für eine Währungszelle (was sehr große Zahlen runden kann). .Text ist die angezeigte Zeichenkette — "$1,235", oder "###", wenn die Spalte zu schmal ist — und sie ist schreibgeschützt. Zum Rechnen lesen Sie .Value2. .Text zu 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 — .Text ist eine Anzeige-Zeichenkette, nicht der Wert, und schreibgeschützt
  • .Value gegenüber .Value2 — wo die Currency- und Date-Umwandlung die Zahl ändert
  • Warum .Value2 der schnelle, verlustfreie Standard für Massen-Lesevorgänge ist
  • Datumsangaben: ein Date aus .Value, ein serielles Double aus .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 ein Double, Text ist ein String, 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 .Value ein Date; ist sie als Währung formatiert, liefert .Value ein Currency. 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 ein String, 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:

  • .Formula ist das Rezept — die lebende Formel, geschrieben im neutralen US-englischen Dialekt (VBA Formula).
  • .Value ist die typisierte Antwort — die Zahl, umgewandelt in ein Date oder Currency, wenn die Zelle so formatiert ist; nutzen Sie es, wenn Sie diese Typisierung wollen, im Wissen, dass Currency hinter vier Nachkommastellen rundet.
  • .Value2 ist die rohe Antwort — ein schlichtes Double oder String, Datumsangaben als Seriennummern; der schnelle, verlustfreie Standard zum Lesen und für Massen-Arrays.
  • .Text ist 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