Utilizarea unui cronometru în macro-urile Office VBA

Pentru aceia dintre noi care ne gândim profund la VB.NET, călătoria înapoi la VB6 poate fi o călătorie confuză. Utilizarea unui Timer în VB6 este așa. În același timp, adăugarea proceselor cronometrate la codul dvs. nu este evidentă pentru noii utilizatori de Macro VBA.

Cronometre pentru începători

Codificarea unei macro Word VBA pentru a face automat un test scris în Word este un motiv tipic pentru utilizarea unui cronometru. Un alt motiv obișnuit este să vedeți cât timp este nevoie de diferite părți ale codului dvs., astfel încât să puteți lucra la optimizarea secțiunilor lente. Uneori, s-ar putea să doriți să vedeți dacă se întâmplă ceva în aplicație atunci când computerul pare doar să stea acolo inactiv, ceea ce poate fi o problemă de securitate. Cronometrele pot face asta.

Porniți un cronometru

Porniți un cronometru codificând o instrucțiune OnTime. Această afirmație este implementată în Word și Excel, dar are o sintaxă diferită în funcție de cea pe care o utilizați. Sintaxa pentru Word este:

expression.OnTime (Când, Nume, Toleranță)

Sintaxa pentru Excel arată astfel:

expression.OnTime (EarliestTime, Procedură, LatestTime, Schedule)

Ambele au în comun primul și al doilea parametru. Al doilea parametru este numele unei alte macro care se execută la atingerea timpului din primul parametru. De fapt, codificarea acestei afirmații este ca și cum ai crea o subrutină de eveniment în termeni VB6 sau VB.NET. Evenimentul atinge timpul din primul parametru. Subrutinul eveniment este al doilea parametru.

Acest lucru diferă de modul în care este codat în VB6 sau VB.NET. În primul rând, macro-ul numit în al doilea parametru poate fi în orice cod accesibil. Într-un document Word, Microsoft recomandă plasarea acestuia în șablonul Document normal. Dacă îl plasați într-un alt modul, Microsoft vă recomandă să folosiți calea completă: Project.Module.Macro.

Expresia este de obicei obiectul Application. Documentația Word și Excel precizează că al treilea parametru poate anula execuția macro-ului evenimentului în cazul în care un dialog sau un alt proces îl împiedică să funcționeze într-un anumit timp. În Excel, puteți programa un nou timp în cazul în care se întâmplă acest lucru.

Codează Macro Evenimentul Timpului

Acest cod în Word este pentru administratorul care dorește să afișeze o notificare cu privire la expirarea timpului de testare și tipărirea rezultatului testului.

Public Sub TestOnTime ()
Debug.Print "Alarma se va stinge în 10 secunde!"
Debug.Print („Înainte de OnTime:„ & Acum)
alertTime = Acum + TimeValue ("00:00:10")
Application.OnTime alertTime, "EventMacro"
Debug.Print („După OnTime:„ & Acum)
Sub final
Sub EventMacro ()
Debug.Print ("Executarea Macro de evenimente" și acum)
Sub final

Rezultă următorul conținut din fereastra imediată:

Alarma se va stinge în 10 secunde!
Înainte de OnTime: 25/12/2000 19:41:23
După OnTime: 25/12/2000 19:41:23 PM
Executarea Macro Evenimentului: 27.02.2010 19:41:33

Opțiune pentru alte aplicații Office

Alte aplicații Office nu implementează OnTime. Pentru aceia, aveți mai multe opțiuni. În primul rând, puteți utiliza funcția Timer, care întoarce pur și simplu numărul de secunde de la miezul nopții pe computer și își face propria matematică sau puteți utiliza apeluri API Windows. Utilizarea apelurilor API Windows are avantajul de a fi mai precis decât Timer. Iată o rutină sugerată de Microsoft care face trucul:

Funcție de declarare privată getFrequency Lib "kernel32" _
Alias ​​„QueryPerformanceFrequency” (cyFrequency as valuta) Atât timp
Funcție de declarare privată getTickCount Lib "kernel32" _
Alias ​​„QueryPerformanceCounter” (cyTickCount ca monedă)
Sub TestTimeAPICalls ()
Dim dTime Ca dublu
dTime = MicroTimer
Dim StartTime ca single
StartTime = Cronometru
Pentru i = 1 Până la 10000000
Dim j ca dublu
j = mp (i)
Următor →
Debug.Print ("MicroTimer Timpul luat a fost:" și MicroTimer - dTime)
Sub final
Funcție MicroTimer () ca dublu
'
„Se întoarce în câteva secunde.
'
Dim cyTicks1 ca monedă
Frecvența statică ca monedă
'
MicroTimer = 0
'Obțineți frecvență.
Dacă cyFrequency = 0 Atunci getFrequency cyFrequency
'Ia căpușe.
getTickCount cyTicks1
- Secunde
Dacă cyFrequency Atunci MicroTimer = cyTicks1 / cyFrequency
Funcția End