Почему показывает 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