VBA – Agendando a execução de macros com a função OnTime
Introdução
Uma necessidade muito comum em aplicativos é utilizar
critérios de tempo para execução de algumas rotinas. Esta é uma tarefa trivial
em várias linguagens, mas poucos pensam em utilizá-la no VBA por achar muito
complexo, tendo que envolver chamadas de API e outros recursos mais avançados da
linguagem
Porém, o VBA do Microsoft Excel disponibiliza um método que facilita esse tipo
de trabalho, o método OnTime().
O que é
O método OnTime programa um procedimento para ser executado em um momento
especificado no futuro (seja em uma determinada hora do dia ou após uma
quantidade específica de tempo decorrido).
A estrutura de chamada à função OnTime se faz da seguinte forma:
Application.OnTime([EarliestTime], [Procedure], [LatestTime],
[Schedule])
Argumentos da função:
EarliestTime
Variant necessário. Especifica quando você deseja que esse procedimento seja
executado.
Procedure
String necessário. O nome do procedimento a ser executado.
LatestTime
Variant opcional. Especifica até quando o procedimento pode ser executado. Por
exemplo, se LatestTime estiver definido como EarliestTime + 30 e o Microsoft Excel não estiver em modo
Pronto, Copiar, Recortar ou Localizar em EarliestTime devido a um outro procedimento estar sendo executado, o Microsoft Excel
esperará 30 segundos para que o primeiro procedimento termine. Se o Microsoft
Excel não estiver em modo Pronto dentro de 30 segundos, o procedimento não
será executado. Se esse argumento for omitido, o Microsoft Excel esperará até
que o procedimento possa ser executado.
Schedule
Variant opcional. True para programar um novo procedimento OnTime. False para limpar um
procedimento definido anteriormente. O valor padrão é True.
Exemplo
Para informar ao VBA um valor de data válido para execução do método OnTime,
usa-se a propriedade Now do VBA juntamente com a função TimeValue(). Somando as duas, é possível programar o procedimento para ser
executado quando uma quantidade de tempo específica (contando a partir de
agora) tiver decorrido.
Caso seja necessário informar uma hora específica, por exemplo, 3 da tarde (ou
15:00), usa-se TimeValue(time) onde time é um valor de hora
informado através de uma String.
Veja os exemplos de código abaixo:
| 1 2 3 4 5 6 7 |
Public Sub ExecutaOnTime()MsgBox “Opa! Executou.” End Sub Public Sub TesteOnTime() Call Application.OnTime(Now + TimeValue(“00:00:10″), “ExecutaOnTime”) End Sub |
Execute a função TesteOnTime, deixando o cursor do mouse sobre ele (linha 5 a
6) e clicando em F5. Se tudo der certo, em 10 segundos você deverá ver esta
mensagem:

Pronto! Conforme configuramos o OnTime para executar 10 segundos após a hora
atual (linha 6) pois, Now retorna a data e hora atual e TimeValue(“00:00:10″)
representa para o VBA 10 segundos, após executar a função TesteOnTime, ela
programa a função ExecutaOnTime (linha 1) para ser executada neste tempo.
Para efeitos de teste, configure outros valores de tempo, mas tome o cuidado
que sejam pequenos pois, se configurar para executar daqui a 24 horas
(“24:00:00″), vai ter que esperar um bom tempo.
Para fazer outro teste interessante do OnTime, mude o código para ficar desta
forma:
| 1 2 3 4 5 6 7 |
Public Sub ExecutaOnTime() MsgBox “Opa! Executou.” End Sub Public Sub TesteOnTime() Call Application.OnTime(TimeValue(“13:00:00″), “ExecutaOnTime”) End Sub |
Da forma que está, o código irá configurar a função ExecutaOnTime (linha 1) para
ser executada às na próxima 13:00 do computador em que está sendo executada.
Como este é apenas um exemplo, configure uma hora que estiver mais próxima para
não esperar muito.
É possível também cancelar a execução de uma macro agendada com o OnTime. O
exemplo de código abaixo cancela a definição de OnTime do
exemplo anterior, ou seja, caso a execução da função ExecutaOnTime estiver
agendada, executar a função CancelaOnTime fará com que esta programação seja
cancelada. isso é feito passando o valor False para o parâmetro Schedule (linha
10):
| 1 2 3 4 5 6 7 8 9 10 11 |
Public Sub ExecutaOnTime() MsgBox “Opa! Executou.” End Sub Public Sub TesteOnTime() Call Application.OnTime(TimeValue(“13:00:00″), “ExecutaOnTime”) End Sub Public Sub CancelaOnTime() Call Application.OnTime(EarliestTime:=TimeValue(“13:00:00″), Procedure:=”ExecutaOnTime”, Schedule:=False) End Sub |
Conclusão
Com este recurso em mãos, é possível atender a algumas necessidades que no
contexto do Excel pareciam inviáveis. Um exemplo típico é uma tela de
aprensentação ou SplashScreen como é conhecida que apresenta o programa e fecha
em alguns segundos. Este é um bom teste para experimentar o uso do OnTime. Fica
aí um desafio.

23 Convidados
1 Bot
outubro 26th, 2009 at 17:50
Caro Tomás,
Em uma determinada macro eu coloquei um vbyesno e no caso de o yes ser escolhido, quero que a macro me permita fazer alterações na planilha até que eu clique em Salvar, que é quando ela deve voltar à execução normal. Todos os comandos e loops são para tempo determinado ou mantêm a macro rodando.
Há como fazer?
Grato,
Flávio.
outubro 27th, 2009 at 10:04
Flávio,
A partir de agora responderei a perguntas no fórum:
http://www.tomasvasquez.com.br/forum
Nos vemos lá!
Tomas