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. |