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

VBA Now, Date & Time in Excel — die Uhr auslesen, und warum Date auch eine Anweisung ist

|

VBA Now, Date & Time in Excel — die Uhr auslesen, und warum Date auch eine Anweisung ist

TL;DRNow liefert Datum und Uhrzeit, Date liefert heute um Mitternacht, und Time liefert nur die Uhrzeit. Darunter sind sie alle ein und dieselbe Zahl: Ein VBA-Datum ist ein Double, dessen Ganzzahlteil der Tag und dessen Nachkommateil die Uhrzeit ist. Genau deshalb passt If stamp = Date fast nie auf einen Wert, der aus Now stammt — Now trägt einen Nachkommateil, Date nicht. Schneiden Sie die Uhrzeit mit Int(Now) oder DateValue(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, Date und Time verschiedene Zahlen aus derselben Uhr liefern
  • Warum If stamp = Date stillschweigend nie auf einen Now-Wert passt — und wie Sie das beheben
  • Dass Date und Time auch Anweisungen sind, die die Systemuhr neu stellen
  • Warum Now Ortszeit 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:

  • Now füllt beide Teile — den ganzzahligen Tag und die Nachkomma-Uhrzeit.
  • Date füllt nur die Ganzzahl — heute, mit dem Nachkommateil auf 0 gezwungen (Mitternacht).
  • Time füllt nur den Nachkommateil — die Uhrzeit, mit dem Ganzzahlteil 0.

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. Now hat beides; Date nur die Ganzzahl; Time nur den Nachkommateil.
  • Normalisieren Sie vor dem VergleichInt(stamp) = Date, nie stamp = Date. Der Gleichheitsbug ist immer ein übrig gebliebener Nachkommateil.
  • Lesen, nie stellen → Halten Sie Date/Time rechts vom =. Links stellen sie die Systemuhr neu.
  • Den Wert speichern, die Zelle formatieren → behalten Sie den echten Now; nehmen Sie NumberFormat oder Format für das Aussehen, sonst brechen SUMME und 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