Lavorare con Date o Ore. - dal 04/09/04 pagina vista: volte

Ancora dei suggerimenti su come lavorare con Date oppure Ore. Premetto che le routine di base non sono mie, ma le ho reperite sul sito http://www.mvps.org/dmcritchie/excel/xlindex.htm (peraltro segnalato in Libri & Link su ennius.interfree), io mi sono limitato a modificarle per presentarvi due esercizi interessanti :

  1. Un Mini-Timer per ottenere il tempo trascorso (magari lavorando su un Foglio).

  2. La Colorazione diversa delle celle di una zona, per differenziare :

  • date uguali alla data odierna

  • date successive alla data odierna

  • date antecedenti la data odierna

  • tutte le celle NON contenenti una data.

  • tutte le celle vuote comprese nell'area da controllare

  • questo esercizio risulta utile per individuare subito, in base al colore, ciò che stiamo cercando tra le tre opzioni evidenziate.

Vediamo subito il primo esercizio, il Mini-Timer. Due immagini che spiegano, la prima, il momento dell'avvio tramite pressione sul pulsante "Start", la seconda il momento in cui si stoppa con in C2 la differenza tra avvio e stop:

 

Ho basato le modifiche sulla necessità di ottenere al momento dell'avvio, una copia dell'orario di partenza, posta in B2, in modo da ottenere la differenza in C2 tra i due orari. Ovviamente ho inserito una condizione che rende uguale la cella B2 alla cella A2 SOLO se la cella B2 sarà vuota, condizione che si verifica SOLO all'avvio in quanto ad ogni avvio faccio pulire le tre celle in modo da reinizializzare le celle. Vediamo le routine con spiegazioni, da inserire tutte nello stesso modulo:

Dim stopit As Boolean 'variabile da inserire in Dichiarazioni - Generale del modulo

___________________________________________________________________
Sub startclock() 'macro assegnata al pulsante Start
stopit = False
'si imposta la variabile stopit a Falso per poter agire con la macro clock()
[A2:C2].ClearContents 
'pulisco le celle da A2 a C2
clock 
'si chiama la macro clock() e la si lancia
End Sub

___________________________________________________________________
Sub clock()  'macro predisposta nel modulo che svolge il compito di timer. Il concetto è 'semplice: con OnTime e TimeSerial si incrementa il valore di Now (Adesso()) di un 'secondo, richiamando di nuovo questa stessa macro all'infinito, fino a quando non si 'renderà stopit uguale a True tramite la macro associata al pulsante Stop.
If stopit = True Then Exit Sub  'se stopit è uguale a True si esce dalla routine 'interrompendo il ciclo

ActiveWorkbook.Worksheets(1).Cells(2, 1).Value = _
Format(Now, "hh:mm:ss")
'si assegna Now e si imposta il formato ora per la cella A2
If [A2] <> "" And [B2] = "" Then [B2] = [A2]
'si controlla se A2 contiene valori E se B2 'invece è vuoto, allora si rende B2 uguale a A2
Application.OnTime (Now + TimeSerial(0, 0, 1)), "clock"
'vedi a inizio macro
End Sub
___________________________________________________________________
Sub stopclock()
'macro associata al pulsante Stop
stopit = True  
'si rende stopit uguale a True così che la condizione posta ad inizio della 'macro clock() interrompa il timer
[C2].Value = TimeValue([a2]) - TimeValue([b2]) 
'si prende con TimeValue il valore 'contenuto nelle due celle A2 e B2 rendendolo come orario, e si fa la sottrazione tra il 'valore maggiore ed il minore, assegnandolo alla cella C2
[C2].Value = Format([C2].Value, "hh:mm:ss")
'indi si imposta il formato ora per C2
End Sub

Nota: sul sito ennius.interfree, sezione VBA, trovate articoli su TimeValue e TimeSerial (articolo "Calcolo date segue 3") e su OnTime (articolo "Far lampeggiare i fonts").

Passiamo al secondo esercizio. Come abbiamo detto in apertura, anche questa routine è stata da me adattata per offrire un maggior numero di opzioni nel colorare condizioni diverse. Chiunque potrà decidere di modificare le condizioni ed il colore di riempimento, come pure il sistema per identificare l'area su cui intervenire. Nell'esempio ho usato UsedRange per identificare tutta una zona del foglio di lavoro dove sono presenti dati, ma potrà essere usato un riferimento preciso con cella iniziale e finale, oppure usare il metodo End per identificare gli estremi  di un area contenente dati. Vediamo la routine e le spiegazioni:

Sub ColoraCelle()
Cells.Interior.ColorIndex = 0
'si impostano tutte le celle senza colore
Dim cell As Range  'dichiarazione di cell  come Range
Set zona = ActiveSheet.UsedRange
'impostazione della variabile zona come UsedRange


For Each cell In zona
'per ogni cella in zona
If IsDate(cell) Then
' si controlla se il valore di una cella è una data, se è una data, allora:
If cell.Value > Date Then 
'se il valore della cella è maggiore rispetto alla data odierna
cell.Interior.ColorIndex = 3
'si colora la cella di rosso
ElseIf cell.Value = Date Then
'se ancora, il valore è uguale all data odierna
cell.Interior.ColorIndex = 6
'si colora la cella di giallo
Else
'altrimenti, cioè se la data è antecedente a quella odierna
cell.Interior.ColorIndex = 40
'si colora la cella di arancione chiaro
End If 
'chiude il secondo If
Else: cell.Interior.ColorIndex = 15
'in tutti gli altri casi (se testo, numero, orario) si colora 'di grigio chiaro

'ho aggiunto anche questa istruzione, che in realtà serve a niente, ed è solo per mostrare 'che si possono aggiungere ancora condizioni. Questa condizione colora di verde chiaro 'tutte le celle vuote di zona
If cell.Value = "" Then cell.Interior.ColorIndex = 34
'questa volendo si può togliere
End If   
 'questa no, chiude il primo If

Next cell
'si passa alla cella successiva in zona
End Sub

e questa un immagine relativa all'esempio sopra:

 

Buon lavoro.

prelevato sul sito www.ennius.altervista.org