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:
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 para 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:
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):