VBA
Datums-Uhrzeit-Manipulation
Suche…
Kalender
VBA unterstützt zwei Kalender: Gregorian und Hijri
Die Calendar
wird verwendet, um den aktuellen Kalender zu ändern oder anzuzeigen.
Die zwei Werte für den Kalender sind:
Wert | Konstante | Beschreibung |
---|---|---|
0 | vbCalGreg | Gregorianischer Kalender (Standard) |
1 | vbCalHijri | Hijri-Kalender |
Beispiel
Sub CalendarExample()
'Cache the current setting.
Dim Cached As Integer
Cached = Calendar
' Dates in Gregorian Calendar
Calendar = vbCalGreg
Dim Sample As Date
'Create sample date of 2016-07-28
Sample = DateSerial(2016, 7, 28)
Debug.Print "Current Calendar : " & Calendar
Debug.Print "SampleDate = " & Format$(Sample, "yyyy-mm-dd")
' Date in Hijri Calendar
Calendar = vbCalHijri
Debug.Print "Current Calendar : " & Calendar
Debug.Print "SampleDate = " & Format$(Sample, "yyyy-mm-dd")
'Reset VBA to cached value.
Cached = Calendar
End Sub
Dieses Sub druckt folgendes aus:
Current Calendar : 0
SampleDate = 2016-07-28
Current Calendar : 1
SampleDate = 1437-10-23
Basisfunktionen
Rufen Sie System DateTime ab
VBA unterstützt 3 integrierte Funktionen, um Datum und / oder Uhrzeit von der Systemuhr abzurufen.
Funktion | Rückgabetyp | Rückgabewert |
---|---|---|
Jetzt | Datum | Gibt das aktuelle Datum und die aktuelle Uhrzeit zurück |
Datum | Datum | Gibt den Datumsteil des aktuellen Datums und der aktuellen Uhrzeit zurück |
Zeit | Datum | Gibt den Zeitabschnitt des aktuellen Datums und der aktuellen Uhrzeit zurück |
Sub DateTimeExample()
' -----------------------------------------------------
' Note : EU system with default date format DD/MM/YYYY
' -----------------------------------------------------
Debug.Print Now ' prints 28/07/2016 10:16:01 (output below assumes this date and time)
Debug.Print Date ' prints 28/07/2016
Debug.Print Time ' prints 10:16:01
' Apply a custom format to the current date or time
Debug.Print Format$(Now, "dd mmmm yyyy hh:nn") ' prints 28 July 2016 10:16
Debug.Print Format$(Date, "yyyy-mm-dd") ' prints 2016-07-28
Debug.Print Format$(Time, "hh") & " hour " & _
Format$(Time, "nn") & " min " & _
Format$(Time, "ss") & " sec " ' prints 10 hour 16 min 01 sec
End Sub
Timerfunktion
Die Timer
Funktion gibt eine Single zurück, die die Anzahl der seit Mitternacht verstrichenen Sekunden angibt. Die Genauigkeit beträgt eine Hundertstelsekunde.
Sub TimerExample()
Debug.Print Time ' prints 10:36:31 (time at execution)
Debug.Print Timer ' prints 38191,13 (seconds since midnight)
End Sub
Da die Now
und Time
Funktionen nur sekundengenau sind, bietet Timer
eine bequeme Möglichkeit, die Genauigkeit der Zeitmessung zu erhöhen:
Sub GetBenchmark()
Dim StartTime As Single
StartTime = Timer 'Store the current Time
Dim i As Long
Dim temp As String
For i = 1 To 1000000 'See how long it takes Left$ to execute 1,000,000 times
temp = Left$("Text", 2)
Next i
Dim Elapsed As Single
Elapsed = Timer - StartTime
Debug.Print "Code completed in " & CInt(Elapsed * 1000) & " ms"
End Sub
IsDate ()
IsDate () prüft, ob ein Ausdruck ein gültiges Datum ist oder nicht. Gibt einen Boolean
.
Sub IsDateExamples()
Dim anything As Variant
anything = "September 11, 2001"
Debug.Print IsDate(anything) 'Prints True
anything = #9/11/2001#
Debug.Print IsDate(anything) 'Prints True
anything = "just a string"
Debug.Print IsDate(anything) 'Prints False
anything = vbNull
Debug.Print IsDate(anything) 'Prints False
End Sub
Extraktionsfunktionen
Diese Funktionen verwenden eine Variant
, die in ein Date
werden kann, und geben eine Integer
die einen Teil eines Datums oder einer Uhrzeit darstellt. Wenn der Parameter nicht in ein Date
, führt dies zu einem Laufzeitfehler 13: Typenkonflikt.
Funktion | Beschreibung | Rückgabewert |
---|---|---|
Jahr() | Gibt den Jahresanteil des Datumsarguments zurück. | Ganzzahl (100 bis 9999) |
Monat() | Gibt den Monatsteil des Datumsarguments zurück. | Ganzzahl (1 bis 12) |
Tag() | Gibt den Tagteil des Datumsarguments zurück. | Ganzzahl (1 bis 31) |
Wochentag() | Gibt den Wochentag des Datumsarguments zurück. Akzeptiert ein optionales zweites Argument, das den ersten Tag der Woche definiert | Ganzzahl (1 bis 7) |
Stunde() | Gibt den Stundenteil des Datumsarguments zurück. | Ganzzahl (0 bis 23) |
Minute() | Gibt den Minutenteil des Datumsarguments zurück. | Ganzzahl (0 bis 59) |
Zweite() | Gibt den zweiten Teil des Datumsarguments zurück. | Ganzzahl (0 bis 59) |
Beispiele:
Sub ExtractionExamples()
Dim MyDate As Date
MyDate = DateSerial(2016, 7, 28) + TimeSerial(12, 34, 56)
Debug.Print Format$(MyDate, "yyyy-mm-dd hh:nn:ss") ' prints 2016-07-28 12:34:56
Debug.Print Year(MyDate) ' prints 2016
Debug.Print Month(MyDate) ' prints 7
Debug.Print Day(MyDate) ' prints 28
Debug.Print Hour(MyDate) ' prints 12
Debug.Print Minute(MyDate) ' prints 34
Debug.Print Second(MyDate) ' prints 56
Debug.Print Weekday(MyDate) ' prints 5
'Varies by locale - i.e. will print 4 in the EU and 5 in the US
Debug.Print Weekday(MyDate, vbUseSystemDayOfWeek)
Debug.Print Weekday(MyDate, vbMonday) ' prints 4
Debug.Print Weekday(MyDate, vbSunday) ' prints 5
End Sub
DatePart () - Funktion
DatePart()
ist auch eine Funktion, die einen Teil eines Datums DatePart()
funktioniert jedoch anders und lässt mehr Möglichkeiten zu als die obigen Funktionen. Es kann zum Beispiel das Quartal des Jahres oder die Woche des Jahres zurückgeben.
Syntax:
DatePart ( interval, date [, firstdayofweek] [, firstweekofyear] )
Intervall Argument kann sein:
Intervall | Beschreibung |
---|---|
"JJJJ" | Jahr (100 bis 9999) |
"y" | Tag des Jahres (1 bis 366) |
"m" | Monat (1 bis 12) |
"q" | Quartal (1 bis 4) |
"ww" | Woche (1 bis 53) |
"w" | Wochentag (1 bis 7) |
"d" | Tag des Monats (1 bis 31) |
"h" | Stunde (0 bis 23) |
"n" | Minute (0 bis 59) |
"s" | Zweite (0 bis 59) |
firstdayofweek ist optional. Es ist eine Konstante, die den ersten Tag der Woche angibt. Wenn nicht angegeben, wird vbSunday
angenommen.
firstweekofyear ist optional. Es ist eine Konstante, die die erste Woche des Jahres angibt. Wenn nicht angegeben, wird davon ausgegangen, dass die erste Woche die Woche ist, in der der 1. Januar stattfindet.
Beispiele:
Sub DatePartExample()
Dim MyDate As Date
MyDate = DateSerial(2016, 7, 28) + TimeSerial(12, 34, 56)
Debug.Print Format$(MyDate, "yyyy-mm-dd hh:nn:ss") ' prints 2016-07-28 12:34:56
Debug.Print DatePart("yyyy", MyDate) ' prints 2016
Debug.Print DatePart("y", MyDate) ' prints 210
Debug.Print DatePart("h", MyDate) ' prints 12
Debug.Print DatePart("Q", MyDate) ' prints 3
Debug.Print DatePart("w", MyDate) ' prints 5
Debug.Print DatePart("ww", MyDate) ' prints 31
End Sub
Berechnungsfunktionen
DateDiff ()
DateDiff()
gibt ein Long
das die Anzahl der Zeitintervalle zwischen zwei angegebenen Daten angibt.
Syntax
DateDiff ( interval, date1, date2 [, firstdayofweek] [, firstweekofyear] )
- Intervall kann ein beliebiges Intervall sein, das in der
DatePart()
Funktion definiert ist - Datum1 und Datum2 sind die beiden Datumsangaben, die Sie bei der Berechnung verwenden möchten
- firstdayofweek und firstweekofyear sind optional. Erläuterungen dazu finden Sie unter
DatePart()
Beispiele
Sub DateDiffExamples()
' Check to see if 2016 is a leap year.
Dim NumberOfDays As Long
NumberOfDays = DateDiff("d", #1/1/2016#, #1/1/2017#)
If NumberOfDays = 366 Then
Debug.Print "2016 is a leap year." 'This will output.
End If
' Number of seconds in a day
Dim StartTime As Date
Dim EndTime As Date
StartTime = TimeSerial(0, 0, 0)
EndTime = TimeSerial(24, 0, 0)
Debug.Print DateDiff("s", StartTime, EndTime) 'prints 86400
End Sub
DateAdd ()
DateAdd()
gibt ein Date
zu dem ein angegebenes Datum oder Zeitintervall hinzugefügt wurde.
Syntax
DateAdd ( interval, number, date )
- Intervall kann ein beliebiges Intervall sein, das in der
DatePart()
Funktion definiert ist - number Numerischer Ausdruck, der die Anzahl der Intervalle angibt, die Sie hinzufügen möchten. Es kann positiv sein (um Datumsangaben in der Zukunft zu erhalten) oder negativ (um Datumsangaben in der Vergangenheit zu erhalten).
- Datum ist ein
Date
oder ein Literal, das das Datum darstellt, zu dem das Intervall hinzugefügt wird
Beispiele:
Sub DateAddExamples()
Dim Sample As Date
'Create sample date and time of 2016-07-28 12:34:56
Sample = DateSerial(2016, 7, 28) + TimeSerial(12, 34, 56)
' Date 5 months previously (prints 2016-02-28):
Debug.Print Format$(DateAdd("m", -5, Sample), "yyyy-mm-dd")
' Date 10 months previously (prints 2015-09-28):
Debug.Print Format$(DateAdd("m", -10, Sample), "yyyy-mm-dd")
' Date in 8 months (prints 2017-03-28):
Debug.Print Format$(DateAdd("m", 8, Sample), "yyyy-mm-dd")
' Date/Time 18 hours previously (prints 2016-07-27 18:34:56):
Debug.Print Format$(DateAdd("h", -18, Sample), "yyyy-mm-dd hh:nn:ss")
' Date/Time in 36 hours (prints 2016-07-30 00:34:56):
Debug.Print Format$(DateAdd("h", 36, Sample), "yyyy-mm-dd hh:nn:ss")
End Sub
Umwandlung und Schöpfung
CDate ()
CDate()
konvertiert etwas von einem beliebigen Datentyp in einen Date
Datentyp
Sub CDateExamples()
Dim sample As Date
' Converts a String representing a date and time to a Date
sample = CDate("September 11, 2001 12:34")
Debug.Print Format$(sample, "yyyy-mm-dd hh:nn:ss") ' prints 2001-09-11 12:34:00
' Converts a String containing a date to a Date
sample = CDate("September 11, 2001")
Debug.Print Format$(sample, "yyyy-mm-dd hh:nn:ss") ' prints 2001-09-11 00:00:00
' Converts a String containing a time to a Date
sample = CDate("12:34:56")
Debug.Print Hour(sample) ' prints 12
Debug.Print Minute(sample) ' prints 34
Debug.Print Second(sample) ' prints 56
' Find the 10000th day from the epoch date of 1899-12-31
sample = CDate(10000)
Debug.Print Format$(sample, "yyyy-mm-dd") ' prints 1927-05-18
End Sub
Beachten Sie, dass VBA hat auch eine lose typisierte CVDate()
, die Funktionen in der gleichen Weise wie die CDate()
andere Funktion als die Rückkehr ein Datum eingegeben Variant
anstelle eines stark typisierten Date
. Die CDate()
-Version sollte bevorzugt werden, wenn an einen Date
Parameter übergeben oder einer Date
Variablen CVDate()
, und die CVDate()
-Version sollte bevorzugt werden, wenn an einen Variant
Parameter übergeben oder einer Variant
Variablen CVDate()
wird. Dies vermeidet ein implizites Casting.
DateSerial ()
DateSerial()
Funktion dient zum Erstellen eines Datums. Es gibt ein Date
für ein bestimmtes Jahr, einen Monat und einen Tag zurück.
Syntax:
DateSerial ( year, month, day )
Mit Argumenten für Jahr, Monat und Tag sind Ganzzahlen gültig (Jahr von 100 bis 9999, Monat von 1 bis 12, Tag von 1 bis 31).
Beispiele
Sub DateSerialExamples()
' Build a specific date
Dim sample As Date
sample = DateSerial(2001, 9, 11)
Debug.Print Format$(sample, "yyyy-mm-dd") ' prints 2001-09-11
' Find the first day of the month for a date.
sample = DateSerial(Year(sample), Month(sample), 1)
Debug.Print Format$(sample, "yyyy-mm-dd") ' prints 2001-09-11
' Find the last day of the previous month.
sample = DateSerial(Year(sample), Month(sample), 1) - 1
Debug.Print Format$(sample, "yyyy-mm-dd") ' prints 2001-09-11
End Sub
Beachten Sie, dass DateSerial()
"ungültige" Daten akzeptiert und daraus ein gültiges Datum berechnet. Dies kann kreativ für immer genutzt werden:
Positives Beispiel
Sub GoodDateSerialExample()
'Calculate 45 days from today
Dim today As Date
today = DateSerial (2001, 9, 11)
Dim futureDate As Date
futureDate = DateSerial(Year(today), Month(today), Day(today) + 45)
Debug.Print Format$(futureDate, "yyyy-mm-dd") 'prints 2009-10-26
End Sub
Es ist jedoch wahrscheinlicher, dass Trauer verursacht wird, wenn versucht wird, ein Datum aus nicht validierten Benutzereingaben zu erstellen:
Negatives Beispiel
Sub BadDateSerialExample()
'Allow user to enter unvalidate date information
Dim myYear As Long
myYear = InputBox("Enter Year")
'Assume user enters 2009
Dim myMonth As Long
myMonth = InputBox("Enter Month")
'Assume user enters 2
Dim myDay As Long
myDay = InputBox("Enter Day")
'Assume user enters 31
Debug.Print Format$(DateSerial(myYear, myMonth, myDay), "yyyy-mm-dd")
'prints 2009-03-03
End Sub