为什么将UserForm显示为模态停止代码执行?

Kuy*_*nda 7 vba modal-dialog userform

以下VBA代码停在Me.Show.从我的测试来看,似乎Me.Show停止所有代码执行,即使代码在UserForm中.

这部分在UserForm之外:

Public Sub TestProgress()  
    Dim objProgress As New UserForm1
    objProgress.ShowProgress
    Unload objProgress
End Sub
Run Code Online (Sandbox Code Playgroud)

这部分在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
Run Code Online (Sandbox Code Playgroud)

Me.Show显示UserForm后代码停止.没有错误,它只是停止执行代码.似乎在VBA中的模式UserForm中执行代码的唯一方法是将它包含在UserForm_Activate过程中,如下所示:

这部分在UserForm之外:

Public Sub TestProgress()  
    Dim objProgress As New UserForm1
    Load objProgress
    Unload objProgress
End Sub
Run Code Online (Sandbox Code Playgroud)

这部分在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
Run Code Online (Sandbox Code Playgroud)

当然,我不能放入Me.ShowUserForm_Activate,因为该过程仅在UserForm Show事件之后触发.

UserForm.ShowModal" UserForm是模态的,用户必须在使用应用程序的任何其他部分之前提供信息或关闭UserForm的文档.在隐藏或卸载UserForm之前,不会执行任何后续代码. "

我正在尝试使用模式UseForm作为进度条,以防止用户在进程运行时与应用程序交互.但是如果我的所有代码都必须在UserForm_Activate过程中,那么这将很难实现.

我在这里错过了什么吗?为什么所有代码​​执行都停止了Me.Show

Rob*_*rns 11

当显示表单时vbModal,代码将暂停执行并等待用户与表单交互.例如,单击按钮或使用下拉列表.

如果您更新表单属性

ShowModal = False
Run Code Online (Sandbox Code Playgroud)

vbModal从您的代码中删除.这将允许在显示表单时继续执行代码.


Jam*_*och 7

我正在寻找一个答案,为什么我收到以下错误:

运行时错误'5':无效的过程调用或参数

运行这行代码时:

UserForm1.Show True
Run Code Online (Sandbox Code Playgroud)

即使这条线有效:

UserForm1.Show False
Run Code Online (Sandbox Code Playgroud)

当然.vbModal不同!所以简单的答案就是使用正确的枚举:

UserForm1.Show vbModal
UserForm1.Show vbModeless
Run Code Online (Sandbox Code Playgroud)


Kuy*_*nda 3

我想我已经明白了这一点。

Me.ShowUserForm_Activate 事件触发后。如果 UserForm_Activate 过程中没有代码,则不会发生任何事情,因为 VBA 正在等待Me.Hide.

所以事件的顺序是:Me.Show>>UserForm_ActivateMe.Hide

我想要运行的任何代码都必须位于 UserForm_Activate 过程中并且必须位于 Me.Hide.

该结构非常严格,但我也许可以利用该结构来发挥我的优势。

  • 如果您希望在表单启动时仍然能够与工作表交互,那么您真正需要做的就是在调用用户表单时使用此代码:“userform.show vbModeless”。 (3认同)