Datums- und Zeitfunktionen

Deutsches und amerikanisches Datums- und Zeitformat

Beim Umgang mit Datum und Uhrzeit muss VBA sowohl das das amerikanische Format berücksichtigen als auch das deutsche Format:

  • Deutsches Format:
    Datum
    : TT.MM.JJJJ, wobei T = Tag, M = Monat und J = Jahr.
    Beispiel: Der 8. September 2022 wird im deutschen Datumsformat als 08.09.2022 angegeben.
    Uhrzeit: die Angabe erfolgt auf 24-Stunden-Basis, z.B. 21:15 Uhr

  • Amerikanisches Format:
    Datum:
    MM/DD/YYYY, wobei M = Monat (Month), D = Tag (Day) und Y = Jahr (Year)
    Beispiel: Der 8. September 2022 wird im amerikanischen Datumsformat als 09/08/2022 angegeben.
    Uhrzeit: die Angabe erfolgt auf 12-Stunden-Basis
    Beispiel: 08:15 pm (pm steht für post meridiem = nach dem Mittag).
    08:15 am (am steht für ante meridiem = vor dem Mittag)

Datum und Uhrzeit im Direktfenster ausgeben:

Sub DatumUndUhrzeitImDirektfensterAusgeben()
' Deutsches Format
Debug.Print CDate("08.09.2022")
Debug.Print CDate("08:15")
Debug.Print CDate("20:15")
' Amerikanisches Format
Debug.Print #9/8/2022#
Debug.Print #8:15:00 AM#
Debug.Print #8:15:00 PM#
End Sub

Grundfunktionen

DateSerial, TimeSerial

Die Funktion DateSerial gibt ein Datum zurück, das auf einer Eingabe von Jahr (engl. Year), Monat (engl. Month) und Tag (engl. Day) basiert. Die Funktion TimeSerial gibt eine Uhrzeit zurück, die auf der Eingabe von Stunde (engl. Hour), Minute (engl. Minute) und Sekunde (engl. Second) basiert:

Sub DatumUndZeit()
Debug.Print DateSerial(2022, 9, 8) ' DateSerial(Year, Month, Day)
Debug.Print TimeSerial(20, 15, 0)  ' TimeSerial(Hour, Minute, Second)
End Sub

Date

Gibt das heutige Datum zurück:

Sub test_Date()
Dim dateHeute As Variant
dateHeute = Date
Debug.Print dateHeute
End Sub

Time

Gibt die aktuelle Systemzeit zurück:

Sub test_Time()
Dim dateUhrzeit As Date
dateUhrzeit = Time
Debug.Print dateUhrzeit
End Sub

Now

Gibt das aktuelle Systemdatum und die aktuelle Systemuhrzeit zurück:

Sub test_Now()
Dim dateJetzt As Date
dateJetzt = Now
Debug.Print dateJetzt
End Sub

Bestandteile eines Datums oder einer Uhrzeit ausgeben:

Sub Bestandteile_von_Datum_und_Uhrzeit()
' Datum
Debug.Print Day(Date) ' Tag
Debug.Print Month(Date) ' Monat
Debug.Print Year(Date) ' Jahr
' Uhrzeit
Debug.Print Hour(Time) ' Stunde
Debug.Print Minute(Time) ' Minute
Debug.Print Second(Time) ' Sekunde
End Sub

Weekday

Ermittelt den Wochentag. Die Syntax ist
Weekday(date, [ firstdayofweek ])
wobei:
date                        Erforderlich. Datum
firstdayofweek     Optional. Eine Konstante, die den ersten Tag der Woche angibt, siehe Tabelle unter Zeitformat

Beispiele

Sub Wochentag()
Debug.Print Weekday(DateSerial(2022, 9, 8), vbSunday) ' Liefert 5 (Donnerstag)
Debug.Print Weekday(DateSerial(2022, 9, 8), vbMonday) ' Liefert 4 (Donnerstag)
End Sub

DateAdd

Die DateAdd-Funktion gibt einen Datumswert zurück, zu dem ein angegebenes Zeitintervall hinzuaddiert wurde. Die Syntax ist

DateAdd(Interval As String, Number As Double, Date As Variant) As Variant

Die Argumente sind wie folgt:

  • Interval – Einheit für das zu addierende Zeitintervall.
  • Number – die Anzahl der Zeitintervalle, die hinzugefügt werden sollen. Kann positiv oder negativ sein.
  • Date – Datum, zu dem das Zeitintervall hinzugefügt wird.

Die Einheiten für das Zeitintervall, d.h. für die Variable Interval, sind wie folgt (die Einheit muss in Anführungszeichen eingefügt werden.

Anmerkung: das Zeitintervall für „d“, „y“ und „w“ beträgt jeweils einen Tag.

Beispiele

Sub DateAdd_Alternativen()
Debug.Print DateAdd("m", 2, #4/1/2022#) ' amerikanische Schreibweise des Datums
Debug.Print DateAdd("m", 2, CDate("01.04.2022")) ' deutsche Schreibweise des Datums
Debug.Print DateAdd("m", 2, DateSerial(2022, 4, 1))
Debug.Print DateAdd("m", 2, DateValue("April 1, 2022"))
End Sub

Sub DateAdd_Variable()
Dim datum As Date
datum = #4/1/2022#
Debug.Print DateAdd("m", 2, datum)
End Sub

Sub DateAdd_Tag1()
Dim datum As Date
datum = DateAdd("d", 10, CDate("01.04.2022"))
Debug.Print datum
datum = DateAdd("y", 10, CDate("01.04.2022"))
Debug.Print datum
datum = DateAdd("w", 10, CDate("01.04.2022"))
Debug.Print datum
End Sub

Sub DateAdd_Tag2()
Dim datum as Date    
datum = DateAdd("d", -10, #4/1/2022#)
Debug.Print datum
End Sub

Sub DateAdd_Jahre()
Debug.Print DateAdd("yyyy", 4, #4/1/2022#)
End Sub

Sub DateAdd_Quartal()
Debug.Print DateAdd("q", 2, #4/1/2022#)
End Sub

DateDiff

Gibt die Differenz zwischen zwei Datumsangaben zurück. Die Syntax ist

DateDiff(interval, date1, date2, [ firstdayofweek, [ firstweekofyear ]] )

wobei:
Intervall                 Erforderlich. Einheit für das Zeitintervall, siehe Tabelle für die Funktion DateAdd
date1, date2         Erforderlich; Datumsangaben
firstdayofweek     Optional. Eine Konstante, die den ersten Tag der Woche angibt, siehe Tabelle für das Zeitformat
firstweekofyear    Optional. Eine Konstante, die die erste Woche des Jahres angibt, siehe Tabelle für das Zeiformat

Beispiele:

Sub Darum_und_Uhrzeit_Differenz()
Debug.Print DateDiff("h", TimeSerial(10, 0, 0), TimeSerial(12, 0, 0)) & " Stunden"
Debug.Print DateDiff("n", TimeSerial(15, 0, 0), TimeSerial(15, 10, 0)) & " Minuten"
Debug.Print DateDiff("yyyy", DateSerial(2020, 1, 1), DateSerial(2022, 1, 1)) & " Jahre"
Debug.Print DateDiff("m", DateSerial(2021, 1, 1), DateSerial(2022, 1, 1)) & " Monate"
Debug.Print DateDiff("ww", DateSerial(2021, 1, 1), DateSerial(2022, 1, 1)) & " Wochen"
Debug.Print DateDiff("d", DateSerial(2021, 1, 1), DateSerial(2022, 1, 1)) & " Tage"
Debug.Print DateDiff("ww", DateSerial(2012, 12, 30), _
DateSerial(2013, 1, 6), vbMonday, vbFirstFourDays) & " KW"
End Sub

Datum und Zeit formatieren

Hierfür wird die VBA Funktion „Format“ verwendet. Die Syntax ist wie folgt
Format(Ausdruck, [ Format ], [ FirstDayOfWeek ], [ FirstWeekOfYear ])

wobei

  • Ausdruck     Erforderlich. Jeder gültige Ausdruck.
  • Format     Optional. Formatausdruck.
  • FirstDayOfWeek     Optional. Eine Konstante, die den ersten Tag der Woche angibt.
  • FirstWeekOfYear     Optional. Eine Konstante, die die erste Woche des Jahres angibt.

Das Argument Format hat folgende Einstellungen

Das Argument firstdayofweek hat die folgenden Einstellungen:

Das Argument firstweekofyear hat die folgenden Einstellungen:

Beispiele:

Sub Datum_und_Uhrzeit_Formatieren_1()
Dim datum As Date
datum = CDate("08.09.2022")
Debug.Print Format(datum, "mmmm")
Debug.Print Format(datum, "dddd dd. mmmm yyyy")
Debug.Print Format(datum, "dddd dd.mm.yyyy")
End Sub

Sub Darum_und_Uhrzeit_Formatieren_2()
Debug.Print Format(DateSerial(2012, 9, 1), "dddddd")      ' Samstag, 1. September 2012
Debug.Print Format(DateSerial(2012, 9, 1), "w", vbSunday) ' = 7 (Samstag)
Debug.Print Format(DateSerial(2012, 9, 1), "w", vbMonday) ' = 6 (Samstag)
Debug.Print Format(DateSerial(2013, 1, 1), "ww", vbMonday, vbFirstJan1)     ' = KW 1
Debug.Print Format(DateSerial(2013, 1, 1), "ww", vbMonday, vbFirstFourDays) ' = KW 1
Debug.Print Format(DateSerial(2012, 1, 1), "ww", vbMonday, vbFirstJan1)     ' = KW 1
Debug.Print Format(DateSerial(2012, 1, 1), "ww", vbMonday, vbFirstFourDays) ' = KW 52
End Sub

Timer

Die VBA-Timer-Funktion gibt die Anzahl der Sekunden zurück, die seit Mitternacht des aktuellen Tages vergangen sind (als Single-Datentyp).

Beispiele

Sub DieVBATimerFunktionVerwenden()
Dim sekundenSeit As Single
sekundenSeit = Timer()
Debug.Print "Die seit Mitternacht verstrichene Zeit in Sekunden ist"; sekundenSeit
End Sub


Sub DieAktuelleZeitErhalten()
Dim sekundenSeit As Single
Dim dblZeit As Double
Dim dieAktuelleZeit As Variant
sekundenSeit = Timer()
dblZeit = sekundenSeit / 86400#
dieAktuelleZeit = Format(dblZeit, "hh:mm:ss")
Debug.Print "Die seit Mitternacht verstrichene Zeit in Sekunden ist" & " " & sekundenSeit & vbNewLine & _
"Die aktuelle Zeit ist:" & " " & dieAktuelleZeit
End Sub

VBA-Code zum Ermitteln der Ausführungsdauer eines Makros

Sub Ausfuehrungzeit_in_Sekonden_ermitteln()
'Zweck: Ermittelt, wie viele Sekunden es dauert, bis der Code vollständig ausgeführt wird
Dim StartZeit As Double, VerstricheneZeit As Double
Dim i As Long, x As Double
' Speichere die Startzeit
StartZeit = Timer
Debug.Print StartZeit

'**********************************
' Hier den Code einfuegen, z. B. ..
For i = 1 To 1000000
    x = CDbl(i) * CDbl(i)
Next i
'**********************************

' Ermittelt, wie viele Sekunden Code zum Ausführen benötigte
'VerstricheneZeit = Round(Timer - StartZeit, 2)
VerstricheneZeit = Timer - StartZeit

'Notify user in seconds
Debug.Print "Dieser Code wurde erfolgreich ausgeführt in " & VerstricheneZeit & " seconds"
End Sub

Oft reicht die Genauigkeit der Zeitmessung mit der Funktion Timer nicht aus. Die VBA-Funktion Timer gibt die seit Mitternacht verstrichenen Sekunden mit einer Genauigkeit von 1/256 Sekunde (3,90625 Millisekunden) auf Windows-basierten PCs zurück.

Eine genauere Messung ist mit der Systemfunktion „QueryPerformanceCounter“ möglich. Diese Funktion ermittelt die Zeit mit Hilfe des Performance Counters. Das ist ein Hardwarebaustein, der mit 3,19 MHz getaktet wird, und 0,313 Mikrosekunden genau ist (etwa 10.000 mal genauer wie die Timer Funktion).

Private Declare PtrSafe Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long
Private Declare PtrSafe Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub Test_2()
Dim crStartTime As Currency
Dim crEndTime As Currency
Dim crFrequency As Currency
Dim i As Long, x As Double

If QueryPerformanceFrequency(crFrequency) Then
   QueryPerformanceCounter crStartTime
   For i = 1 To 1000000
       x = CDbl(i) * CDbl(i)
   Next i
   QueryPerformanceCounter crEndTime
   Debug.Print "Elapsed time: " & vbNewLine & ((crEndTime - crStartTime) * 1000) / crFrequency & " ms"
End If

Dieser Beitrag hat 5 Kommentare

  1. Alois

    Hallo

    Da ich auf deiner Seite nun schon fast alles gelernt habe, noch eine Frage zu der Funktion DateDiff.
    Wenn ich im Excelblatt die Formel =DateDif (Range(„A1″);Heute();“Y“) erscheint das Ergebnis 67 Richtig ( „A1“) ist das Datum 20.5.56 Schreibe ich aber in VBA Range („A2“).Value = DateDiff („YYYY“, Range(„A1“), Date) wird 68 angezeigt was ist da los?

    Vielen Dank schöne Woche und Gruß
    Alois

    1. admin

      Hallo Alois,

      der Zeitunterschied zwischen dem 20.5.56 und heute (14.02.2024) beträgt 67,75 Jahre.

      Gibt man in der Excel Funktion DateDif für den letzten Parameter (=Einheit) den Wert „Y“ wird laut der Microsoft Hilfe die Anzahl der vollständigen Jahre im Zeitraum zurückgegeben, also 67 Jahre.

      Die VBA Funktion scheint die Anzahl der Jahre zwischen 1956 und 2024 zurückzugeben, also 68. Ein extremes Beispiel, das ich in der Microsoft Hilfe gefunden habe, ist der Zeitunterschied zwischen dem 31.12.2023 und dem 01.01.2024. Die VBA Funktion DateDiff gibt in diesem Fall den Wert 1 Jahr zurück, obwohl nur ein Tag verstrichen ist. Ein anderes Beispiel ist der Zeitunterschied zwischen dem 20.05.1956 und den 31.12.2023. Dafür ist der Rückgabewert der VBA DateDiff Funktion 67 Jahre. Für den Zeitunterschied zwischen dem 20.05.1956 und dem 01.01.2024 ist der Rückgabewert der VBA DateDiff Funktion dagegen 68 Jahre.

      Viele Grüße
      Stefan

  2. Alois

    hallo stefan
    vielen dank für deine infos ist alles sehr undurchsichtig habe bestimmt 10 verschiedene seiten durchgeschaut aber jeder schreibt was anderes da bin ich bei dir immer noch am bessten gehalten, vielen dank dafür wenn ich das ganze auch immer noch nicht verstehe eine funktion mehrere ergebnisse
    gruss und gesundheit
    alois

Schreibe einen Kommentar