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("")