Wie nutze ich modernere Datumsfunktionen per VBA?

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. Februar
  • DateDiff("ww", ...) zĂ€hlt Wochenbeginn am Sonntag, nicht nach ISO-Standard
  • Format(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

Kategorien:

Schlagwörter:

Keine Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert