Datumsfunktionen

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

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

siehe auch
Date As Variant

Gibt das aktuelle Datum zurück.

Debug.Print Date

DateAdd

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

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

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

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

DateValue(Date As Variant) As Variant

Wandelt einen beliebigen Wert Date in einen Variantwert um, der dem Datumswert entspricht.

Day

Day(Date As Variant) As Variant

Gibt aus Date den Tag des Monats (1-31) zurück.

Debug.Print Day("")
 

Hour

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

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

Month(Date As Variant) As Variant

Gibt aus Date den Monat (1-12) zurück.

Debug.Print Month("")
 

MonthName

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

siehe auch
Now As Variant

Gibt das aktuelle Datum und die aktuelle Zeit zurück.

Debug.Print Now
 ::

Second

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

siehe auch
Time As Variant

Gibt die aktuelle Uhrzeit zurück.

Debug.Print Time
::

Timer

Timer As Single

Gibt die Anzahl der seit Mitternacht vergangenen Sekunden zurück. Die Nachkommastellen zeigen die Hundertstelsekunden.

Debug.Print Timer
 

TimeSerial

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

TimeValue(Time As Variant) As Variant

Wandelt einen beliebigen Wert Time in einen Variantwert um, der einer Zeitangabe entspricht.

Weekday

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

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

Year(Date As Variant) As Variant

Gibt aus Date die Jahreszahl zurück.

Debug.Print Year("")