VBA
Datum Tid Manipulation
Sök…
Kalender
VBA stöder 2 kalendrar: Gregorian och Hijri
Egenskapen Calendar
används för att ändra eller visa den aktuella kalendern.
De två värdena för kalendern är:
Värde | Konstant | Beskrivning |
---|---|---|
0 | vbCalGreg | Gregoriansk kalender (standard) |
1 | vbCalHijri | Hijri-kalender |
Exempel
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
Denna sub skriver ut följande;
Current Calendar : 0
SampleDate = 2016-07-28
Current Calendar : 1
SampleDate = 1437-10-23
Basfunktioner
Hämta System DateTime
VBA stöder 3 inbyggda funktioner för att hämta datum och / eller tid från systemets klocka.
Fungera | Returtyp | Returvärde |
---|---|---|
Nu | Datum | Returnerar aktuellt datum och tid |
Datum | Datum | Returnerar datumdelen för aktuellt datum och tid |
Tid | Datum | Returnerar tidsdelen av aktuellt datum och tid |
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
Timer
returnerar en singel som representerar antalet sekunder som gått sedan midnatt. Precisionen är hundratals sekund.
Sub TimerExample()
Debug.Print Time ' prints 10:36:31 (time at execution)
Debug.Print Timer ' prints 38191,13 (seconds since midnight)
End Sub
Eftersom Now
och Time
funktioner är endast exakta till sekunder, Timer
erbjuder ett bekvämt sätt att öka noggrannheten i tidmätningen:
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 () testar om ett uttryck är ett giltigt datum eller inte. Returnerar en 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
Extraktionsfunktioner
Dessa funktioner tar en Variant
som kan kastas till ett Date
som en parameter och returnerar ett Integer
representerar en del av ett datum eller tid. Om parametern inte kan kastas till ett Date
, kommer det att resultera i ett körtidfel 13: Skriv felanpassning.
Fungera | Beskrivning | Returnerat värde |
---|---|---|
År() | Returnerar årets del av datumargumentet. | Heltal (100 till 9999) |
Månad() | Returnerar månadsdelen av datumargumentet. | Heltal (1 till 12) |
Dag() | Returnerar dagdelen av datumargumentet. | Heltal (1 till 31) |
Veckodag() | Returnerar dagen i veckan för datumargumentet. Accepterar ett valfritt andra argument som definierar veckans första dag | Heltal (1 till 7) |
Timme() | Returnerar timandelen av datumargumentet. | Heltal (0 till 23) |
Minut() | Returnerar minutdelen av datumargumentet. | Heltal (0 till 59) |
Andra() | Returnerar den andra delen av datumargumentet. | Heltal (0 till 59) |
Exempel:
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()
är också en funktion som returnerar en del av ett datum, men fungerar annorlunda och ger fler möjligheter än funktionerna ovan. Det kan till exempel returnera årets kvartal eller årets vecka.
Syntax:
DatePart ( interval, date [, firstdayofweek] [, firstweekofyear] )
intervallargument kan vara:
Intervall | Beskrivning |
---|---|
"Åååå" | År (100 till 9999) |
"Y" | Årets dag (1 till 366) |
"M" | Månad (1 till 12) |
"Q" | Kvartal (1 till 4) |
"Ww" | Vecka (1 till 53) |
"W" | Veckodag (1 till 7) |
"D" | Månadens dag (1 till 31) |
"H" | Timme (0 till 23) |
"N" | Minut (0 till 59) |
"S" | Andra (0 till 59) |
firstdayofweek är valfritt. det är en konstant som anger den första veckodagen. Om det inte anges vbSunday
.
första veckan från året är valfritt. det är en konstant som anger årets första vecka. Om det inte anges antas den första veckan vara den vecka där 1 januari inträffar.
Exempel:
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
Beräkningsfunktioner
DateDiff ()
DateDiff()
returnerar en Long
representerar antalet tidsintervall mellan två specificerade datum.
Syntax
DateDiff ( interval, date1, date2 [, firstdayofweek] [, firstweekofyear] )
- intervall kan vara något av de intervall som definieras i
DatePart()
-funktionen - datum1 och datum2 är de två datumen du vill använda i beräkningen
- firstdayofweek och firstweekofyear är valfria. Se
DatePart()
för förklaringar
exempel
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()
returnerar ett Date
till vilket ett angivet datum eller tidsintervall har lagts till.
Syntax
DateAdd ( interval, number, date )
- intervall kan vara något av de intervall som definieras i
DatePart()
-funktionen - nummer Numeriskt uttryck som är antalet intervaller du vill lägga till. Det kan vara positivt (för att få datum i framtiden) eller negativt (för att få datum tidigare).
- datum är ett
Date
eller bokstavligt representerande datum till vilket intervallet läggs till
Exempel:
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
Konvertering och skapelse
CDate ()
CDate()
konverterar något från någon datatyp till en Date
datatyp
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
Observera att VBA också har en löst CVDate()
som fungerar på samma sätt som CDate()
-funktionen annat än att returnera en datumtypad Variant
istället för ett starkt skrivet Date
. CDate()
-versionen bör vara att föredra när man skickar till en Date
parameter eller tilldelar en Date
variabel, och CVDate()
-versionen bör föredras när man övergår till en Variant
parameter eller tilldelar en Variant
variabel. Detta undviker implicit typgjutning.
Dateserial ()
DateSerial()
-funktionen används för att skapa ett datum. Det returnerar ett Date
för ett angivet år, månad och dag.
Syntax:
DateSerial ( year, month, day )
Med år, månad och dagargument som är giltiga heltal (År från 100 till 9999, Månad från 1 till 12, Dag från 1 till 31).
exempel
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
Observera att DateSerial()
accepterar "ogiltiga" datum och beräknar ett giltigt datum från det. Detta kan användas kreativt för gott:
Positivt exempel
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
Det är emellertid mer troligt att det orsakar sorg när du försöker skapa ett datum från ovaliderad användarinmatning:
Negativt exempel
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