Como implementar um atraso/espera no VBA

Excel-Sleep

A necessidade é um fato e pouca documentação há sobre isso. De fato as linguagens de programação mais usadas gozam facilmente de um método Sleep, que facilmente pausa a execução do código por algum momento.

No VBA isso não é tão intuitivo, mas existem algumas alternativas para fazê-lo.

Método 1: Usar um loop For… Next vazio

Uma desvantagem para este método é que não existe como determinar a quantidade exata de tempo que o programa leva para executar o executar um loop. A quantidade de tempo depende da velocidade do seu computador. O seguinte código executa um loop que faz nada, mas segura o processamento por algum tempo.

1
2
3
4
Sub MyDelayMacro
 For iCount = 1 to 1000
 Next iCount
End Sub

Método 2: Usar uma chamada API para suspender a execução

Utilizar um chamar API para suspender a execução por uma quantidade fixa de tempo.

O kernel32 contém uma função que pausa execução um programa do para uma quantidade especificada de tempo em milissegundos. Para que você possa usar a função, ele deve primeiro ser declarado na seção General Declarations do módulo no qual será usado:

1
2
   Declare Sub Sleep Lib "kernel32" Alias "Sleep" _
 (ByVal dwMilliseconds As Long)

Use a seguinte sintaxe para chamar a função Sleep :

1
2
3
Sub Sleep()
 Sleep 1000   'Faz o código esperar por 1 segundo
 End Sub

Método 3: Usar o método OnTime

Use o método OnTime para definir uma quantidade de tempo a pausa. O método OnTime usa a seguinte sintaxe:

expressão .OnTime (quando, nome, tolerância a falhas)

Por requerer nome de uma macro para o argumento nome executar, você deve criar duas macros: a primeira macro para conter o chamar método OnTime e outros comandos relevantes para sua macro, e a segunda macro para executar quando o tempo alocado tiver passado. A segunda macro pode ser uma macro “fantasma” que não fará nada além de chamar o método OnTime para fazer o agendameto..

Este exemplo executa o macro nomeado ” MyDelayMacro ” 15 segundos desde o tempo é o exemplo executar.

1
2
3
4
5
6
7
8
9
Sub MyMainMacro()
 ' Pausa por 15 segundos.
 Application.OnTime When:=Now + TimeValue("00:00:15"), _
 Name:="MyDelayMacro"
 End Sub
Public Sub MyDelayMacro()
 ' Macro executada sob o agendamento.
 MsgBox "Esta macro foi executada após 15 segundos."
 End Sub

Método 4: Usar o método Application.Wait

Trabalha da mesma similar ao Sleep, porém é preciso “montar” um objeto TimeValue a ser passado com parâmetro, e o código esperará até o tempo definido neste para executar, simulando um comportamente de “esperar até”, ao contrário do Sleep que tem um comportamento “esperar por X tempo”

1
2
3
4
5
6
7
Sub MyWaitMacro()
newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 3
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime
End Sub

Para obter mais informações sobre como usar o método OnTime, leia este artigo: http://www.tomasvasquez.com.br/blog/microsoft-office/vba-agendando-a-execucao-de-macros-com-a-funcao-ontime

Bom proveito!