VBA
Datum Tijd Manipulatie
Zoeken…
Kalender
VBA ondersteunt 2 kalenders: Gregoriaans en Hijri
De eigenschap Calendar
wordt gebruikt om de huidige kalender te wijzigen of weer te geven.
De 2 waarden voor de kalender zijn:
Waarde | Constante | Beschrijving |
---|---|---|
0 | vbCalGreg | Gregoriaanse kalender (standaard) |
1 | vbCalHijri | Hijri-kalender |
Voorbeeld
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
Deze Sub drukt het volgende af;
Current Calendar : 0
SampleDate = 2016-07-28
Current Calendar : 1
SampleDate = 1437-10-23
Basisfuncties
Systeemdatum-tijd ophalen
VBA ondersteunt 3 ingebouwde functies om de datum en / of tijd op te halen uit de systeemklok.
Functie | Retourtype | Winstwaarde |
---|---|---|
Nu | Datum | Retourneert de huidige datum en tijd |
Datum | Datum | Retourneert het datumgedeelte van de huidige datum en tijd |
Tijd | Datum | Retourneert het tijdgedeelte van de huidige datum en tijd |
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
Timer functie
De Timer
retourneert een single die het aantal verstreken seconden sinds middernacht weergeeft. De precisie is honderdste van een seconde.
Sub TimerExample()
Debug.Print Time ' prints 10:36:31 (time at execution)
Debug.Print Timer ' prints 38191,13 (seconds since midnight)
End Sub
Omdat de functies Now
en Time
slechts tot op seconden nauwkeurig zijn, biedt Timer
een handige manier om de nauwkeurigheid van de tijdmeting te vergroten:
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 () test of een uitdrukking een geldige datum is of niet. Retourneert een 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
Extractie functies
Deze functies nemen een Variant
die naar een Date
kan worden gegoten als parameter en retourneert een geheel Integer
dat een deel van een datum of tijd vertegenwoordigt. Als de parameter niet naar een Date
kan worden gegoten, resulteert dit in een runtime-fout 13: Type komt niet overeen.
Functie | Beschrijving | Geretourneerde waarde |
---|---|---|
Jaar() | Retourneert het jaargedeelte van het datumargument. | Geheel getal (100 tot 9999) |
Maand() | Retourneert het maandgedeelte van het datumargument. | Geheel getal (1 tot 12) |
Dag() | Retourneert het daggedeelte van het datumargument. | Geheel getal (1 tot 31) |
Weekdag() | Retourneert de dag van de week van het datumargument. Accepteert een optioneel tweede argument dat de eerste dag van de week definieert | Geheel getal (1 tot 7) |
Uur() | Retourneert het uurgedeelte van het datumargument. | Geheel getal (0 tot 23) |
Minuut() | Retourneert het minieme gedeelte van het datumargument. | Geheel getal (0 tot 59) |
Tweede() | Retourneert het tweede gedeelte van het datumargument. | Geheel getal (0 tot 59) |
Voorbeelden:
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 () functie
DatePart()
is ook een functie die een deel van een datum retourneert, maar werkt anders en biedt meer mogelijkheden dan de bovenstaande functies. Het kan bijvoorbeeld het kwartaal van het jaar of de week van het jaar retourneren.
Syntaxis:
DatePart ( interval, date [, firstdayofweek] [, firstweekofyear] )
intervalargument kan zijn:
Interval | Beschrijving |
---|---|
"Yyyy" | Jaar (100 tot 9999) |
"Y" | Dag van het jaar (1 tot 366) |
"M" | Maand (1 tot 12) |
"Q" | Kwartaal (1 tot 4) |
"Ww" | Week (1 tot 53) |
"W" | Dag van de week (1 tot 7) |
"D" | Dag van de maand (1 tot 31) |
"H" | Uur (0 tot 23) |
"N" | Minuut (0 tot 59) |
"S" | Tweede (0 tot 59) |
firstdayofweek is optioneel. het is een constante die de eerste dag van de week aangeeft. Indien niet gespecificeerd, wordt vbSunday
verondersteld.
eerste week van het jaar is optioneel. het is een constante die de eerste week van het jaar aangeeft. Indien niet gespecificeerd, wordt aangenomen dat de eerste week de week is waarin 1 januari plaatsvindt.
Voorbeelden:
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
Berekeningsfuncties
DateDiff ()
DateDiff()
retourneert een Long
die het aantal tijdsintervallen tussen twee opgegeven datums weergeeft.
Syntaxis
DateDiff ( interval, date1, date2 [, firstdayofweek] [, firstweekofyear] )
- interval kan elk van de intervallen zijn die zijn gedefinieerd in de functie
DatePart()
- datum1 en datum2 zijn de twee datums die u in de berekening wilt gebruiken
- firstdayofweek en firstweekofyear zijn optioneel. Raadpleeg de functie
DatePart()
voor uitleg
Voorbeelden
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()
retourneert een Date
waaraan een opgegeven datum of tijdsinterval is toegevoegd.
Syntaxis
DateAdd ( interval, number, date )
- interval kan elk van de intervallen zijn die zijn gedefinieerd in de functie
DatePart()
- nummer Numerieke uitdrukking die het aantal intervallen is dat u wilt toevoegen. Het kan positief zijn (om datums in de toekomst te krijgen) of negatief (om datums in het verleden te krijgen).
- date is een
Date
of letterlijke weergave van de datum waaraan het interval is toegevoegd
Voorbeelden:
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
Conversie en creatie
CDate ()
CDate()
zet iets van elke datatype naar een Date
datatype
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
Merk op dat VBA ook een los getypte CVDate()
die op dezelfde manier werkt als de functie CDate()
anders dan het retourneren van een CDate()
Variant
plaats van een sterk getypte Date
. De CDate()
-versie moet de voorkeur hebben wanneer deze wordt doorgegeven aan een Date
parameter of wordt toegewezen aan een Date
variabele, en de CVDate()
-versie moet de voorkeur hebben wanneer deze wordt doorgegeven aan een Variant
parameter of wordt toegewezen aan een Variant
variabele. Dit vermijdt impliciete typecasting.
DateSerial ()
DateSerial()
wordt gebruikt om een datum te maken. Het retourneert een Date
voor een opgegeven jaar, maand en dag.
Syntaxis:
DateSerial ( year, month, day )
Met argumenten voor het jaar, de maand en de dag als geldige gehele getallen (jaar van 100 tot 9999, maand van 1 tot 12, dag van 1 tot 31).
Voorbeelden
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
Merk op dat DateSerial()
"ongeldige" datums accepteert en er een geldige datum van berekent. Dit kan creatief voorgoed worden gebruikt:
Positief voorbeeld
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
Het is echter waarschijnlijker om verdriet te veroorzaken wanneer u probeert een datum te maken op basis van niet-gevalideerde gebruikersinvoer:
Negatief voorbeeld
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