Calcolo sulle date e sugli orari tramite funzioni native (segue) (aggiornato al 08/07/03)

Funzioni native per le date

Continuiamo la panoramica dei calcoli con le date, esaminando alcune delle funzioni native del VBA che permettono di gestirle.

Date abbiamo già visto nella pagina precedente l'impiego di questa parola; è opportuno riprenderla per sottolineare che viene utilizzata in contesti diversi con significati diversi :

  • come tipo di dato assegnato ad una variabile, e che quindi è deputato a contenere date (o/e orari).

  • come funzione per restituire la data di sistema, o per interrogazioni sul calendario del computer

in questo esempio interroghiamo l'orologio interno e otteniamo il giorno della settimana in una finestra di messaggio, che porta nella barra del titolo il testo contenuto nell'istruzione Title:

Dim X As Date
X = Date
MsgBox Prompt:=Format(X, "dddd"), Title:="Giorno della settimana per la data del " & X

 

Funzioni native per gli orari

Time  questa funzione restituisce un valore di tipo Date con l'orario corrente; quest'esempio mostra una finestra di messaggio con l'orario corrente:

Dim X As Date
X = Time
MsgBox X

L'esempio è per vedere il costrutto, perchè in realtà per avere una messagebox con l'ora di sistema sarebbe sufficiente una semplice istruzione, così:

MsgBox Time

 

TimeValue questa funzione restituisce un valore Variant (Date) contenente un orario. Utile quando si voglia calcolare la differenza tra due orari. Questo esempio considera due celle, ad esempio la A1 e la B1 con due orari immessi, formato celle impostato a Ora, e restituisce la differenza in C1.

Sub miaora()
Dim cc As Date
'si impostano due variabili ( cc e pp ) come tipo Date
Dim pp As Date
pp = Range("A1").Value
'poi si assegna a pp l'orario che si trova in A1
y = TimeValue(pp)
' con y si memorizza la variabile pp come TimeValue
cc = Range("B1").Value 
'poi si assegna a cc l'orario che si trova in B1
z = TimeValue(cc) 
' indi si memorizza con z la variabile cc come TimeValue
Range("C1") = z - y 
'e si restituisce in C1 la differenza tra i due orari
End Sub

Ricordo che tutto ciò che riguarda date ed orari NON può avere valore negativo,  quindi dovremo sempre sottrarre l'orario minore da quello superiore, e non viceversa. Inoltre le ore partono dalle 0.0.0 e terminano alle 23.59.59. Se dobbiamo fare la differenza, per esempio tra le 17.30 e le 01.30, per calcolare un turno di lavoro che inizia alle 5.30 del pomeriggio e termina alle 01.30 di notte, non possiamo fare 01.30 - 15.20, perchè le 01.30 appartengono al giorno dopo. Infatti una differenza come l'esempio,  viene vista come differenza tra le 5.30 del pomeriggio e le 01.30 di mattina, ma dello stesso giorno, e quindi negativa, con manifesta irritazione di Excel che segnala una serie infinita di cancelletti (#). Andrà infatti sommata la differenza tra le 23.59.59 e le 17.30, e tra le 01.30 e le 0.0.0 per ottenere il totale delle ore del turno.

 

TimeSerial  questa funzione restituisce un valore Variant (Date) che contiene l’orario corrispondente a un’ora, minuto e secondo specifici. Utile quando si voglia restituire un orario per differenza non da un'altro orario, ma da un certo numero di ore, minuti, secondi, da sottrarre ad un determinato numero di ore. Esempio (banale): supponiamo di voler sapere che ore saranno togliendo 5 ore e 25 minuti alle 17. Per meglio capire, vediamo prima la sintassi della funzione:

TimeSerial(ora, minuti, secondi)

La sintassi della funzione TimeSerial è composta dai seguenti argomenti predefiniti:
 

Parte

Descrizione

Ora Obbligatoria. Variant (Integer). Numero compreso tra 0 (12.00) e 23 (23.00) inclusi oppure un'espressione numerica.
Minuti Obbligatoria. Variant (Integer). Qualsiasi espressione numerica.
Secondi Obbligatoria. Variant (Integer). Qualsiasi espressione numerica.

E' necessario quindi fornire tutti e tre gli argomenti, (ore,minuti,secondi), separati da una virgola. Poichè la funzione consente di eseguire "direttamente" la differenza tra due valori ora,  meno i minuti, meno i secondi, un istruzione va compilata in questo modo:

TimeSerial(12 - 6, -15, 0)

12 è l'ora da cui vogliamo sottrarre 6 ore e 15 minuti, ovvero la funzione TimeSerial restituisce un'ora che corrisponde a sei ore (12 - 6) e a 15 minuti (0 - 15) prima di mezzogiorno, cioè le 5.45.00

Per indicare un'ora specifica, quale 11.59.59, ciascun argomento della funzione TimeSerial dovrà essere rappresentato da un numero incluso nell'intervallo di valori validi per quell'argomento. I valori validi per le ore vanno da 0 a 23, per i minuti e per i secondi da 0 a 59. Se un qualsiasi argomento non rientra nell'intervallo valido specifico dell'argomento, verrà incrementato all'unità superiore successiva in modo appropriato. Se si specifica, ad esempio, 75 minuti, l'argomento "minuti" verrà valutato come 1 ora e 15 minuti. Se si usasse un'ora + frazione di ora come 16,30 , verrà valutato solo l'argomento "ora" e non i minuti dopo la virgola.

Se volessimo fare un esempio su un foglio di lavoro, dovremmo vedere una situazione del genere:

  C D E F G
1          
2          
3   16 4 20 0

dove in D3 abbiamo l'ora a cui vanno sottratte:

  • 4 ore in E3

  • 20 minuti in F3

  • 0 secondi in G3

in C3 vorremo il valore restituito dalla funzione TimeSerial, che fornirà questo risultato:

  C D E F G
1          
2          
3

11.40.00 AM

16 4 20 0

e ora vediamo la procedura della macro:

Sub Differenzaore()
Dim gg  
'si dichiara la variabile gg

 'ora si assegnano a tre variabili i valori contenuti nelle celle
x = Range("D3").Value 
'con x si prende l'ora da cui sottrarre (16 o quel che vorrete)
y = Range("E3").Value  
'con y si prende il numero di ore da sottrarre da x  (4 o quel che vorrete)
z = Range("F3").Value 
 'con z si prende il numero di minuti da sottrarre da x  (20 o quel che vorrete)
gg = TimeSerial(x - y, -z, 0)
'ora si restituisce a gg il valore ottenuto con TimeSerial, usando le variabili a 'posto dei numeri. Per i secondi, visto che non ci interessano, usiamo lo zero (0) direttamente in formula.
Range("C3") = gg  
'poi si assegna a C3 il valore rappresentato da gg
End Sub

Attenzione: il formato delle celle da D a G 3 è "generale", in C3 provvederà il codice a formattare in formato personalizzato h.mm.ss. AM/PM. Se vorrete, potrete preimpostare la cella di destinazioni in un vostro formato preferito, esempio: personalizzato, h.mm.ss e la data sopra la vedreste 11.40.00

Capisco che siano argomenti un pò ostici, ma tant'è, e consiglio quindi di munirsi di santa pazienza e provare senza arrabbiarsi, per le proprie esigenze. E' sempre meglio comunque aiutarsi con la guida in linea.

 

Buon lavoro.