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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow