VBA
Manipulacja datą i godziną
Szukaj…
Kalendarz
VBA obsługuje 2 kalendarze: gregoriański i Hidżry
Właściwość Calendar
służy do modyfikowania lub wyświetlania bieżącego kalendarza.
Dwie wartości kalendarza to:
Wartość | Stały | Opis |
---|---|---|
0 | vbCalGreg | Kalendarz gregoriański (domyślnie) |
1 | vbCalHijri | Kalendarz Hidżry |
Przykład
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
Ten napis drukuje następujące;
Current Calendar : 0
SampleDate = 2016-07-28
Current Calendar : 1
SampleDate = 1437-10-23
Funkcje podstawowe
Pobierz systemową datę i godzinę
VBA obsługuje 3 wbudowane funkcje do pobierania daty i / lub godziny z zegara systemowego.
Funkcjonować | Rodzaj zwrotu | Zwracana wartość |
---|---|---|
Teraz | Data | Zwraca bieżącą datę i godzinę |
Data | Data | Zwraca część daty bieżącej daty i godziny |
Czas | Data | Zwraca część czasu bieżącej daty i godziny |
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
Funkcja timera
Funkcja Timer
zwraca wartość Single reprezentującą liczbę sekund, które upłynęły od północy. Precyzja to jedna setna sekundy.
Sub TimerExample()
Debug.Print Time ' prints 10:36:31 (time at execution)
Debug.Print Timer ' prints 38191,13 (seconds since midnight)
End Sub
Ponieważ funkcje Now
i Time
są precyzyjne tylko w sekundach, Timer
oferuje wygodny sposób na zwiększenie dokładności pomiaru czasu:
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 () sprawdza, czy wyrażenie jest poprawną datą, czy nie. Zwraca wartość 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
Funkcje ekstrakcyjne
Funkcje te przyjmują Variant
który można rzutować na Date
jako parametr, i zwracają liczbę Integer
reprezentującą część daty lub godziny. Jeśli parametru nie można rzutować na Date
, spowoduje to błąd w czasie wykonywania 13: Niezgodność typu.
Funkcjonować | Opis | Zwrócona wartość |
---|---|---|
Rok() | Zwraca część roku argumentu daty. | Liczba całkowita (od 100 do 9999) |
Miesiąc() | Zwraca część miesiąca argumentu daty. | Liczba całkowita (od 1 do 12) |
Dzień() | Zwraca część dzienną argumentu daty. | Liczba całkowita (od 1 do 31) |
Dzień powszedni() | Zwraca dzień tygodnia argumentu daty. Akceptuje opcjonalny drugi argument określający pierwszy dzień tygodnia | Liczba całkowita (od 1 do 7) |
Godzina() | Zwraca część godzinową argumentu daty. | Liczba całkowita (od 0 do 23) |
Minuta() | Zwraca minimalną część argumentu daty. | Liczba całkowita (od 0 do 59) |
Druga() | Zwraca drugą część argumentu daty. | Liczba całkowita (od 0 do 59) |
Przykłady:
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
Funkcja DatePart ()
DatePart()
to także funkcja zwracająca część daty, ale działa inaczej i pozwala na więcej możliwości niż funkcje powyżej. Może na przykład zwrócić Kwartał roku lub Tydzień roku.
Składnia:
DatePart ( interval, date [, firstdayofweek] [, firstweekofyear] )
argument interwał może być:
Interwał | Opis |
---|---|
„rrrr” | Rok (od 100 do 9999) |
„y” | Dzień roku (od 1 do 366) |
„m” | Miesiąc (od 1 do 12) |
„q” | Kwartał (od 1 do 4) |
"w W" | Tydzień (od 1 do 53) |
„w” | Dzień tygodnia (od 1 do 7) |
"re" | Dzień miesiąca (od 1 do 31) |
„h” | Godzina (od 0 do 23) |
„n” | Minuta (od 0 do 59) |
„s” | Drugi (od 0 do 59) |
firstdayofweek jest opcjonalny. jest to stała określająca pierwszy dzień tygodnia. Jeśli nie zostanie określony, vbSunday
jest vbSunday
.
firstweofofear jest opcjonalny. jest to stała określająca pierwszy tydzień roku. Jeśli nie zostanie określony, przyjmuje się, że pierwszy tydzień to tydzień, w którym przypada 1 stycznia.
Przykłady:
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
Funkcje obliczeniowe
DateDiff ()
DateDiff()
zwraca wartość Long
reprezentującą liczbę odstępów czasu między dwiema określonymi datami.
Składnia
DateDiff ( interval, date1, date2 [, firstdayofweek] [, firstweekofyear] )
- interwał może być dowolnym interwałem zdefiniowanym w
DatePart()
- data1 i data2 to dwie daty, których chcesz użyć w obliczeniach
- FirstDayOfWeek i firstweekofyear są opcjonalne. Wyjaśnienia znajdują się w funkcji
DatePart()
Przykłady
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()
zwraca Date
do której dodano określoną datę lub przedział czasu.
Składnia
DateAdd ( interval, number, date )
- interwał może być dowolnym interwałem zdefiniowanym w
DatePart()
- liczba Wyrażenie liczbowe to liczba interwałów, które chcesz dodać. Może być dodatni (aby uzyskać daty w przyszłości) lub ujemny (aby uzyskać daty w przeszłości).
- data jest
Date
lub data reprezentujących dosłowne, do którego dodawany jest przedział
Przykłady:
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
Nawrócenie i stworzenie
CDate ()
CDate()
konwertuje coś z dowolnego typu danych na typ danych Date
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
Zauważ, że VBA ma również luźno wpisaną CVDate()
która działa w taki sam sposób jak funkcja CDate()
inna niż zwracanie Variant
typu daty zamiast mocno wpisanej Date
. Wersja CDate()
powinna być preferowana podczas przekazywania do parametru Date
lub przypisywania do zmiennej Date
, a wersja CVDate()
powinna być preferowana podczas przekazywania do parametru Variant
lub przypisywania do zmiennej Variant
. Pozwala to uniknąć rzutowania typu niejawnego.
DateSerial ()
DateSerial()
służy do tworzenia daty. Zwraca Date
dla określonego roku, miesiąca i dnia.
Składnia:
DateSerial ( year, month, day )
Argumenty roku, miesiąca i dnia są poprawnymi liczbami całkowitymi (rok od 100 do 9999, miesiąc od 1 do 12, dzień od 1 do 31).
Przykłady
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
Zauważ, że DateSerial()
zaakceptuje „nieprawidłowe” daty i obliczy z nich prawidłową datę. Można to wykorzystać twórczo na dobre:
Pozytywny przykład
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
Jednak bardziej prawdopodobne jest spowodowanie smutku podczas próby utworzenia daty na podstawie nieważnych danych wejściowych użytkownika:
Przykład negatywny
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