Uso de un temporizador en las macros de Office VBA

Para aquellos de nosotros que tenemos nuestras mentes profundamente en VB.NET, el viaje de regreso a VB6 puede ser un viaje confuso. Usar un temporizador en VB6 es así. Al mismo tiempo, agregar procesos cronometrados a su código no es obvio para los nuevos usuarios de Macros VBA.

Temporizadores para novatos

La codificación de una macro de Word VBA para cronometrar automáticamente una prueba que se escribió en Word es una razón típica para usar un temporizador. Otra razón común es ver cuánto tiempo toman diferentes partes de su código para que pueda trabajar en la optimización de las secciones lentas. A veces, es posible que desee ver si algo sucede en la aplicación cuando la computadora parece estar inactiva, lo que puede ser un problema de seguridad. Los temporizadores pueden hacer eso.

Iniciar un temporizador

Comienza un temporizador codificando una instrucción OnTime. Esta declaración se implementa en Word y Excel, pero tiene una sintaxis diferente dependiendo de cuál esté usando. La sintaxis de Word es:

expresión.OnTime (cuando, nombre, tolerancia)

La sintaxis para Excel se ve así:

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

Ambos tienen el primer y el segundo parámetro en común. El segundo parámetro es el nombre de otra macro que se ejecuta cuando se alcanza el tiempo en el primer parámetro. En efecto, codificar esta declaración es como crear una subrutina de eventos en términos VB6 o VB.NET. El evento está llegando a la hora en el primer parámetro. La subrutina de eventos es el segundo parámetro..

Esto es diferente de la forma en que está codificado en VB6 o VB.NET. Por un lado, la macro nombrada en el segundo parámetro puede estar en cualquier código que sea accesible. En un documento de Word, Microsoft recomienda ponerlo en la plantilla de documento Normal. Si lo coloca en otro módulo, Microsoft recomienda usar la ruta completa: Project.Module.Macro.

La expresión suele ser el objeto Aplicación. La documentación de Word y Excel establece que el tercer parámetro puede cancelar la ejecución de la macro de eventos en caso de que un diálogo u otro proceso impida que se ejecute dentro de un tiempo determinado. En Excel, puede programar una nueva hora en caso de que ocurra.

Codifique la macro de evento de tiempo

Este código en Word es para el administrador que desea mostrar una notificación de que el tiempo de prueba ha expirado e imprimir el resultado de la prueba.

Public Sub TestOnTime ()
Debug.Print "¡La alarma sonará en 10 segundos!"
Debug.Print ("Antes de OnTime:" y ahora)
alertTime = Now + TimeValue ("00:00:10")
Application.OnTime alertTime, "EventMacro"
Debug.Print ("After OnTime:" y ahora)
End Sub
Sub EventMacro ()
Debug.Print ("Ejecutando macro de eventos:" y ahora)
End Sub

Esto da como resultado el siguiente contenido en la ventana inmediata:

La alarma se activará en 10 segundos.!
Antes de OnTime: 25/12/2000 7:41:23 PM
Después de OnTime: 25/12/2000 7:41:23 PM
Ejecución de macro de evento: 27/02/2010 7:41:33 p.m.

Opción para otras aplicaciones de Office

Otras aplicaciones de Office no implementan OnTime. Para aquellos, tienes varias opciones. Primero, puede usar la función Temporizador, que simplemente devuelve el número de segundos desde la medianoche en su PC, y hace sus propios cálculos, o puede usar llamadas API de Windows. El uso de llamadas de API de Windows tiene la ventaja de ser más preciso que Timer. Aquí hay una rutina sugerida por Microsoft que hace el truco:

Función de declaración privada getFrequency Lib "kernel32" _
Alias ​​"QueryPerformanceFrequency" (cyFrequency As Currency) como largo
Función de declaración privada getTickCount Lib "kernel32" _
Alias ​​"QueryPerformanceCounter" (cyTickCount As Currency) como largo
Sub TestTimeAPICalls ()
Dim dTime As Double
dTime = MicroTimer
Dim StartTime como único
StartTime = Timer
Para i = 1 a 10000000
Dim j como doble
j = Sqr (i)
próximo
Debug.Print ("El tiempo de MicroTimer fue:" & MicroTimer - dTime)
End Sub
Función MicroTimer () como doble
'
'Devuelve segundos.
'
Dim cyTicks1 como moneda
Cifrecuencia estática como moneda
'
MicroTimer = 0
'Obtener frecuencia.
Si cyFrequency = 0 Entonces getFrequency cyFrequency
'Consigue garrapatas.
getTickCount cyTicks1
' Segundos
Si cyFrequency, entonces MicroTimer = cyTicks1 / cyFrequency
Función final