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