Datum und Uhrzeit sind in fast jeder Access-Anwendung dabei: Fristen, Alter, Buchungszeiträume, „geändert am". Intern speichert VBA jedes Datum als Fließkommazahl — der Ganzzahlanteil zählt die Tage seit dem 30.12.1899, der Nachkommaanteil die Uhrzeit. Deshalb kannst du mit Datumswerten rechnen wie mit Zahlen. Diese Lektion zeigt dir die Werkzeuge dafür.
Aktuelles Datum und Uhrzeit
Drei eingebaute Funktionen liefern dir den Jetzt-Zustand:
| Funktion | Rückgabe | Beispiel |
|---|---|---|
Date | nur das Datum, Uhrzeit = 00:00 | 01.07.2026 |
Time | nur die Uhrzeit | 14:37:05 |
Now | Datum und Uhrzeit | 01.07.2026 14:37:05 |
Public Sub ZeigeJetzt()
Debug.Print "Heute: "; Date
Debug.Print "Uhrzeit:"; Time
Debug.Print "Jetzt: "; Now
End Sub
Der Datentyp heißt
Date. Eine Variable dafür deklarierst du mitDim faellig As Date. Verwechsle die Variable nicht mit der FunktionDate— gleicher Name, unterschiedliche Rolle.
Datum gezielt zusammenbauen: DateSerial und TimeSerial
Statt Datumswerte aus Text zu basteln, setzt du sie sauber aus Zahlen zusammen.
DateSerial(Jahr, Monat, Tag) und TimeSerial(Stunde, Minute, Sekunde) sind dabei
robust gegen jede Regionaleinstellung:
Dim start As Date
start = DateSerial(2026, 12, 24) ' 24.12.2026
Dim termin As Date
termin = DateSerial(2026, 3, 15) + TimeSerial(9, 30, 0) ' 15.03.2026 09:30
Ein Trick von DateSerial: Es rechnet Überläufe korrekt um. DateSerial(2026, 2, 30)
ergibt den 2. März 2026, und mit Tag 0 bekommst du den letzten Tag des
Vormonats:
Dim letzterTag As Date
letzterTag = DateSerial(2026, 3, 0) ' 28.02.2026 (letzter Februartag)
Rechnen mit DateAdd
DateAdd(Intervall, Anzahl, Datum) addiert (oder subtrahiert bei negativer Anzahl)
Zeiteinheiten. Das Intervall ist ein Kürzel als Text:
| Kürzel | Einheit |
|---|---|
"yyyy" | Jahr |
"m" | Monat |
"d" | Tag |
"ww" | Woche |
"h" | Stunde |
"n" | Minute |
"s" | Sekunde |
Dim rechnung As Date
rechnung = Date
Dim faellig As Date
faellig = DateAdd("d", 14, rechnung) ' Zahlungsziel: 14 Tage
Debug.Print "Fällig am "; faellig
Dim inEinemJahr As Date
inEinemJahr = DateAdd("yyyy", 1, rechnung)
DateAdd versteht Monatsgrenzen: DateAdd("m", 1, DateSerial(2026, 1, 31)) ergibt
den 28.02.2026, nicht etwa einen ungültigen 31. Februar.
Differenzen mit DateDiff
DateDiff(Intervall, Startdatum, Enddatum) liefert die Anzahl der Einheiten
zwischen zwei Zeitpunkten:
Dim tage As Long
tage = DateDiff("d", DateSerial(2026, 1, 1), Date)
Debug.Print "Tage seit Jahresbeginn: "; tage
Achtung:
DateDiff("yyyy", ...)zählt nur die Kalenderjahr-Grenzen, nicht volle Jahre. Vom 31.12.2025 zum 01.01.2026 ist das schon1, obwohl nur ein Tag vergangen ist. Für echtes Alter brauchst du deshalb einen anderen Weg — gleich mehr dazu.
Einzelteile herausholen: DatePart, Year, Month, Day
Zum Zerlegen eines Datums gibt es die kurzen Funktionen Year, Month, Day,
Hour, Minute, Second — und das flexible DatePart:
Dim d As Date
d = Now
Debug.Print Year(d), Month(d), Day(d) ' 2026 7 1
Debug.Print DatePart("q", d) ' Quartal, z. B. 3
Debug.Print DatePart("ww", d) ' Kalenderwoche
Für die deutsche Kalenderwoche (Montag als Wochenstart, erste Woche mit mindestens 4 Tagen) gibst du die Parameter mit:
Debug.Print DatePart("ww", d, vbMonday, vbFirstFourDays)
Datum ausgeben mit Format
Für die Anzeige wandelst du ein Datum mit Format in Text um. Du bestimmst das
Muster selbst:
Debug.Print Format(Now, "dd.mm.yyyy") ' 01.07.2026
Debug.Print Format(Now, "dd.mm.yyyy hh:nn") ' 01.07.2026 14:37
Debug.Print Format(Now, "dddd, d. mmmm yyyy") ' Mittwoch, 1. Juli 2026
Debug.Print Format(Date, "Long Date") ' benannt, folgt der Windows-Region
Merke: Im Format-Muster steht mm für den Monat, aber nn für die Minute — m
neben Stunden interpretiert VBA sonst als Monat.
Datumsliterale mit # und die SQL-Falle
Ein festes Datum schreibst du im Code als Literal zwischen Rauten. Innerhalb
von # # gilt immer das US-Format #mm/dd/yyyy#, egal welche Regionaleinstellung
der Rechner hat:
Dim stichtag As Date
stichtag = #12/31/2026# ' 31. Dezember 2026 (Monat zuerst!)
Genau diese Regel ist die häufigste Datumsfalle in Access. Sobald du ein Datum in einen SQL-String einbaust, musst du es ins US-Format bringen — sonst wird aus dem 3. Juli klammheimlich der 7. März:
' FALSCH – deutsches Format im SQL-String
Dim sqlFalsch As String
sqlFalsch = "SELECT * FROM Bestellungen WHERE Datum >= #01.07.2026#"
' RICHTIG – Datum sauber als #mm/dd/yyyy# formatieren
Dim vonDatum As Date
vonDatum = Date
Dim sql As String
sql = "SELECT * FROM Bestellungen " & _
"WHERE Datum >= #" & Format(vonDatum, "mm\/dd\/yyyy") & "#"
Debug.Print sql
Faustregel: In Formularen und Berichten zeigst du deutsche Datumsformate. In SQL-Strings baust du Datumswerte ausschließlich mit
Format(wert, "mm\/dd\/yyyy")und Rauten ein. Die Backslashes schützen die Schrägstriche davor, als Trennzeichen der Regionaleinstellung ersetzt zu werden.
Praxis: Alter korrekt berechnen
Ein sauberes Alter berücksichtigt, ob der Geburtstag dieses Jahr schon war. Der Trick: Jahresdifferenz nehmen und einen abziehen, falls der Geburtstag noch aussteht.
Public Function Alter(ByVal geburt As Date, _
Optional ByVal stichtag As Date = 0) As Long
If stichtag = 0 Then stichtag = Date
Dim jahre As Long
jahre = DateDiff("yyyy", geburt, stichtag)
' Geburtstag im Stichjahr noch nicht erreicht? Dann ein Jahr abziehen.
If DateSerial(Year(stichtag), Month(geburt), Day(geburt)) > stichtag Then
jahre = jahre - 1
End If
Alter = jahre
End Function
Testen im Direktfenster:
? Alter(#3/15/1990#) ' liefert das Alter zum heutigen Tag
Weil Alter eine Public Function ist, kannst du sie sogar direkt in einer Abfrage
oder als Steuerelement-Quelle in einem Formular verwenden.
Zusammengefasst
Date,Time,Nowliefern den Ist-Zustand; der DatentypDateist intern eine Zahl, mit der du rechnen kannst.- Datumswerte baust du robust mit
DateSerial/TimeSerialstatt aus Text. DateAddverschiebt,DateDiffmisst Abstände — aberDateDiff("yyyy", …)zählt Kalendergrenzen, nicht volle Jahre.- Datumsliterale
# #und jedes Datum in SQL-Strings sind im US-Format#mm/dd/yyyy#— nutzeFormat(wert, "mm\/dd\/yyyy"). Formatsteuert die Anzeige:mm= Monat,nn= Minute.