Använda en timer i Office VBA-makron

För oss som har våra tankar in i VB.NET kan resan tillbaka till VB6 vara en förvirrande resa. Att använda en timer i VB6 är så. Samtidigt är det inte uppenbart för nya användare av VBA-makron att lägga till tidsbestämda processer till din kod.

Tidtagare för nybörjare

Att koda ett Word-VBA-makro för att automatiskt ställa in ett test som har skrivits i Word är ett typiskt skäl för att använda en timer. Ett annat vanligt skäl är att se hur mycket tid som tar olika delar av din kod så att du kan arbeta med att optimera de långsamma avsnitten. Ibland kanske du vill se om något händer i applikationen när datorn verkar bara sitta där i viloläge, vilket kan vara ett säkerhetsproblem. Tidtagare kan göra det.

Starta en timer

Du startar en timer genom att koda ett OnTime-uttalande. Detta uttalande implementeras i Word och Excel, men det har olika syntax beroende på vilket du använder. Syntaxen för Word är:

expression.OnTime (När, namn, tolerans)

Syntaxen för Excel ser ut så här:

expression.OnTime (tidigaste tid, procedur, senaste tid, schema)

Båda har den första och den andra parametern gemensamt. Den andra parametern är namnet på ett annat makro som körs när tiden i den första parametern nås. I själva verket är kodning av detta uttalande som att skapa en subroutine för händelser i VB6- eller VB.NET-termer. Händelsen når tiden i den första parametern. Händelsens subrutin är den andra parametern.

Detta skiljer sig från hur det kodas i VB6 eller VB.NET. För en sak kan makro som heter i den andra parametern vara i vilken kod som är tillgänglig. I ett Word-dokument rekommenderar Microsoft att du lägger det i Normal dokumentmall. Om du lägger den i en annan modul rekommenderar Microsoft att du använder den fulla sökvägen: Project.Module.Macro.

Uttrycket är vanligtvis applikationsobjektet. Dokumentationen från Word och Excel anger att den tredje parametern kan avbryta exekveringen av händelsemakro i fall en dialog eller någon annan process förhindrar att den körs inom en viss tid. I Excel kan du schemalägga en ny tid om det skulle hända.

Koda tidshändelsemakroen

Den här koden i Word är för administratören som vill visa ett meddelande om att testtiden har gått ut och skriva ut resultatet av testet.

Public Sub TestOnTime ()
Debug.Print "Larmet kommer att slockna på 10 sekunder!"
Debug.Print ("Before OnTime:" & Now)
alertTime = Nu + TimeValue ("00:00:10")
Application.OnTime alertTime, "EventMacro"
Debug.Print ("After OnTime:" & Now)
Avsluta under
Sub EventMacro ()
Debug.Print ("Exekverande händelsemakro:" och nu)
Avsluta under

Detta resulterar i följande innehåll i det omedelbara fönstret:

Larmet kommer att slockna om 10 sekunder!
Före tid: 12/25/2000 19:41:23
After OnTime: 12/25/2000 19:41:23 PM
Utförande av händelsemakro: 2007-02-27 19:41:33

Alternativ för andra Office-appar

Andra Office-applikationer implementerar inte OnTime. För dem har du flera val. Först kan du använda Timer-funktionen, som helt enkelt returnerar antalet sekunder sedan midnatt på din PC och gör din egen matematik, eller så kan du använda Windows API-samtal. Att använda Windows API-samtal har fördelen att vara mer exakt än Timer. Här är en rutin föreslagen av Microsoft som gör tricket:

Privat deklarera funktion getFrequency Lib "kernel32" _
Alias ​​"QueryPerformanceFrequency" (cyFrequency As Currency) så länge
Privat deklarera funktion getTickCount Lib "kernel32" _
Alias ​​"QueryPerformanceCounter" (cyTickCount som valuta) så länge
Sub TestTimeAPICalls ()
Dim dTime som dubbelt
dTime = MicroTimer
Dim StartTime som singel
StartTime = Timer
För i = 1 till 10000000
Dim j som dubbel
j = Sqr (i)
Nästa
Debug.Print ("MicroTimer Time taken was:" & MicroTimer - dTime)
Avsluta under
Funktion MicroTimer () som dubbel
'
Returnerar sekunder.
'
Dim cyTicks1 som valuta
Statisk cyFrekvens som valuta
'
MicroTimer = 0
"Få frekvens.
Om cyFrequency = 0 Sedan getFrequency cyFrequency
"Få fästingar.
getTickCount cyTicks1
"Sekunder
Om cyFrequency Då MicroTimer = cyTicks1 / cyFrequency
Avsluta funktion