Conto alla rovescia (Countdown)
(13/06/03) (agg. il
27/07/2009)
Un simpatico
esercizio per crearsi un "Conto alla rovescia". Le istruzioni si basano
sull'utilizzo della funzione Timer, che ci
consente di "temporizzare" delle istruzioni. Vogliamo infatti usare una
cella (ma anche una MsgBox) dove veder scorrere i secondi all'indietro fino
ad un'ora X. Queste le istruzioni, ottenute modificando un esempio preso
dalla guida in linea.
Sub ContoRovescia()
'assegniamo ad una cella un
valore espresso in secondi che rappresenta il tempo massimo iniziale
Range("B1").Value = 60
10: 'indice riga a cui si ritorna
per continuare il ciclo
Dim PauseTime, Start
'dimensionamento delle due variabili
PauseTime = 1 ' Imposta la durata
espressa in secondi
Start = Timer ' Imposta l'ora di inizio.
Do While Timer < Start + PauseTime
DoEvents ' Passa il controllo ad altri
processi.
Loop
'quindi ad ogni secondo trascorso
temporizzato dal timer si sottrae 1 al valore presente nella cella B1
Range("B1").Value = Range("B1").Value - 1
'inseriamo l'istruzione: se
B1 è uguale a zero
If Range("B1").Value = 0 Then
'avvisiamo con un messaggio
MsgBox "L'ora X è scoccata"
Exit Sub 'si esce dalla routine
End If
'altrimenti (se non siamo a
zero in B1), si ritorna alla riga 10
GoTo 10
End Sub |
Attenzione: con valori di PauseTime bassi (un secondo come
nell'esempio), se si lavora sul foglio di lavoro si interrompe in conto alla
rovescia (vedi paragrafo "Problemi associati a DoEvents" nella pagina
di supporto Microsoft
http://support.microsoft.com/kb/118468/it)
Aggiornamento 27/07/2009
Una soluzione al problema del blocco se usiamo il foglio di lavoro in
contemporanea alla routine vista sopra, è la seguente:
-
usiamo una
UserForm opportunamente dimensionata, con inserita una TextBox dove
faremo apparire i numeri del conto alla rovescia;
-
imposteremo la
proprietà ShowModal della UserForm a
False, e questo ci consentirà di poter spostare la stessa o
comunque di agire sul foglio di lavoro mentre la routine, inserita in un
Modulo Standard, è in esecuzione.
-
inseriremo
l'istruzione End nell'evento
QueryUnload della UserForm per consentire
l'utilizzo della X di chiusura per chiudere la userform anche con la
procedura in corso, senza generare errori.
E questa la
routine con i riferimenti alla UserForm1; nell'esempio il conteggio lo
temporiziamo su 60 secondi con intervallo a scalare di 1 secondo:
Sub
ContoRovesciaSuForm()
UserForm1.Show
UserForm1.TextBox1 = 60 ' Si
imposta la durata totale del tempo espressa in secondi
10:
'indice riga a cui si ritorna per continuare il ciclo
Dim PauseTime, Start
'dimensionamento delle due variabili
PauseTime = 1
' Si imposta la durata del temporizzatore
espressa in secondi
Start = Timer '
Imposta l'ora di inizio.
Do While Timer < Start + PauseTime
DoEvents '
Passa il controllo ad altri processi.
Loop
UserForm1.TextBox1 = UserForm1.TextBox1 - 1
'Scaliamo di 1 secondo il valore
nella textbox
If UserForm1.TextBox1 = 0 Then
'quando il valore in textbox sarà
uguale a zero
MsgBox "L'ora X è scoccata" 'si
avvisa con un messaggio
Unload UserForm1
'chiudiamo la userform
Exit Sub
'usciamo dalla Sub
End If
GoTo 10
End Sub |
In questo modo è
possibile avere il Countdown e lavorare sul foglio. La userform l'ho
posizionata appena all'inizio del foglio di lavoro; agendo sui valori delle
proprietà Top e Left della userform la potrete far apparire dove deciderete:
File da scaricare:
Countdown.zip 11 kb.
Buon lavoro.
prelevato sul sito http://ennius.interfree.it |