Utilizzo di un timer nelle macro VBA di Office

Per quelli di noi che hanno la mente profondamente in VB.NET, il viaggio di ritorno a VB6 può essere un viaggio confuso. Usare un timer in VB6 è così. Allo stesso tempo, l’aggiunta di processi a tempo al codice non è ovvia per i nuovi utenti di macro VBA.

Timer per principianti

La codifica di una macro VBA di Word per impostare automaticamente il tempo di un test scritto in Word è un motivo tipico per l’utilizzo di un timer. Un altro motivo comune è vedere quanto tempo viene impiegato dalle diverse parti del codice in modo da poter lavorare sull’ottimizzazione delle sezioni lente. A volte, potresti voler vedere se sta succedendo qualcosa nell’applicazione quando il computer sembra essere semplicemente inattivo, il che può essere un problema di sicurezza. I timer possono farlo.

Avvia un timer

Si avvia un timer codificando un’istruzione OnTime. Questa istruzione è implementata in Word ed Excel, ma ha una sintassi diversa a seconda di quale si sta utilizzando. La sintassi per Word è:

espressione.OnTime (Quando, Nome, Tolleranza)

La sintassi per Excel è simile a questa:

expression.OnTime (EarliestTime, Procedure, LatestTime, Schedule)

Entrambi hanno il primo e il secondo parametro in comune. Il secondo parametro è il nome di un’altra macro che viene eseguita quando viene raggiunta l’ora nel primo parametro. In effetti, codificare questa istruzione è come creare una subroutine di eventi in termini VB6 o VB.NET. L’evento sta raggiungendo l’ora nel primo parametro. La subroutine dell’evento è il secondo parametro.

Questo è diverso dal modo in cui è codificato in VB6 o VB.NET. Per prima cosa, la macro denominata nel secondo parametro può essere in qualsiasi codice accessibile. In un documento di Word, Microsoft consiglia di inserirlo nel modello di documento normale. Se lo inserisci in un altro modulo, Microsoft consiglia di utilizzare il percorso completo: Project.Module.Macro.

L’espressione è in genere l’oggetto Application. La documentazione di Word ed Excel afferma che il terzo parametro può annullare l’esecuzione della macro di eventi nel caso in cui una finestra di dialogo o un altro processo ne impedisca l’esecuzione entro un certo tempo. In Excel, puoi pianificare un nuovo orario nel caso in cui ciò accada.

Codifica la macro evento temporale

Questo codice in Word è per l’amministratore che desidera visualizzare una notifica che il tempo di test è scaduto e stampare il risultato del test.

Public Sub TestOnTime ()
Debug.Print “L’allarme suonerà tra 10 secondi!”
Debug.Print (“Before OnTime:” e ora)
alertTime = Now + TimeValue (“00:00:10”)
Application.OnTime alertTime, “EventMacro”
Debug.Print (“Dopo OnTime:” e ora)
End Sub
Sub EventMacro ()
Debug.Print (“Executing Event Macro:” & Now)
End Sub

Ciò si traduce nel seguente contenuto nella finestra immediata:

L’allarme suonerà tra 10 secondi!
Prima di OnTime: 12/25/2000 7:41:23
Dopo OnTime: 12/25/2000 7:41:23
Macro di eventi in esecuzione: 2/27/2010 7:41:33

Opzione per altre app di Office

Altre applicazioni di Office non implementano OnTime. Per quelli, hai diverse scelte. Innanzitutto, puoi utilizzare la funzione Timer, che restituisce semplicemente il numero di secondi trascorsi dalla mezzanotte sul tuo PC e fa i tuoi calcoli, oppure puoi usare le chiamate API di Windows. L’utilizzo delle chiamate API di Windows ha il vantaggio di essere più preciso di Timer. Ecco una routine suggerita da Microsoft che fa il trucco:

Funzione di dichiarazione privata getFrequency Lib “kernel32” _
Alias ​​”QueryPerformanceFrequency” (cyFrequency As Currency) As Long
Funzione di dichiarazione privata getTickCount Lib “kernel32” _
Alias ​​”QueryPerformanceCounter” (cyTickCount As Currency) As Long
Sub TestTimeAPICalls ()
Dim dTime As Double
dTime = MicroTimer
Dim StartTime As Single
StartTime = Timer
Per i = 1 A 10000000
Dim j As Double
j = Sqr (i)
Prossimo
Debug.Print (“Il tempo impiegato dal MicroTimer era:” & MicroTimer – dTime)
End Sub

Funzione MicroTimer () As Double

‘Restituisce secondi.

Dim cyTicks1 As Currency
CyFrequency statica come valuta

MicroTimer = 0
‘Ottieni frequenza.
Se cyFrequency = 0 Allora getFrequency cyFrequency
‘Prendi le zecche.
getTickCount cyTicks1
‘Secondi
Se cyFrequency Allora MicroTimer = cyTicks1 / cyFrequency
End Function