VBA – Agendando a execução de macros com a função OnTime

Postado em 01/07/2009 14:07:25 por Tomás Vásquez

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.

  1. 2 comentários para “VBA – Agendando a execução de macros com a função OnTime”

  2. Por Flávio Markowicz em 26/10/2009 17:10:12 | Responder

    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.

  3. Flávio,

    A partir de agora responderei a perguntas no fórum:

    http://www.tomasvasquez.com.br/forum

    Nos vemos lá!

    Tomas

Você precisa ser um usuário registrado para inserir um comentário. Faça seu login clicando aqui