Christian sta sviluppando una macro di Excel che visualizza una serie di elementi all’utente. Vorrebbe introdurre nella macro un ritardo di, diciamo, un secondo tra ogni informazione visualizzata, e si chiede se esista un modo semplice per aggiungere tale ritardo.
Esistono alcuni modi per introdurre un ritardo nella macro. Il modo tradizionale consiste nell’utilizzare il metodo Wait, utilizzato con l’oggetto Application. Lo usi per introdurre un ritardo di un secondo in questo modo:
Application.Wait (Now() + TimeValue("0:00:01"))
Tieni presente che il parametro richiesto dal metodo Wait è l’ora in cui desideri che la macro riprenda l’esecuzione. In altre parole, significa “aspetta fino a”.. Questo è il motivo per cui l’esempio precedente utilizza l’ora corrente (dalla funzione Now) incrementata di un secondo.
Se preferisci non utilizzare il metodo Wait (per qualsiasi motivo), puoi anche semplicemente utilizzare un ciclo per prendere tempo:
Dim WaitTime As Date
WaitTime = Now() + TimeValue("0:00:01")
Do While Now < WaitTime
Loop
Una variante di questo approccio si basa sulla funzione Timer, che restituisce il numero di secondi trascorsi dalla mezzanotte:
Dim Endpoint as Single
Endpoint = Timer + 1
Do While Timer < Endpoint
Loop
Quando si utilizza un loop in questo modo, probabilmente non sarà un grosso problema se si ritarda solo per un secondo. Se hai bisogno di ritardare per un tempo più lungo, probabilmente vorrai inserire la funzione DoEvents nel ciclo:
Dim Endpoint as Single
Endpoint = Timer + 1
Do While Timer < Endpoint
DoEvents
Loop
Il motivo è semplice: in caso contrario, Excel non risponderà a nessun altro evento durante il ciclo. Ciò può far sembrare che il tuo sistema si sia bloccato durante l’attesa.
Se hai bisogno di maggiore granularità sui ritardi (fino all’intervallo dei millisecondi), potresti fare affidamento sulla funzione Sleep, che fa parte dell’API di Windows (non fa parte di VBA). Per usarla, dovrai includere una dichiarazione all’inizio del modulo, nell’area dichiarazioni, prima di qualsiasi procedura:
#If VBA7 And Win64 Then
Public Declare PtrSafe Sub Sleep Lib "kernel32"(ByVal dwMilliseconds As Long)
#Else
Public Declare Sub Sleep Lib "kernel32"(ByVal dwMilliseconds As Long)
#End If
Quindi, all’interno della tua macro puoi utilizzare la funzione Sleep in questo modo:
Sleep(1000)
Questo mette in pausa il sistema per 1000 millisecondi, ovvero 1 secondo.