Cierre cronometrado de Outlook VBA de un formulario de usuario
-
29-10-2019 - |
Pregunta
Estoy intentando configurar un formulario de usuario que aparecerá, permanecerá durante 10 segundos y luego se cerrará automáticamente.He hecho esto antes en Excel, usando el 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
Sin embargo, debido a que Outlook no reconoce el OnTime
método, he estado tratando de utilizar el Timer
declaración:
Sub example2()
Strt = Timer
Do While Timer < Strt + 10
UserForm2.Show
Loop
UserForm2.Hide
End Sub
El problema con esto es que cuando se abre el formulario de usuario, la macro (incluido el bucle) se detiene hasta que el formulario de usuario se cierra manualmente...
Cualquier ayuda para solucionar este problema sería muy apreciada.
¡Salud!
Solución
Hice algunas pruebas y el problema parece ser que una vez que muestras el formulario de usuario, toma el control y no lo devuelve a example2()
.
Lo que parece funcionar es si pones el siguiente código en el formulario Acitvate
sub, se ocultará correctamente.Puede que esto no sea exactamente lo que desea, puede que esté usando el formulario para otras cosas y este proceso lo arruinará, pero lo llevará en la dirección correcta.
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
Se asegurará de que el formulario se muestre correctamente, pero puede tener algunos efectos secundarios no deseados.Asegúrate de leer este artículo de Microsoft y un entrada en el blog de Jeff Atwood es una lectura interesante, aunque no necesariamente sobre VBA.
Otros consejos
Esta página proporciona un complemento de temporizador personalizado (.xla) que puede funcionar para usted.Es la misma idea que el código que tienes arriba (esto iría en el formato de código subyacente):
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