Para aqueles de nós que têm nossas mentes profundamente em VB.NET, a jornada de volta para VB6 pode ser uma viagem confusa. Usar um timer no VB6 é assim. Ao mesmo tempo, adicionar processos cronometrados ao seu código não é óbvio para os novos usuários das macros do VBA.
Temporizadores para Iniciantes
Codificação uma macro do Word VBA para cronometrar automaticamente um teste que foi escrito no Word é um motivo típico para usar um timer. Outro motivo comum é ver quanto tempo está sendo gasto por diferentes partes do seu código, para que você possa otimizar as seções lentas. Às vezes, convém verificar se alguma coisa está acontecendo no aplicativo quando o computador parece estar apenas ocioso, o que pode ser um problema de segurança. Temporizadores podem fazer isso.
Iniciar um temporizador
Você inicia um timer codificando uma instrução OnTime. Essa declaração é implementada no Word e Excel, mas possui uma sintaxe diferente, dependendo de qual você está usando. A sintaxe do Word é:
expressão. OnTime (quando, nome, tolerância)
A sintaxe para o Excel tem a seguinte aparência:
expressão. OnTime (EarliestTime, Procedure, LatestTime, Schedule)
Ambos têm o primeiro e o segundo parâmetro em comum. O segundo parâmetro é o nome de outra macro que é executada quando a hora no primeiro parâmetro é atingida. Com efeito, codificar esta declaração é como criar uma sub-rotina de eventos nos termos do VB6 ou VB.NET. O evento está atingindo a hora no primeiro parâmetro. A sub-rotina de eventos é o segundo parâmetro.
Isso é diferente da maneira como é codificado no VB6 ou no VB.NET. Por um lado, a macro nomeada no segundo parâmetro pode estar em qualquer código acessível. Em um documento do Word, a Microsoft recomenda colocá-lo no modelo de documento normal. Se você o colocar em outro módulo, a Microsoft recomenda usar o caminho completo: Projeto. Módulo. Macro.
A expressão é geralmente o objeto Aplicativo. A documentação do Word e Excel afirma que o terceiro parâmetro pode cancelar a execução da macro de eventos, caso uma caixa de diálogo ou outro processo impeça a execução dentro de um determinado período de tempo. No Excel, você pode agendar um novo horário, caso isso aconteça.
Codifique a macro de eventos de hora
Esse código no Word é para o administrador que deseja exibir uma notificação de que o tempo de teste expirou e imprimir o resultado do teste.
Public Sub TestOnTime ()
Depurar. Imprimir "O alarme dispara em 10 segundos!"
Depurar. Imprimir ("Antes do OnTime:" e agora)
alertTime = Now + TimeValue ("00:00:10")
Inscrição. OnTime alertTime, "EventMacro"
Depurar. Imprimir ("Após o OnTime:" e agora)
End Sub
Sub EventMacro ()
Depurar. Imprimir ("Executando macro de eventos:" e agora)
End Sub
Isso resulta no seguinte conteúdo na janela imediata:
O alarme dispara em 10 segundos!
Antes do OnTime: 25/12/2000 19:41:23
Após o OnTime: 25/12/2000 19:41:23
Macro de evento de execução: 27/2/2010 19:41:33
Opção para outros aplicativos do Office
Outros aplicativos do Office não implementam o OnTime. Para aqueles, você tem várias opções. Primeiro, você pode usar a função Timer, que simplesmente retorna o número de segundos desde a meia-noite no seu PC e faz suas próprias contas, ou você pode usar as chamadas da API do Windows. O uso de chamadas da API do Windows tem a vantagem de ser mais preciso que o Timer. Aqui está uma rotina sugerida pela Microsoft que faz o truque:
Função de declaração privada getFrequency Lib "kernel32" _
Alias "QueryPerformanceFrequency" (cyFrequency como moeda) como longo
Função de declaração privada getTickCount Lib "kernel32" _
Alias "QueryPerformanceCounter" (cyTickCount como moeda) por muito tempo
Sub TestTimeAPICalls ()
Dim dTime As Double
dTime = MicroTimer
Dim StartTime As Single
StartTime = Timer
Para i = 1 a 10000000
Dim j As Double
j = Sqr (i)
Próximo
Depurar. Imprimir ("O tempo gasto no MicroTimer foi:" & MicroTimer - dTime)
End Sub
Função MicroTimer () Como Duplo
'
'Retorna segundos.
'
Dim cyTicks1 como moeda
CyFrequency estático como moeda
'
MicroTimer = 0
'Obter frequência.
Se cyFrequency = 0 Então getFrequency cyFrequency
'Obter carrapatos.
getTickCount cyTicks1
Segundos
Se cyFrequency Então MicroTimer = cyTicks1 / cyFrequency
Função final