Fechamento cronometrado do Outlook VBA de um formulário de usuário
-
29-10-2019 - |
Pergunta
Estou tentando configurar um userform que irá aparecer, permanecer por 10 segundos e depois fechar automaticamente.Já fiz isso antes no Excel, usando o OnTime
método:
Sub Example()
Application.OnTime EarliestTime:=Now + TimeValue("00:00:10"), _
Procedure:="Hide_userform2"
UserForm2.Show
End Sub
Sub Hide_userform2()
UserForm2.Hide
End Sub
No entanto, como o Outlook não reconhece o OnTime
método, tenho tentado usar o Timer
declaração:
Sub example2()
Strt = Timer
Do While Timer < Strt + 10
UserForm2.Show
Loop
UserForm2.Hide
End Sub
O problema é que quando o formulário do usuário é aberto, a macro (incluindo o loop) faz uma pausa até que o UserForm seja fechado manualmente...
Qualquer ajuda em uma solução alternativa para isso seria muito apreciada.
Saúde!
Solução
Fiz alguns testes e o problema parece ser que assim que você mostra o Formulário do Usuário, ele assume o controle e não retorna para example2()
.
O que parece funcionar é se você colocar o seguinte código no seu formulário Acitvate
sub, ele será ocultado corretamente.Isso pode não ser exatamente o que você deseja, você pode estar usando o formulário para outras coisas e esse processo vai bagunçar tudo, mas vai te levar na direção certa.
Private Sub UserForm_Activate()
Strt = Timer
Do While Timer < Strt + 10
DoEvents 'please read linked documentation on this
Loop
UserForm2.Hide
End Sub
Usando DoEvents
garantirá que o formulário seja exibido corretamente, mas poderá ter alguns efeitos colaterais indesejados.Certifique-se de ler este artigo da Microsoft e um postagem no blog de Jeff Atwood é uma leitura interessante, embora não necessariamente sobre VBA.
Outras dicas
Esta página fornece um complemento de cronômetro personalizado (.xla) que pode funcionar para você.É a mesma ideia do código que você tem acima (isso ficaria no formato code-behind):
Dim WithEvents CountdownTimer As TMTimer.clsTimer
Private Sub startCounter()
Set CountdownTimer = TMTimer.createTimer
With CountdownTimer
.CountdownDurationMilliSecs = 10 * 1000
.TimerType = .TimerTypeCountdown
.startTimer
End With
End Sub
Private Sub CountdownTimer_CountdownComplete()
Me.Hide
End Sub
Private Sub UserForm_Activate()
startCounter
End Sub