Почему показывает UserForm как модальное выполнение кода остановки?
следующий код VBA останавливается на Me.Show
. Из моих тестов, кажется, что Me.Show
останавливает все выполнение кода, даже если код находится внутри UserForm.
эта часть находится вне UserForm:
Public Sub TestProgress()
Dim objProgress As New UserForm1
objProgress.ShowProgress
Unload objProgress
End Sub
эта часть находится внутри UserForm:
Private Sub ShowProgress()
Me.Show vbModal
Dim intSecond As Integer
For intSecond = 1 To 5
Application.Wait Now + TimeValue("0:00:01")
Me.ProgressBar1.Value = intSecond / 5 * 100
Next intSecond
Me.Hide
End Sub
код останавливается на Me.Show
, после отображения пользовательской формы. Ошибки нет, она просто прерывает выполнение кода. Кажется, что единственный способ выполнить код внутри модальной пользовательской формы в VBA должен включать его в процедуру UserForm_Activate следующим образом:
эта часть находится вне UserForm:
Public Sub TestProgress()
Dim objProgress As New UserForm1
Load objProgress
Unload objProgress
End Sub
эта часть находится внутри UserForm:
Private Sub UserForm_Initialize()
Me.Show vbModal
End Sub
Private Sub UserForm_Activate()
Dim intSecond As Integer
For intSecond = 1 To 5
Application.Wait Now + TimeValue("0:00:01")
Me.ProgressBar1.Value = intSecond / 5 * 100
Next intSecond
Me.Hide
End Sub
конечно, я не могу поставить Me.Show
внутри UserForm_Activate, потому что эта процедура запускается только после события UserForm Show.
документация UserForm.ShowModal
говорит:"когда пользовательская форма является модальной, пользователь должен предоставить информацию или закрыть форму пользователя перед использованием любой другой части приложения. Никакой последующий код не выполняется до тех пор, пока пользовательская форма не будет скрыта или выгружена."
Я пытаюсь использовать модальную форму UseForm в качестве индикатора выполнения, чтобы предотвратить взаимодействие пользователя с приложением во время выполнения процесса. Но это будет трудно сделать, если весь мой код должен быть в процедуре UserForm_Activate.
Я что-то пропустил? Почему все выполнение кода останавливается на Me.Show
?
5 ответов
когда форма отображается с vbModal
, код приостановит выполнение и дождется взаимодействия пользователя с формой. Например, нажатие кнопки или использование раскрывающегося списка.
при обновлении свойства формы
ShowModal = False
и удалить vbModal
из кода. Это позволит продолжить выполнение кода при отображении формы.
Я искал ответ на то, почему я получал следующую ошибку:
Ошибка времени выполнения "5": недопустимый вызов процедуры или аргумент
при выполнении этой строки кода:
UserForm1.Show True
хотя эта строка работает:
UserForm1.Show False
конечно. правда - это не то же самое как vbModal! Поэтому простой ответ-использовать правильные перечисления:
UserForm1.Show vbModal
UserForm1.Show vbModeless
кажется,я догадался.
после Me.Show
срабатывает событие UserForm_Activate. Если в процедуре UserForm_Activate нет кода, ничего не произойдет, потому что VBA ждет Me.Hide
.
Итак, порядок событий:Me.Show
>UserForm_Activate
>Me.Hide
любой код, который я хочу запустить, должен быть в процедуре UserForm_Activate и должен быть до Me.Hide
.
структура очень строгая, но я могу использовать эта структура в моих интересах.
кажется, я понял. Попробуйте сделать этот простой шаг В форме щелкните правой кнопкой мыши на части банка и выберите Свойства Измените "ShowModal" на False или в коде VBA, когда вы показываете userform, используя следующий код:
значок userform1.Показать Значение False
Я действительно не знаю, что происходит в вашем уме, потому что есть широкий спектр кода для того, что вы просите, но я надеюсь, что это может помочь
частный суб cmdSwitch_Click() Значок userform1.Прятаться UserForm2.Шоу
Конец Sub