Inhaltsverzeichnis
ToggleDeutsches 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 UhrAmerikanisches 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
Pingback: Eingebaute Funktionen - Excel VBA Tipps
Pingback: Eingebaute Funktionen - Excel VBA Tipps
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
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
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