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.

Tomás Vásquez