Een timer gebruiken in Office VBA-macro's

Voor degenen onder ons die diep in VB.NET zitten, kan de reis terug naar VB6 een verwarrende reis zijn. Het gebruik van een timer in VB6 is zo. Tegelijkertijd is het voor nieuwe gebruikers van VBA-macro's niet duidelijk om getimede processen aan uw code toe te voegen.

Timers voor nieuwkomers

Het coderen van een Word VBA-macro om automatisch een test te timen die in Word is geschreven, is een typische reden voor het gebruik van een timer. Een andere veel voorkomende reden is om te zien hoeveel tijd er door verschillende delen van uw code wordt besteed, zodat u kunt werken aan het optimaliseren van de trage secties. Soms wilt u misschien zien of er iets in de toepassing gebeurt terwijl de computer gewoon inactief lijkt te zijn, wat een beveiligingsprobleem kan zijn. Timers kunnen dat.

Start een timer

U start een timer door een OnTime-instructie te coderen. Deze verklaring is geïmplementeerd in Word en Excel, maar heeft een andere syntaxis, afhankelijk van welke u gebruikt. De syntaxis voor Word is:

expression.OnTime (wanneer, naam, tolerantie)

De syntaxis voor Excel ziet er als volgt uit:

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

Beide hebben de eerste en tweede parameter gemeenschappelijk. De tweede parameter is de naam van een andere macro die wordt uitgevoerd wanneer de tijd in de eerste parameter is bereikt. Het coderen van deze verklaring is in feite hetzelfde als het maken van een gebeurtenis-subroutine in termen van VB6 of VB.NET. De gebeurtenis bereikt de tijd in de eerste parameter. De event-subroutine is de tweede parameter.

Dit verschilt van de manier waarop het is gecodeerd in VB6 of VB.NET. Ten eerste kan de in de tweede parameter genoemde macro zich in elke code bevinden die toegankelijk is. In een Word-document raadt Microsoft aan het in de normale documentsjabloon te plaatsen. Als u het in een andere module plaatst, raadt Microsoft aan het volledige pad te gebruiken: Project.Module.Macro.

De uitdrukking is meestal het object Application. In de Word- en Excel-documentatie staat dat de derde parameter de uitvoering van de gebeurtenismacro kan annuleren in het geval dat een dialoogvenster of een ander proces verhindert dat deze binnen een bepaalde tijd wordt uitgevoerd. In Excel kunt u een nieuwe tijd plannen voor het geval dat gebeurt.

Codeer de macro voor tijdgebeurtenissen

Deze code in Word is voor de beheerder die een melding wil weergeven dat de testtijd is verstreken en het resultaat van de test wil afdrukken.

Public Sub TestOnTime ()
Debug.Print "Het alarm gaat na 10 seconden af!"
Debug.Print ("Before OnTime:" & Now)
alertTime = Nu + TimeValue ("00:00:10")
Application.OnTime alertTime, "EventMacro"
Debug.Print ("After OnTime:" & Nu)
Einde Sub
Sub EventMacro ()
Debug.Print ("Event Macro uitvoeren:" & Nu)
Einde Sub

Dit resulteert in de volgende inhoud in het directe venster:

Het alarm gaat na 10 seconden af!
Voor OnTime: 25-12-2000 19:41:23 uur
Na OnTime: 25-12-2000 19:41:23 uur
Evenementmacro uitvoeren: 27-2-2010 19:41:33 PM

Optie voor andere Office-apps

Andere Office-toepassingen implementeren OnTime niet. Daarvoor heb je verschillende keuzes. Ten eerste kunt u de timerfunctie gebruiken, die eenvoudigweg het aantal seconden sinds middernacht op uw pc retourneert en uw eigen wiskunde uitvoert, of u kunt Windows API-aanroepen gebruiken. Het gebruik van Windows API-aanroepen heeft het voordeel dat ze preciezer zijn dan Timer. Hier is een routine voorgesteld door Microsoft die het lukt:

Private Declare Functie getFrequency Lib "kernel32" _
Alias ​​"QueryPerformanceFrequency" (cyFrequency As Currency) zo lang
Private Declare-functie getTickCount Lib "kernel32" _
Alias ​​"QueryPerformanceCounter" (cyTickCount As Currency) zo lang
Sub TestTimeAPICalls ()
Dim dTime As Double
dTime = MicroTimer
Dim StartTime als Single
StartTime = Timer
Voor i = 1 tot 10000000
Dim j als dubbel
j = Sqr (i)
De volgende
Debug.Print ("MicroTimer-tijd was:" & MicroTimer - dTime)
Einde Sub
Functie MicroTimer () als dubbel
'
'Retourneert seconden.
'
Dim cyTicks1 als valuta
Statische cyFrequentie als valuta
'
MicroTimer = 0
'Krijg frequentie.
Als cyFrequency = 0 Vervolgens getFency cyFrequency
'Teken halen.
getTickCount cyTicks1
'Seconden
Als cyFrequency dan MicroTimer = cyTicks1 / cyFrequency
Einde functie