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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow