VBA
Data Manipolazione del tempo
Ricerca…
Calendario
VBA supporta 2 calendari: Gregorian e Hijri
La proprietà Calendar
viene utilizzata per modificare o visualizzare il calendario corrente.
I 2 valori per il calendario sono:
Valore | Costante | Descrizione |
---|---|---|
0 | vbCalGreg | Calendario gregoriano (predefinito) |
1 | vbCalHijri | Calendario Hijri |
Esempio
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
Questo Sub stampa quanto segue;
Current Calendar : 0
SampleDate = 2016-07-28
Current Calendar : 1
SampleDate = 1437-10-23
Funzioni di base
Recupera il sistema DateTime
VBA supporta 3 funzioni integrate per recuperare la data e / o l'ora dall'orologio del sistema.
Funzione | Tipo di reso | Valore di ritorno |
---|---|---|
Adesso | Data | Restituisce la data e l'ora correnti |
Data | Data | Restituisce la parte di data della data e ora correnti |
Tempo | Data | Restituisce la porzione di tempo della data e ora correnti |
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
Funzione timer
La funzione Timer
restituisce un singolo che rappresenta il numero di secondi trascorsi da mezzanotte. La precisione è un centesimo di secondo.
Sub TimerExample()
Debug.Print Time ' prints 10:36:31 (time at execution)
Debug.Print Timer ' prints 38191,13 (seconds since midnight)
End Sub
Poiché le funzioni Now
e Time
sono precise solo a secondi, Timer
offre un modo conveniente per aumentare la precisione della misurazione del tempo:
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 () verifica se un'espressione è una data valida o meno. Restituisce un 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
Funzioni di estrazione
Queste funzioni prendono una Variant
che può essere convertita in una Date
come parametro e restituisce un Integer
rappresenta una porzione di una data o un'ora. Se il parametro non può essere convertito in una Date
, si verificherà un errore di run-time 13: tipo mancata corrispondenza.
Funzione | Descrizione | Valore restituito |
---|---|---|
Anno() | Restituisce la parte dell'anno dell'argomento della data. | Intero (da 100 a 9999) |
Mese() | Restituisce la parte del mese dell'argomento della data. | Intero (da 1 a 12) |
Giorno() | Restituisce la parte del giorno dell'argomento della data. | Intero (da 1 a 31) |
Giorno della settimana () | Restituisce il giorno della settimana dell'argomento della data. Accetta un secondo argomento opzionale che definisce il primo giorno della settimana | Intero (da 1 a 7) |
Ora() | Restituisce la parte dell'ora dell'argomento della data. | Numero intero (da 0 a 23) |
Minute () | Restituisce la parte dei minuti dell'argomento della data. | Intero (da 0 a 59) |
Secondo() | Restituisce la seconda parte dell'argomento della data. | Intero (da 0 a 59) |
Esempi:
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
Funzione DatePart ()
DatePart()
è anche una funzione che restituisce una parte di una data, ma funziona in modo diverso e consente più possibilità rispetto alle funzioni precedenti. Può ad esempio restituire il trimestre dell'anno o la settimana dell'anno.
Sintassi:
DatePart ( interval, date [, firstdayofweek] [, firstweekofyear] )
l' argomento intervallo può essere:
Intervallo | Descrizione |
---|---|
"Aaaa" | Anno (da 100 a 9999) |
"Y" | Giorno dell'anno (da 1 a 366) |
"M" | Mese (da 1 a 12) |
"Q" | Trimestre (da 1 a 4) |
"Ww" | Settimana (da 1 a 53) |
"W" | Giorno della settimana (da 1 a 7) |
"D" | Giorno del mese (da 1 a 31) |
"H" | Ora (da 0 a 23) |
"N" | Minuto (da 0 a 59) |
"S" | Secondo (da 0 a 59) |
firstdayofweek è facoltativo. è una costante che specifica il primo giorno della settimana. Se non specificato, vbSunday
è assunto.
la prima settimana di vita è facoltativa. è una costante che specifica la prima settimana dell'anno. Se non specificato, si presume che la prima settimana sia la settimana in cui si verifica il 1 ° gennaio.
Esempi:
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
Funzioni di calcolo
DateDiff ()
DateDiff()
restituisce un Long
rappresenta il numero di intervalli di tempo tra due date specificate.
Sintassi
DateDiff ( interval, date1, date2 [, firstdayofweek] [, firstweekofyear] )
- intervallo può essere uno qualsiasi degli intervalli definiti nella funzione
DatePart()
- data1 e data2 sono le due date che si desidera utilizzare nel calcolo
- il primo giorno di settimana e il primo di anno sono opzionali. Fare riferimento alla funzione
DatePart()
per le spiegazioni
Esempi
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()
restituisce una Date
a cui è stata aggiunta una data o un intervallo di tempo specificato.
Sintassi
DateAdd ( interval, number, date )
- intervallo può essere uno qualsiasi degli intervalli definiti nella funzione
DatePart()
- numero Espressione numerica che corrisponde al numero di intervalli che si desidera aggiungere. Può essere positivo (per ottenere date in futuro) o negativo (per ottenere date in passato).
- data è una
Date
o letterale che rappresenta la data a cui viene aggiunto l'intervallo
Esempi:
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
Conversione e creazione
CDate ()
CDate()
converte qualcosa da qualsiasi tipo di dati in un tipo di dati 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
Si noti che VBA dispone anche di un CVDate()
vagamente tipizzato che funziona allo stesso modo della funzione CDate()
oltre a restituire una data digitata Variant
invece di una Date
fortemente tipizzata. La versione CDate()
dovrebbe essere preferita quando si passa a un parametro Date
o si assegna a una variabile Date
e la versione CVDate()
deve essere preferita quando si passa a un parametro Variant
o si assegna a una variabile Variant
. Questo evita il cast di tipo implicito.
DateSerial ()
DateSerial()
viene utilizzata per creare una data. Restituisce una Date
per un anno, mese e giorno specificati.
Sintassi:
DateSerial ( year, month, day )
Gli argomenti relativi a anno, mese e giorno sono validi Numeri interi (Anno da 100 a 9999, Mese da 1 a 12, Giorno da 1 a 31).
Esempi
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
Si noti che DateSerial()
accetterà date "non valide" e calcolerà una data valida da esso. Questo può essere usato creativamente per bene:
Esempio positivo
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
Tuttavia, è più probabile che causi dolore quando si tenta di creare una data da un input utente non convalidato:
Esempio negativo
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