Een timer gebruiken in MS Office VBA-macro's

Voor degenen onder ons die onze geest diep in de gaten hebben VB.NET, de reis terug naar VB6 kan een verwarrende reis zijn. Een timer gebruiken in VB6 is zo. Tegelijkertijd is het toevoegen van tijdgebonden processen aan uw code niet vanzelfsprekend voor nieuwe gebruikers van VBA-macro's.

Timers voor nieuwkomers

Codering 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 in beslag wordt genomen door verschillende delen van uw code, zodat u kunt werken aan het optimaliseren van de langzame secties. Soms wilt u misschien zien of er iets in de toepassing gebeurt wanneer de computer daar gewoon niet lijkt te zitten, wat een beveiligingsprobleem kan zijn. Timers kunnen dat doen.

Start een timer

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

instagram viewer

uitdrukking. OnTime (wanneer, naam, tolerantie)

De syntaxis voor Excel ziet er als volgt uit:

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

Beide hebben de eerste en tweede parameter gemeen. De tweede parameter is de naam van een andere macro die wordt uitgevoerd wanneer de tijd in de eerste parameter is bereikt. In feite is het coderen van deze instructie vergelijkbaar met het maken van een gebeurtenissubroutine in VB6- of VB.NET-termen. De gebeurtenis bereikt de tijd in de eerste parameter. De gebeurtenissubroutine is de tweede parameter.

Dit verschilt van de manier waarop het is gecodeerd in VB6 of VB.NET. Om te beginnen kan de macro die in de tweede parameter wordt genoemd, zich in elke code bevinden die toegankelijk is. In een Word-document raadt Microsoft aan om 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 toepassingsobject. In de Word- en Excel-documentatie staat dat de derde parameter de uitvoering van de gebeurtenismacro kan annuleren als een dialoogvenster of een ander proces verhindert dat het binnen een bepaalde tijd wordt uitgevoerd. In Excel kunt u een nieuwe tijd plannen voor het geval dat gebeurt.

Codeer de Time Event Macro

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.

Openbare Sub TestOnTime ()
Debuggen. Afdrukken "Het alarm gaat over 10 seconden af!"
Debuggen. Afdrukken ("Before OnTime:" & Now)
alertTime = Nu + TimeValue ("00:00:10")
Toepassing. OnTime alertTime, "EventMacro"
Debuggen. Afdrukken ("After OnTime:" & Now)
Einde Sub
Sub EventMacro ()
Debuggen. Afdrukken ("Executing Event Macro:" & Now)
Einde Sub

Dit resulteert in de volgende inhoud in het directe venster:

Het alarm gaat over 10 seconden af!
Vóór OnTime: 25/12/2000 19:41:23 PM
Na OnTime: 25/12/2000 19:41:23 PM
Event Macro uitvoeren: 27-2-2010 19:41:33

Optie voor andere Office-apps

Andere Office-toepassingen implementeren OnTime niet. Daarvoor heb je verschillende keuzes. Ten eerste kunt u de timerfunctie gebruiken, die eenvoudig het aantal seconden sinds middernacht op uw pc retourneert en uw eigen wiskunde doet, of u kunt Windows API-aanroepen gebruiken. Het gebruik van Windows API-aanroepen heeft het voordeel dat het nauwkeuriger is dan Timer. Hier is een door Microsoft voorgestelde routine 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 als dubbel
dTime = MicroTimer
Dim StartTime als Single
StartTime = Timer
Voor i = 1 tot 10000000
Dim j als dubbel
j = Sqr (i)
De volgende
Debuggen. Afdrukken ("Opgenomen MicroTimer-tijd was:" & MicroTimer - dTime)
Einde Sub
Functie MicroTimer () als dubbel
'
'Retourneert seconden.
'
Dim cyTicks1 als valuta
Statische cyfrequentie als valuta
'
MicroTimer = 0
'Haal frequentie.
Als cyFrequency = 0 Dan getFrequency cyFrequency
'Krijg teken.
getTickCount cyTicks 1
'Seconden
Als cyFrequency Dan MicroTimer = cyTicks1 / cyFrequency
Einde functie