Outlook VBA закрывает пользовательскую форму по времени
-
29-10-2019 - |
Вопрос
Я пытаюсь настроить пользовательскую форму, которая появится, останется на 10 секунд, а затем автоматически закроется.Я делал это раньше в Excel, используя OnTime
метод:
Sub Example()
Application.OnTime EarliestTime:=Now + TimeValue("00:00:10"), _
Procedure:="Hide_userform2"
UserForm2.Show
End Sub
Sub Hide_userform2()
UserForm2.Hide
End Sub
Однако поскольку Outlook не распознает OnTime
метод, я пытался использовать Timer
заявление:
Sub example2()
Strt = Timer
Do While Timer < Strt + 10
UserForm2.Show
Loop
UserForm2.Hide
End Sub
Проблема в том, что когда открывается форма пользователя, макрос (включая цикл) приостанавливается до тех пор, пока пользовательская форма не будет закрыта вручную...
Любая помощь в обходном пути для этого будет очень признательна.
Ваше здоровье!
Решение
Я провел несколько тестов, и проблема, похоже, в том, что как только вы показываете форму пользователя, она берет на себя управление и не возвращает ее. example2()
.
Кажется, что это работает, если вы поместите следующий код в свою форму Acitvate
sub, он скроется правильно.Возможно, это не совсем то, что вам нужно, возможно, вы используете форму для других целей, и этот процесс все испортит, но он приведет вас в правильном направлении.
Private Sub UserForm_Activate()
Strt = Timer
Do While Timer < Strt + 10
DoEvents 'please read linked documentation on this
Loop
UserForm2.Hide
End Sub
С использованием DoEvents
обеспечит правильное отображение формы, но может иметь некоторые нежелательные побочные эффекты.Обязательно прочитайте эта статья Microsoft и Сообщение блога Джеффа Этвуда — интересное чтение, хотя и не обязательно о VBA.
Другие советы
Эта страница предоставляет пользовательскую надстройку таймера (.xla), которая может вам подойти.Это та же идея, что и код, который у вас есть выше (это будет в виде кода программной части):
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