Calcolo con le date in VBA     (ultimo aggiornamento 12/10/02)

Nel paragrafo precedente abbiamo avuto un primo "assaggio" di cosa sono le date per il VBA. Ora vediamo su come poter lavorare con le date, faremo esempi che ci aiuteranno nel Calcolo su date. Vediamo il primo, un divertente esempio in cui, sfruttando due inputbox, chiederemo di introdurre dei dati e forniremo risposte ai quesiti posti (in verde sono i commenti che andranno tolti):

Private Sub CommandButton2_Click()
Dim Message, Title
Message = "Inserisci la tua data di nascita :"
 'Imposta il testo del messaggio.
Title = "Giorni Vissuti"
' Imposta il titolo.
Dim natoil As Date
Dim giorni, anno As Integer
natoil = InputBox(Message, Title)
giorni = Date - natoil
'viene calcolata la diff. tra la data del giorno e quella immessa nell'inputbox (natoil) e 'viene restituito un valore che è il Numero seriale dei giorni che intercorrono tra le due date e memorizzato 'nella. variabile giorni
MsgBox "hai vissuto per " & giorni & " giorni!"
'appare il messaggio che dice quanti giorni sono trascorsi
anno = giorni / 365
 'poi trasformiamo il Numero di giorni diviso 365 per ottenere a quanti anni corrispondono
MsgBox "e oggi hai " & anno & " anni!"
End Sub

e questo è il risultato (Date = 21/09/02):


Un esempio un pò più articolato e quello che presento sotto. Ho sfruttato una UserForm per mostrare due tipi di calcolo con date :

  • ottenere la differenza tra due date, per poter eseguire calcoli sul risultato della differenza (in giorni, settimane, mesi o anni) moltiplicato per un costo unitario, e ottenere un totale.

  • ottenere una data finale aggiungendo un periodo (giorni, settimane, mesi o anni) ad una data iniziale.

 

Le funzioni su cui si basano i calcoli sulle date sono : DateDiff   e   DateAdd

Funzione DateDiff  Restituisce un valore Variant (Long) corrispondente al numero di intervalli di tempo tra due date specificate.
Sintassi :
DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])
interval Obbligatoria. Espressione stringa corrispondente all'intervallo di tempo utilizzato per calcolare la differenza tra date1 e date2. (vedi sotto interval)
date1, date2 Obbligatoria. Variant (Date). Date da utilizzare nel calcolo.
firstdayofweek Facoltativa. Costante che specifica il primo giorno della settimana. Se non è specificata, verrà utilizzata Domenica.
firstweekofyear Facoltativa. Costante che specifica la prima settimana dell'anno. Se non è specificata, verrà utilizzata la settimana nella quale cade il 1 gennaio.

Le possibili impostazioni dell’argomento interval sono:
 

Impostazione Descrizione
yyyy Anno
q Trimestre
m Mese
y Giorno dell’anno
d Giorno
w Giorno della settimana
ww Settimana
h Ora
n Minuti
s Secondi

Osservazioni :

È possibile utilizzare la funzione DateDiff per determinare quanti intervalli di tempo specificati esistono tra due date. È, ad esempio, possibile utilizzare DateDiff per calcolare il numero di giorni che intercorrono tra due date oppure il numero di settimane tra la data odierna e la fine dell'anno.

Per ottenere il numero di giorni tra date1 e date2 è possibile utilizzare sia l'impostazione del giorno dell'anno ("y") che quella del giorno ("d"). Quando per interval viene impostato il giorno della settimana ("w"), DateDiff restituisce il numero di settimane che intercorrono tra le due date. Se date1 cade di lunedì, DateDiff conterà il numero di lunedì fino a date2, includendo nel conteggio date2 ma non date1. Se per interval viene invece impostata la settimana ("ww"), la funzione DateDiff restituirà il numero di settimane del calendario comprese tra le due date. La funzione conterà il numero di domeniche che intercorrono tra date1 e date2, includendo nel conteggio date2 se cade di domenica, ma non date1, anche se cade di domenica.

Se date1 è successiva a date2, la funzione DateDiff restituirà un numero negativo.
Quando si esegue il confronto tra il 31 dicembre e l'1 gennaio dell'anno immediatamente successivo, DateDiff utilizzata con l'impostazione dell'anno ("yyyy") restituisce 1 anche se è trascorso un solo giorno.


Funzione DateAdd  Restituisce un valore Variant (Date) contenente una data alla quale è stato aggiunto un intervallo di tempo specificato.
Sintassi
DateAdd(interval, number, date)
 
interval Obbligatoria. Espressione stringa corrispondente all'intervallo di tempo che si desidera aggiungere.(vedi sotto)
number Obbligatoria. Espressione numerica corrispondente al numero di intervalli da aggiungere. Può essere positiva, per ottenere date future, oppure negativa, per ottenere date passate.
date Obbligatoria. Valore Variant (Date) o stringa che rappresenta una data a cui viene aggiunto l'intervallo.

Le possibili impostazioni dell’argomento interval sono:

Impostazione Descrizione
yyyy Anno
q Trimestre
m Mese
y Giorno dell’anno
d Giorno
w Giorno della settimana
ww Settimana
h Ora
n Minuti
s Secondi

Osservazioni :

La funzione DateAdd consente di aggiungere o sottrarre da una data un intervallo di tempo specificato. È, ad esempio, possibile utilizzare DateAdd per determinare la data risultante dall'aggiunta di 30 giorni alla data odierna oppure l'orario risultante dall'aggiunta di 45 minuti all'ora corrente.
Per aggiungere giorni a date, è possibile utilizzare l'impostazione per il giorno dell'anno ("y"), per il giorno ("d") o per il giorno della settimana ("w").
La funzione DateAdd non restituisce una data non valida. In questo esempio, alla data 31 gennaio viene aggiunto un mese:
DateAdd("m", 1, "31/01/95")
In questo caso, DateAdd restituirà 28/02/95 e non 31/02/95. Se date è 31/01/96, la funzione restituirà 29/02/96, in quanto il 1996 è un anno bisestile.
Se la data calcolata precede l'anno 100, vale a dire se si sottrae un numero di anni maggiore di quello presente in date, verrà generato un errore.
Se number non è un valore Long, prima di essere valutato verrà arrotondato al numero intero più vicino.
Nota Il formato del valore restituito dalla funzione DateAdd dipende dalle impostazioni del Pannello di controllo e non dal formato passato dall'argomento date.


Nella form ho cercato di inserire anche alcuni passaggi che dovrebbero servire a familiarizzarsi con altri "oggetti" inseribili nelle form, come i "pulsanti di opzione" (OptionButton) che possono servire in molte altre occasioni per creare condizioni diverse all'esecuzione: in questo caso sono state abbinate alla scelta tra lavorare con date immesse dall'utente (inizio - fine) oppure usare la data di sistema (giorno attuale) come data iniziale, inserendo solo la data finale per ottenere una differenza futuribile su cui eseguire calcoli. La data di sistema l'ho abbinata solo a calcoli sulle differenze. Chi volesse usare questo metodo con le aggiunte periodi, potrà, leggendo come sono impostate le istruzioni in "differenza", modificare il codice. Desidero sottolineare che lo scopo di questo lavoro è quello di fornire indicazioni di massima su come operare, sarà compito di chi è interessato assimilare i concetti ed adattarli alle proprie esigenze. Ho inserito dei semplici controlli per la verifica della presenza dei dati nelle textbox, in modo che se ci si dimenticasse di inserire un dato, si venga fermati ed avvisati. Due dei controlli inseriti possono avere una validità anche in altri tipi di applicazioni su userform:

  • controllo formato data: dovrà essere scritto come 02/11/01, cioè gg/mm/aa con le barre ( / ) e l'anno a due cifre (per evitare errori di digitazione): in caso di errore la data viene cancellata e si viene avvisati di quale sia il giusto formato, ed il focus si riposiziona sulla textbox con l'errore. (questo controllo l'ho abbinato solo al primo pulsante "differenza in giorni" e controlla l'inserimento sulle textbox2 e 3. Ovviamente è ripetibile per tutti gli altri pulsanti.

  • controllo inserimento cifra con decimali e presenza della virgola di separazione dei decimali. Spesso viene usato il punto ( . ) in maniera impropria. questo controllo provvede a garantire l'inserimento di due soli decimali e della virgola; in caso contrario, si viene avvisati e la text box viene pulita. Questo controllo è abbinato solo al pulsante "calcola importo" e controlla l'inserimento sulla textbox5.

Riporto di seguito le istruzioni usate per i due controlli menzionati (gli altri sono leggibili scaricando il file)

'controllo inserimento formato data
If Mid(TextBox2, 3, 1) <> "/" Or Mid(TextBox2, 6, 1) <> "/" Then
MsgBox "Scrivi la data come: 02/10/01"
TextBox2 = ""
TextBox2.SetFocus
Exit Sub
End If
If Mid(TextBox3, 3, 1) <> "/" Or Mid(TextBox3, 6, 1) <> "/" Then
MsgBox "Scrivi la data come: 02/10/01"
TextBox3 = ""
TextBox3.SetFocus
Exit Sub
End If

'fine controllo-----------

'controllo inserimento 2 decimali con virgola
Dim X
X = Right(TextBox5, 2)
If Right(TextBox5, 3) <> "," & X Then
MsgBox "Gli importi vanno scritti con la virgola e due decimali"
TextBox5 = ""
TextBox5.SetFocus
Exit Sub
End If

'fine controllo

Sono state usate due funzioni: Mid e Right di cui invito gli interessati a consultare la guida in linea per capire il funzionamento. Chi comunque avesse problemi a capire, troverà su questo sito, in futuro, una spiegazione. Il file è disponibile e scaricabile :    Calcolo su date2000.zip  21 kb

Ma non è ancora finita, ci risentiremo per completare l'argomento qui impostato e finire la panoramica.

Buon lavoro.