Facciamo un orologio sul Foglio di lavoro.   (25/05/03)

A volte abbiamo la necessità di conoscere che ore sono allorchè lavoriamo sui fogli di Excel. Possiamo usare la funzione di Excel =ADESSO() inserita in una cella, che ci restituisce la data e l'ora di sistema. L'orario non scorre però come in un orologio, ma rimane fisso al momento in cui abbiamo aperto il foglio, e si aggiorna soltanto se inseriamo o modifichiamo dei valori  sul foglio di lavoro, e l'aggiornamento comunque non avviene nella scala dei minuti se effettuiamo una variazione in una cella all'interno del minuto dell'orario attualmente presente nella cella con la funzione. Non è proprio ciò che possiamo considerare un : "orologio".

Sfruttando la funzione vba "Timer", è però possibile usare una routine "autoinnescante" che, trascorso un determinato periodo di tempo, che decideremo noi, riattivi la funzione =ADESSO() (in inglese: NOW), generando l'aggiornamento dell'orario.

Attenzione: la macro qui presentata può provocare effetti indesiderati disabilitando alcune barre dei menù. Prima di deciderne un eventuale utilizzo, provatela su file non importanti.

Creiamo quindi una macro che inseriremo in un modulo e potremo attivare "l'orologio" associando la macro ad un pulsante, ma meglio ancora potremo sfruttare un evento che per tutti noi è quasi impossibile non generare: il cambio di selezione di una cella sul foglio di lavoro; in questo modo attiveremo la macro ad ogni operazione che eseguiamo sul foglio di lavoro. Non è necessario riscrivere nel Worksheet_SelectionChange del foglio di lavoro scelto tutte le istruzioni, ma sarà sufficiente richiamare il nome della macro, così:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Oriolo
 'nome della macro
End Sub

Un avvertimento: poichè una volta avviata la macro, questa continua a girare restando sempre attiva, se avremo bisogno di compilare altre istruzioni vba, sarà necessario "stoppare" la macro stessa, selezionando la routine e cliccando il pulsantino quadrato blu che troviamo nel menù dell'editor di visual basic, che corrisponde al comando "Ripristina", oppure dal menù Esegui/Ripristina.

Sarà comunque possibile eseguire modifiche sul foglio di lavoro anche con la macro avviata, come pure lanciare altre macro precedentemente compilate; questo perchè nelle istruzioni sotto riportate, usiamo la funzione vba "DoEvents" che sospende l'esecuzione in modo che il sistema operativo possa elaborare altri eventi. Vediamo le istruzioni: nell'esempio uso la cella A1, formato cella = Ora, come cella Orologio: (tenere presente che se avviamo la macro tramite pulsante, (mettiamo dal Foglio1), la stessa, restando attiva, sarà efficace in tutte le celle A1 di tutti i fogli della cartella, basterà spostarsi su un'altro foglio, per veder comparire in A1 l'orologio; lasciare quindi disponibile (non usare per altre istruzioni o dati) la cella che deciderete di usare come orologio); la macro attivata da pulsante si fermerà soltanto se in una cella clicchiamo per inserire una formula, mentre sul foglio di cui sfruttiamo l'evento SelectionChange, selezionando appunto una qualsiasi cella, la riattiviamo:

Sub Oriolo()
Dim PauseTime, Start, Finish, TotalTime
'dichiarazione variabili impiegate
Range("A1").Value = Now
  'assegnazione alla cella A1 della funzione Adesso()
Range("A1") = Format(Range("A1"), "h.m.ss") 'impostiamo il formato nella cella A1
10:
PauseTime = 3 ' Imposta la durata della pausa, espressa in secondi
Start = Timer
' Imposta l'ora di inizio e attiva il Timer.

Do While Timer < Start + PauseTime
'fintantochè il valore del Timer è inferiore al valore 'dato dalla somma del valore iniziale del Timer (preso con la variabile Start) più il valore 'rappresentato dalla variabile PauseTime
DoEvents
' Passa il controllo ad altri processi.

Loop
' continua a far girare il Timer fino a che il suo valore è uguale a Start + PauseTime, 'allora passa alla seguente riga:
Finish = Timer
' Imposta l'ora di fine della pausa.
TotalTime = Finish - Start
' Calcola il tempo totale.

'sotto: ora riportatiamo in A1 il valore di Adesso() ed otteniamo quindi l'aggiornamento.
Range("A1").Value = Now

Range("A1") = Format(Range("A1"), "h.m.ss") 'impostiamo il formato nella cella A1.
'sotto: poichè a questo punto la routine finirebbe con End Sub, e allora addio orologio, 'con l'istruzione GoTo 10 mandiamo il codice all'indice riga 10 riattivando le istruzioni 'relative al timer:
GoTo 10

End Sub


Suggerimento: non consiglio di scendere sotto i tre secondi come PauseTime, pena il rischio di non lasciare spazio al sistema di reagire ad altri eventi, meglio sarebbe impostarlo ogni 5 secondi, l'effetto "orologio" resta comunque valido. (routine provata solo sul Excel XP)
 

Buon lavoro.

prelevato sul sito http://ennius.interfree.it