Die klassischen Datumsfunktionen in VBA wie DateAdd
, DateDiff
, Format
, Now
, Date
, Weekday
, Month
und Year
sind zwar funktional – aber oft nicht besonders intuitiv. Moderne Anforderungen wie Wochenberechnung nach ISO-8601, flexible Datumsformate, vergleichbare Zeitintervalle oder Datum + Zeit mit SekundenprĂ€zision lassen sich nur mit Zusatzlogik elegant lösen.
In diesem Beitrag zeige ich Dir, wie Du mit modularen Funktionen, besseren Parametern und ein wenig Wrapper-Code deutlich mehr aus den VBA-Datumsfunktionen herausholst – ohne externe Bibliothek, rein in VBA.
Problem: SchwÀchen der klassischen VBA-Datumsfunktionen
Einige typische Beispiele:
DateAdd("m", 1, #31.01.2025#)
â gibt 2. MĂ€rz 2025 zurĂŒck, nicht 29. FebruarDateDiff("ww", ...)
zÀhlt Wochenbeginn am Sonntag, nicht nach ISO-StandardFormat(Now, "YYYY-MM-DD")
â gibt falsches Jahr zurĂŒck, weil"YYYY"
nicht korrekt ist (muss"yyyy"
sein)Weekday(Date)
gibt 1 bis 7 zurĂŒck, abhĂ€ngig vom Starttag – aber ohne ISO-Logik
Deshalb lohnt es sich, eine eigene moderne Toolbox fĂŒr Datum/Zeit in VBA zu bauen.
Beispiel 1: ISO-Wochennummer berechnen (Montag als Wochenbeginn)
Public Function ISO_Woche(vDatum As Date) As Integer
ISO_Woche = DatePart("ww", vDatum, vbMonday, vbFirstFourDays)
End Function
Verwendung:
Debug.Print ISO_Woche(Date) ' Gibt z. B. 23 zurĂŒck (fĂŒr 23. Woche im Jahr)
Beispiel 2: Sicherer Monatswechsel mit Monatsende-Korrektur
Public Function AddiereMonateSicher(datum As Date, anzahlMonate As Long) As Date
Dim zieldatum As Date
Dim tagAmMonatsende As Boolean
' PrĂŒfen ob Quell-Datum am Monatsende
tagAmMonatsende = Day(datum) = Day(DateSerial(Year(datum), Month(datum) + 1, 0))
zieldatum = DateAdd("m", anzahlMonate, datum)
If tagAmMonatsende Then
' Zielmonat ebenfalls auf Monatsende setzen
zieldatum = DateSerial(Year(zieldatum), Month(zieldatum) + 1, 0)
End If
AddiereMonateSicher = zieldatum
End Function
Verwendung:
Debug.Print AddiereMonateSicher(#31.01.2025#, 1) ' Gibt 28.02.2025 zurĂŒck statt 02.03.2025
Beispiel 3: Zeitdifferenz in Jahren, Monaten und Tagen
Public Function ZeitDifferenzDetail(vonDatum As Date, bisDatum As Date) As String
Dim jahr As Integer, monat As Integer, tag As Integer
Dim tempDatum As Date
If bisDatum < vonDatum Then
ZeitDifferenzDetail = "-"
Exit Function
End If
jahr = DateDiff("yyyy", vonDatum, bisDatum)
If DateAdd("yyyy", jahr, vonDatum) > bisDatum Then jahr = jahr - 1
tempDatum = DateAdd("yyyy", jahr, vonDatum)
monat = DateDiff("m", tempDatum, bisDatum)
If DateAdd("m", monat, tempDatum) > bisDatum Then monat = monat - 1
tempDatum = DateAdd("m", monat, tempDatum)
tag = DateDiff("d", tempDatum, bisDatum)
ZeitDifferenzDetail = jahr & " Jahre, " & monat & " Monate, " & tag & " Tage"
End Function
Verwendung:
Debug.Print ZeitDifferenzDetail(#12.03.2018#, Date)
' Ausgabe: 7 Jahre, 2 Monate, 26 Tage (je nach Tagesdatum)
Beispiel 4: ISO-konformes Datum in Format yyyy-mm-dd
Public Function FormatISO(datum As Date) As String
FormatISO = Format(datum, "yyyy-mm-dd")
End Function
Verwendung:
Debug.Print FormatISO(Date) ' Ausgabe: z. B. 2025-06-07
Beispiel 5: Uhrzeit in lesbarem Format (24-Stunden + Sekunden)
Public Function FormatZeit(Optional dZeit As Variant) As String
If IsMissing(dZeit) Then dZeit = Now
FormatZeit = Format(dZeit, "hh:nn:ss")
End Function
Verwendung:
Debug.Print FormatZeit ' Ausgabe: 14:32:08
Bonus: Heute + x Tage/Wochen/Monate berechnen
Public Function HeutePlus(x As Long, einheit As String) As Date
HeutePlus = DateAdd(einheit, x, Date)
End Function
Verwendung:
Debug.Print HeutePlus(7, "d") ' Heute + 7 Tage
Debug.Print HeutePlus(3, "m") ' Heute + 3 Monate
Fazit
Die eingebauten Datumsfunktionen in VBA sind gut – aber nicht perfekt. Mit ein wenig Zusatzlogik lassen sich viele Probleme lösen und der Code wird klarer, wartbarer und benutzerfreundlicher. Gerade in Access-Datenbanken oder Excel-Automatisierungen lohnen sich diese kleinen Helferfunktionen – sie sparen Dir Zeit, vermeiden Fehler und bringen modernen Komfort in klassische VBA-Anwendungen.
Du willst Deine Datums- und Zeitfunktionen modular, mehrsprachig, fehlerfrei und robust gestalten? Ich helfe Dir gern bei der Entwicklung und Integration in Deine Anwendung.
đ DatenschĂ€fer – Auswertung, Analyse und Automatisierung fĂŒr KMU im Norden
đ§ Kontakt ĂŒber sesoft.de | â±ïž Access · VBA · Excel · Datum · Automatisierung
Keine Antworten