Datums- und Zeitangaben speichert VBA intern als Fließkommazahl, also wie den Datentyp Double. Der Ganzzahlanteil wird als Datum, und die Nachkommastellen als Uhrzeit interpretiert. Der „Tag 1“ war der 31.12.1899. Seitdem wird für jeden Tag 1 hinzugezählt, für frühere Termine jeweils 1 abgezogen. Ohne Nachkommastelle ist es Mitternacht, um 12 Uhr Mittags beträgt die Nachkommastelle 0,5 usw. Reine Datumsfunktionen geben keine Nachkommastelle zurück (also immer Mitternacht des entsprechenden Tages). Umgekehrt geben reine Zeitfunktionen immer einen Wert zwischen 0 und 1 zurück.
Streng genommen werden auch Bruchteile einer Sekunde gespeichert. Daraus kann sich, z. B. bei der Verwendung von Now(), das Problem ergeben, dass zwei Variablen scheinbar denselben Datumswert enthalten, aber doch nicht identisch sind. Bei Vergleichen muss man also Vorsicht walten lassen. Eine andere kleinere Komplikation kann entstehen, wenn man eine Zeitangabe als Datum interpretieren will - sie bezieht sich ja stets auf den „Tag 0“, also den 30.12.1899.
Theoretisch ist jedes Datum zwischen dem 01.01.100 und dem 31.12.9999 möglich. Wenn man aber mit dem standardmäßig voreingestellten gregorianischen Kalender arbeitet, werden auch Termine vor dem 15.10.1582 danach berechnet, obwohl vor diesem Tag noch der julianische Kalender galt.
Ein Datum kann mit ganz unterschiedlichen Schreibweisen angegeben werden;
neben der z.B. in SQL üblichen Datumsschreibweise
(#1/31/#
bzw.
#1/31/ 23:59:59#
)
auch entweder als Zahl (siehe oben), oder als String, der ein eindeutiges Datum
angibt. Die folgenden Angaben beziehen sich alle auf das gleiche Datum:
#1/31/# #1/31# "31.01." "31.1." "31. Januar" "31. Jan "
Ohne Jahreszahl betrifft die Datumsangabe das aktuelle Jahr. Zweistellige Jahreszahlen werden üblicherweise als Angabe für die Jahre 1930 bis 2029 interpretiert. Sehr alte VBA-Versionen haben dies in Abhängigkeit zu Einstellungen des Betriebssystems interpretiert, häufig für die Jahre 1901 bis 1999. Sicherheitshalber sollte man eher vierstellige Jahresangaben nutzen.
Calendar As VbCalendar = vbCalGreg
Zeigt an, ob der gregorianische Kalender oder der islamische Hirji-Kalender verwendet wird, bzw. schaltet zwischen diesen Kalendern um. Je nachdem, welcher Kalender verwendet wird, ändern sich sämtliche nachfolgenden Datumsberechnungen.
Function Heute() Dim Datum As Date Datum = "" Debug.Print "Heute ist der "; If Calendar = vbCalGreg Then Calendar = vbCalHijri Debug.Print Datum & " Anno Hegirae" Calendar = vbCalGreg Else Calendar = vbCalGreg Debug.Print Datum & " Anno Domini" Calendar = vbCalHijri End If End Sub
Date As Variant
Gibt das aktuelle Datum zurück.
Debug.Print Date
DateAdd(Interval As String, Number As Double, Date As Variant) As Variant
Addiert ein mit Intervall
und Number
bestimmtes
Zeitintervall zu Date
hinzu.
Für Intervall
sind eine Reihe fest
definierter Strings
zulässig. Andere Angaben führen zu einem Fehler.
Die mit Number
angegebene Anzahl von Intervallen wird addiert. Falls
Number
negativ ist, wird nicht addiert, sondern subtrahiert. Falls
Number
Nachkommastellen hat, werden die Nachkommastellen ignoriert.
Date
kann vom Datentyp Date sein, oder eine Zeichenfolge, die ein
Datum angibt.
Debug.Print DateAdd("q", 1, "20.05.") 20.08. Debug.Print DateAdd("m", -1, "31.07.") 30.06.
DateDiff(Interval As String, Date1 As Variant, Date2 As Variant, [FirstDayOfWeek As VbDayOfWeek = vbSunday], [FirstWeekOfYear As VbFirstWeekOfYear = vbFirstJan1]) As Variant
Gibt an, welcher Zeitraum zwischen Date1
und Date2
vergangen ist. Falls Date1
größer ist als Date2
,
ist das Ergebnis negativ.
Mit Intervall
muss ein fest
definierter String
übergeben werden, der die Art des zu berechnenden Zeitraums angibt. Sofern dort
„w“ oder „ww“ ausgewählt wird, kann mit den Argumenten FirstDayOfWeek
aus der Aufzählung
VbDayOfWeek
und FirstWeekOfYear
aus der Aufzählung
VbFirstWeekOfYear
ausgewählt werden, welcher Wochentag bzw. welche Woche der/die Erste ist.
Debug.Print DateDiff("h", #1/1#, "2. Jan") 24
DatePart(Interval As String, Date As Variant, [FirstDayOfWeek As VbDayOfWeek = vbSunday], [FirstWeekOfYear As VbFirstWeekOfYear = vbFirstJan1]) As Variant
Gibt an, in welchem Zeitraum Date
liegt.
Mit Intervall
muss ein fest
definierter String
übergeben werden, der die Art des zu berechnenden Zeitraums angibt. Sofern dort
„w“ oder „ww“ ausgewählt wird, kann mit den Argumenten
FirstDayOfWeek
aus der Aufzählung
VbDayOfWeek
und FirstWeekOfYear
aus der Aufzählung
VbFirstWeekOfYear
ausgewählt werden, welcher Wochentag bzw. welche Woche der/die Erste ist.
Debug.Print DatePart("q", "31.12") 4
DateSerial(Year As Integer, Month As Integer, Day As Integer) As Variant
Gibt das Datum zurück, das über die Zahlen Year
, Month
und Day
bestimmt wird.
Falls sich Month
oder Day
außerhalb der eigentlich
gültigen Bereiche (1-12 bzw. 1-31) befinden, wird der „überzählige“
Teil zum Ergebnis hinzugezählt bzw., bei negativen Werten, abgezogen.
Debug.Print DateSerial(, , ) Debug.Print DateSerial(, 0, 15) 15.12. Debug.Print DateSerial(, 1, 32) 01.02.
DateValue(Date As Variant) As Variant
Wandelt einen beliebigen Wert Date
in einen Variantwert um, der
dem Datumswert entspricht.
Day(Date As Variant) As Variant
Gibt aus Date
den Tag des Monats (1-31) zurück.
Debug.Print Day("")
Hour(Time As Variant) As Variant
Gibt aus Time
die Stunde (0-23) zurück.
Debug.Print Hour(" 07:30:55") 7 Debug.Print Hour("23:05") 23 Debug.Print Hour(0.5) 12
Minute(Time As Variant) As Variant
Gibt aus Time
die Minute (0-59) zurück.
Debug.Print Minute(" 07:30:55") 30 Debug.Print Minute("23:05") 5
Month(Date As Variant) As Variant
Gibt aus Date
den Monat (1-12) zurück.
Debug.Print Month("")
MonthName(Month As Long, [Abbreviate As Boolean = False]) As String
Gibt den Monatsnamen von Month
zurück. Month
muss
zwingend zwischen 1 und 12 liegen, andere Werte führen zu einem Fehler und können
u.U. sogar zu einem Programmabsturz führen!
Mit Abbreviate
kann angegeben werden, dass der Name abgekürzt wird.
Debug.Print MonthName(3) März Debug.Print MonthName(12, True) Dez
Now As Variant
Gibt das aktuelle Datum und die aktuelle Zeit zurück.
Debug.Print Now ::
Second(Time As Variant) As Variant
Gibt aus Time
die Sekunde (0-59) zurück.
Debug.Print Second(" 07:30:55") 55 Debug.Print Second("23:05") 0
Time As Variant
Gibt die aktuelle Uhrzeit zurück.
Debug.Print Time ::
Timer As Single
Gibt die Anzahl der seit Mitternacht vergangenen Sekunden zurück. Die Nachkommastellen zeigen die Hundertstelsekunden.
Debug.Print Timer
TimeSerial(Hour As Integer, Minute As Integer, Second As Integer) As Variant
Gibt die Zeit zurück, die mit Hour
, Minute
und
Second
bestimmt wird.
Falls sich Minute
oder Second
außerhalb der eigentlich
gültigen Bereiche (0-59) befinden, wird der „überzählige“ Teil zum Ergebnis
hinzugezählt bzw., bei negativen Werten, abgezogen. Hour
sollte stets
im gültigen Bereich (1-23) liegen, da sonst seltsame Ergebnisse auftreten können
(es könnte ein Datum mitgeliefert werden, das um den 30.12.1899 liegt) - es sei
denn, die Berechnungen in Minute
und Second
sorgen
wiederum dafür, dass das Gesamtergebnis wieder zwischen #00:00:00#
und #23:59:59#
liegt.
Debug.Print TimeSerial(23, 59, 59) 23:59:59 Debug.Print TimeSerial(23, -1, 59) 22:59:59 Debug.Print TimeSerial(12, 61, 0) 13:01:00
TimeValue(Time As Variant) As Variant
Wandelt einen beliebigen Wert Time
in einen Variantwert um, der
einer Zeitangabe entspricht.
Weekday(Date As Variant, [FirstDayOfWeek As VbDayOfWeek = vbSunday]) As Variant
Gibt zurück, der wievielte Tag der Woche (1-7) ist. Mit FirstDayOfWeek
kann ausgewählt werden, mit welchem Wochentag begonnen wird zu zählen.
Debug.Print Weekday("")
WeekdayName(Weekday As Long, [Abbreviate As Boolean = False], [FirstDayOfWeek As VbDayOfWeek = vbUseSystemDayOfWeek]) As String
Gibt den Wochentagsnamen von Weekday
zurück. Weekday
muss zwingend zwischen 1 und 7 liegen, andere Werte führen zu einem Fehler und
können u.U. sogar zu einem Programmabsturz führen!
Mit Abbreviate
kann angegeben werden, dass der Name abgekürzt wird.
Mit FirstDayOfWeek
kann ausgewählt werden, mit welchem Wochentag
begonnen wird zu zählen. Achtung: Die Voreinstellung ist dabei - anders
als bei allen anderen Funktionen, die auf die Wochentagsaufzählung zugreifen -
vbUseSystemDayOfWeek
.
Debug.Print WeekdayName(1) Montag
Year(Date As Variant) As Variant
Gibt aus Date
die Jahreszahl zurück.
Debug.Print Year("")