TL;DR —
Nowliefert Datum und Uhrzeit,Dateliefert heute um Mitternacht, undTimeliefert nur die Uhrzeit. Darunter sind sie alle ein und dieselbe Zahl: Ein VBA-Datum ist einDouble, dessen Ganzzahlteil der Tag und dessen Nachkommateil die Uhrzeit ist. Genau deshalb passtIf stamp = Datefast nie auf einen Wert, der ausNowstammt —Nowträgt einen Nachkommateil,Datenicht. Schneiden Sie die Uhrzeit mitInt(Now)oderDateValue(Now)ab, bevor Sie vergleichen.
Sub ClockDemo()
Debug.Print Now ' 2026-08-26 14:30:07 - Datum + Uhrzeit
Debug.Print Date ' 2026-08-26 - heute um Mitternacht
Debug.Print Time ' 14:30:07 - nur die Uhrzeit
Debug.Print Int(Now) ' 2026-08-26 - Now ohne Uhrzeit = Date
End Sub
Ein VBA-Datum ist kein undurchsichtiger Spezialtyp, in den man nicht hineinsehen kann — es ist ein
schlichter Double, der nur eine Maske trägt. Der Ganzzahlteil zählt die Tage seit dem 30. Dezember
1899; der Nachkommateil ist die Uhrzeit (0.5 = Mittag). Now, Date und Time sind bloß drei
Arten, dieselbe Uhr in diese Zahl einzulesen. Sobald Sie den Double sehen können, entpuppt sich jeder
Datumsvergleichs-Bug in Ihren Makros als dieselbe Geschichte — ein verirrter Nachkommateil an einer
Stelle, an der Sie keinen erwartet haben.
Was Sie lernen
- Das mentale Modell — ein Datum ist ein
Double: Ganzzahlteil = Tag, Nachkommateil = Uhrzeit - Warum
Now,DateundTimeverschiedene Zahlen aus derselben Uhr liefern - Warum
If stamp = Datestillschweigend nie auf einenNow-Wert passt — und wie Sie das beheben - Dass
DateundTimeauch Anweisungen sind, die die Systemuhr neu stellen - Warum
NowOrtszeit liefert, nicht UTC, in einer geteilten Arbeitsmappe - Wie Sie einen Zeitstempel für die Anzeige formatieren, ohne die Zahl darunter zu zerstören
Das mentale Modell: Ein Datum ist ein Double
Die eine Idee, die alles einrasten lässt: Ein VBA-Date-Wert ist eine Zahl. Weisen Sie Now einem
Double zu, und VBA zeigt Ihnen das Innenleben:
Dim d As Double
d = Now ' z. B. 46261.6042
' 46261 -> Tage seit 1899-12-30 -> das Datum
' 0.6042 -> Bruchteil eines Tages -> ~14:30 die Uhrzeit
Der Ganzzahlteil ist die fortlaufende Tagesnummer; der Nachkommateil ist die Uhrzeit als Bruchteil
von 24 Stunden. 0.25 ist 6 Uhr morgens, 0.5 ist Mittag, 0.75 ist 18 Uhr. Alles Weitere folgt
daraus. 1 addieren rückt Sie um einen Tag vor; 1/24 addieren um eine Stunde. Die drei Uhr-Funktionen
unterscheiden sich einzig darin, welchen Teil der Zahl sie ausfüllen:
Nowfüllt beide Teile — den ganzzahligen Tag und die Nachkomma-Uhrzeit.Datefüllt nur die Ganzzahl — heute, mit dem Nachkommateil auf0gezwungen (Mitternacht).Timefüllt nur den Nachkommateil — die Uhrzeit, mit dem Ganzzahlteil0.
Das ist das ganze Modell. Der Rest dieser Anleitung handelt davon, was passiert, wenn Sie vergessen, welcher Teil gefüllt ist.
Now vs Date vs Time: drei Blicke auf eine Uhr
Greifen Sie zu derjenigen, die zu der Frage passt, die Sie tatsächlich stellen:
Now— ein vollständiger Zeitstempel, Datum und Uhrzeit. Nehmen Sie ihn, um festzuhalten, wann etwas passiert ist (ws.Range("A1") = Now).Date— das heutige Kalenderdatum um Mitternacht. Nehmen Sie es für welcher-Tag-Logik — ist diese Rechnung überfällig, ist heute Wochenende — bei der die Uhrzeit nur Rauschen ist.Time— die Uhrzeit ohne Datum. Nehmen Sie sie, um eine Uhrzeit zu stempeln oder einen Zeitpunkt innerhalb eines Tages nach der Wanduhr festzuhalten.
Range("A1") = Now ' 2026-08-26 14:30:07 - ein Ereignis protokolliert
Range("A2") = Date ' 2026-08-26 - eine Faelligkeits-Spalte
Range("A3") = Time ' 14:30:07 - eine Schichtbeginn-Zeit
Now = Date + Time stimmt auf die Sekunde genau, denn genau so ist die Zahl gebaut: Date liefert die
Ganzzahl, Time liefert den Nachkommateil.
Warum If stamp = Date nie auf einen Now-Wert passt
Das ist der Paradebug, und er folgt direkt aus dem Double. Sie speichern einen Zeitstempel mit Now
und prüfen später, ob er heute entstanden ist:
saved = Now ' 46261.6042 (hat einen Uhrzeit-Bruchteil)
' ...spaeter...
If saved = Date Then MsgBox "today" ' Date ist 46261.0000 - NIE gleich
Date ist eine ganze Zahl; saved trägt einen Nachkommateil. 46261.6042 = 46261.0 ist False, also
wird der Zweig stillschweigend nie betreten — kein Fehler, nur Logik, die klammheimlich nichts tut. Der
Fix lautet, Gleiches mit Gleichem zu vergleichen, indem Sie die Uhrzeit vor dem Test abschneiden:
If Int(saved) = Date Then MsgBox "today" ' Int schneidet den Nachkommateil ab
If DateValue(saved) = Date Then MsgBox "today" ' DateValue tut dasselbe, absichtlich
Int(d) schneidet den Nachkommateil ab und lässt das reine Datum übrig.
DateValue tut dasselbe, liest sich aber wie „der Datumsanteil dieses Werts", was
für den Nächsten klarer ist. Die Regel zum Mitnehmen: Vergleichen Sie einen aus Now abgeleiteten Wert
nie mit =, es sei denn, beide Seiten sind auf dieselbe Genauigkeit normalisiert. Der „hat im Test
funktioniert"-Datumsbug ist immer ein verirrter Nachkommateil.
Date und Time sind auch Anweisungen, die die Uhr stellen
Hier die Falle, die jeden einmal überrascht: Date und Time sind nicht nur Funktionen, die die Uhr
lesen — sie sind auch Anweisungen, die sie schreiben. Mit einer Zuweisung auf der linken Seite
ändern sie die Systemuhr des Rechners:
x = Date ' FUNKTION - liest heute in x ein
Date = #2030-01-01# ' ANWEISUNG - setzt das Datum des GANZEN COMPUTERS auf 2030
Time = #08:00:00# ' ANWEISUNG - setzt die Systemzeit
Dasselbe Wort, gegenteilige Wirkung, entschieden allein dadurch, ob es links von einem = steht. Die
Systemuhr zu stellen betrifft jede Anwendung auf dem Rechner, verlangt Administratorrechte und ist so
gut wie nie das, was ein Tabellen-Makro tun sollte — ein versehentliches Date = irgendwas ist ein echt
gefährlicher Tippfehler. Lesen Sie die Uhr, stellen Sie sie nie: Halten Sie Date und Time auf der
rechten Seite Ihrer Zuweisungen.
Now liefert Ortszeit, nicht UTC
Now liest die lokale Uhr des Rechners — ihr Wert hängt von der Zeitzone und der
Sommerzeit-Einstellung des Nutzers ab. In einer über Regionen hinweg geteilten Arbeitsmappe stempeln zwei
Personen, die denselben Knopf drücken, zwei verschiedene Zeiten, und keine davon ist UTC. VBA hat keine
eingebaute UTC-Funktion; die Weltzeit zu bekommen erfordert einen Windows-API-Aufruf (GetSystemTime)
oder einen Helfer:
' Now = lokale Wanduhrzeit - genau richtig fuer einen Rechner,
' mehrdeutig in dem Moment, in dem die Datei eine Zeitzone kreuzt.
Range("Log") = Now
Für die Arbeitsmappe eines einzelnen Nutzers ist das genau richtig und einfach. Für ein Protokoll, das mehrere Regionen lesen, speichern Sie entweder UTC (über die API) oder halten die Zeitzone neben dem Zeitstempel fest — sonst bedeutet ein Eintrag „10:00" nichts, ohne zu wissen, wessen 10:00 gemeint war.
Einen Zeitstempel anzeigen, ohne die Zahl zu zerstören
Um ein Datum so anzuzeigen, wie Sie es wollen, nehmen Sie Format — aber denken
Sie daran, dass es Text liefert, kein Datum, es ist also nur für die Anzeige:
MsgBox Format(Now, "yyyy-mm-dd hh:nn:ss") ' ein String fuer eine Meldung
cell.Value = Now ' den echten Double speichern...
cell.NumberFormat = "yyyy-mm-dd" ' ...und die ZELLE formatieren, nicht den Wert
cell.Value = Format(Now, ...) zu schreiben legt eine Zeichenkette, die wie ein Datum aussieht in die
Zelle, und dann brechen SUMME, Sortierung und Datumsfilter allesamt, weil die Zelle Text ist. Die
richtige Gewohnheit: den echten Now-Wert speichern und sein Aussehen über NumberFormat steuern. Für
die Gegenrichtung — vom Nutzer getippten Text in ein Datum verwandeln — nehmen Sie
CDate oder DateSerial.
Das ehrliche Fazit: Wissen, welchen Teil der Zahl Sie halten
Now, Date und Time sind trivial aufzurufen und leicht zu missbrauchen, weil der Missbrauch nie einen
Fehler wirft — er vergleicht bloß klammheimlich die falschen Zahlen. Vier Regeln decken die ganze Fläche
ab:
- Sehen Sie den
Double→ die Ganzzahl ist der Tag, der Nachkommateil die Uhrzeit.Nowhat beides;Datenur die Ganzzahl;Timenur den Nachkommateil. - Normalisieren Sie vor dem Vergleich →
Int(stamp) = Date, niestamp = Date. Der Gleichheitsbug ist immer ein übrig gebliebener Nachkommateil. - Lesen, nie stellen → Halten Sie
Date/Timerechts vom=. Links stellen sie die Systemuhr neu. - Den Wert speichern, die Zelle formatieren → behalten Sie den echten
Now; nehmen SieNumberFormatoderFormatfür das Aussehen, sonst brechenSUMMEund Sortierung.
Bekommen Sie das mentale Double-Modell richtig hin, und die zwei schweren Brocken —
mit Datumswerten rechnen und die Teile wieder herausziehen
— hören ebenfalls auf, mysteriös zu sein.
Wie ExcelMaster hilft
Die Datumsbugs, die echte Zeit kosten, sind die stillen: eine = Date-Prüfung, die nie greift, eine
Zelle, die falsch sortiert, weil ein Makro Format(Now, …) als Text gespeichert hat, ein geteiltes
Protokoll, dessen Zeiten für verschiedene Leser Verschiedenes bedeuten. Jeder davon kommt daher, dass man
den Überblick verliert, welchen Teil der Zahl man gerade hält.
ExcelMaster schreibt die
Zeitstempel-Logik, die richtig vergleicht und richtig speichert. Beschreiben Sie die Aufgabe —
„protokolliere jeden Lauf mit Datum und Uhrzeit" oder „markiere Zeilen mit einem Datum vor heute" — und
es erzeugt den richtigen Aufruf (Now vs. Date), normalisiert den Vergleich mit Int/DateValue und
hält den gespeicherten Wert als echtes Datum, mit der Formatierung auf der Zelle. Sie beschreiben den
Moment, den Sie festhalten wollen; es schreibt den Code, der ihn ohne die Verirrter-Nachkommateil-Falle
festhält.
Häufig gestellte Fragen
Was ist der Unterschied zwischen Now und Date in VBA?
Now liefert das aktuelle Datum und die Uhrzeit; Date liefert das heutige Datum um Mitternacht
(ohne Uhrzeitanteil). Unter der Haube ist ein VBA-Datum ein Double, dessen Ganzzahl der Tag und dessen
Nachkommateil die Uhrzeit ist — Now füllt beides, Date nur die Ganzzahl. Deshalb sind Now und
Date selbst am selben Tag fast nie gleich, nehmen Sie also Date (oder Int(Now)), wann immer die
Uhrzeit keine Rolle spielen soll.
Warum funktioniert mein Datumsvergleich mit = in VBA nie?
Weil die eine Seite einen Uhrzeit-Bruchteil trägt und die andere nicht. Ein Wert aus Now sieht aus wie
46261.6042, während Date 46261.0 ist, also ist Now = Date False. Schneiden Sie die Uhrzeit vor
dem Vergleich ab: If Int(stamp) = Date Then … oder If DateValue(stamp) = Date Then …. Vergleichen Sie
zwei Datumswerte nur dann mit =, wenn beide auf dieselbe Genauigkeit normalisiert wurden.
Wie bekomme ich in VBA nur die aktuelle Uhrzeit?
Nehmen Sie die Time-Funktion: t = Time liefert die Uhrzeit ohne Datum (der Ganzzahlteil der Zahl ist
null). Wenn Sie einen vollständigen Zeitstempel aus Now haben und nur dessen Uhrzeitanteil wollen,
ziehen Sie den Datumsteil ab: t = Now - Int(Now) lässt den Nachkommateil übrig. Um sie als Text
anzuzeigen, nehmen Sie Format(Time, "hh:nn:ss").
Liefert Now in VBA die UTC-Zeit?
Nein. Now liefert die lokale Wanduhrzeit des Rechners, samt Zeitzonen- und Sommerzeit-Versatz. VBA
hat keine eingebaute UTC-Funktion; für die Weltzeit brauchen Sie einen Windows-API-Aufruf wie
GetSystemTime. In einer über Regionen hinweg geteilten Arbeitsmappe speichern Sie UTC oder halten die
Zeitzone neben dem Zeitstempel fest, sonst ist eine protokollierte Zeit mehrdeutig.
Kann VBA das Systemdatum und die Systemzeit ändern?
Ja, und genau deshalb ist es gefährlich. Date und Time sind auch Anweisungen:
Date = #2030-01-01# setzt das Systemdatum des Computers und Time = #08:00:00# stellt seine Uhr, was
jede Anwendung betrifft und meist Administratorrechte verlangt. Halten Sie Date und Time auf der
rechten Seite einer Zuweisung, damit Sie die Uhr immer nur lesen, nie stellen.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 26.08.2026.
Verwandte Anleitungen: VBA DateAdd & DateDiff · VBA Weekday & DatePart · VBA Format · VBA CStr, CDate & Val · VBA Timer
