Per quelli di noi che hanno le nostre menti profondamente in VB.NET, il viaggio di ritorno a VB6 può essere un viaggio confuso. L'uso di 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.
La codifica di una macro VBA di Word per cronometrare automaticamente un test scritto in Word è un motivo tipico per l'utilizzo di un timer. Un altro motivo comune è vedere quanto tempo viene impiegato da diverse parti del codice in modo da poter lavorare sull'ottimizzazione delle sezioni lente. A volte, potresti voler vedere se qualcosa sta accadendo nell'applicazione quando il computer sembra essere seduto lì inattivo, il che può essere un problema di sicurezza. I timer possono farlo.
Si avvia un timer codificando un'istruzione OnTime. Questa affermazione è implementata in Word ed Excel, ma ha una sintassi diversa a seconda di quella che stai usando. La sintassi di Word è:
expression.OnTime (When, Name, Tolerance)
La sintassi per Excel è simile alla seguente:
expression.OnTime (EarliestTime, Procedure, LatestTime, Schedule)
Entrambi hanno in comune il primo e il secondo parametro. Il secondo parametro è il nome di un'altra macro che viene eseguita quando viene raggiunta l'ora nel primo parametro. In effetti, codificare questa affermazione è come creare una subroutine di evento in termini VB6 o VB.NET. L'evento sta raggiungendo il tempo nel primo parametro. La subroutine dell'evento è il secondo parametro.
Ciò è diverso dal modo in cui è codificato in VB6 o VB.NET. Per prima cosa, la macro nominata 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 è generalmente l'oggetto Application. La documentazione di Word ed Excel indica che il terzo parametro può annullare l'esecuzione della macro di eventi nel caso in cui una finestra di dialogo o qualche altro processo ne impedisca l'esecuzione entro un determinato tempo. In Excel, è possibile pianificare un nuovo orario nel caso ciò accada.
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 si spegnerà tra 10 secondi!"
Debug.Print ("Before OnTime:" & Now)
alertTime = Now + TimeValue ("00:00:10")
Application.OnTime alertTime, "EventMacro"
Debug.Print ("After OnTime:" & Now)
End Sub
Sub EventMacro ()
Debug.Print ("Esecuzione della macro degli eventi:" e ora)
End Sub
Ciò comporta il seguente contenuto nella finestra immediata:
L'allarme suonerà tra 10 secondi!
Prima dell'ora: 25/12/2000 19:41:23 PM
After OnTime: 25/12/2000 19:41:23 PM
Macro evento in esecuzione: 27/02/2010 19:41:33 PM
Altre applicazioni di Office non implementano OnTime. Per quelli, hai diverse scelte. Innanzitutto, è possibile utilizzare la funzione Timer, che restituisce semplicemente il numero di secondi dalla mezzanotte sul PC e fa i propri calcoli, oppure è possibile utilizzare le chiamate API di Windows. L'uso 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) Finché
Funzione di dichiarazione privata getTickCount Lib "kernel32" _
Alias "QueryPerformanceCounter" (cyTickCount As Currency) Il più a lungo
Sub TestTimeAPICalls ()
Dim dTime As Double
dTime = MicroTimer
Dim StartTime come singolo
StartTime = Timer
Per i = 1 a 10000000
Dim j come doppio
j = Sqr (i)
Il prossimo
Debug.Print ("MicroTimer Tempo impiegato è stato:" & MicroTimer - dTime)
End Sub
Funzione MicroTimer () Come doppio
'
'Restituisce secondi.
'
Dim cyTicks1 Come valuta
CyFrequency statica come valuta
'
MicroTimer = 0
'Ottieni frequenza.
Se cyFrequency = 0 Quindi getFrequency cyFrequency
'Ottieni zecche.
getTickCount cyTicks1
'Secondi
Se cyFrequency Quindi MicroTimer = cyTicks1 / cyFrequency
Fine funzione