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

时间:2009-11-23 15:35:49

标签: 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

此部分位于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

显示UserForm后,代码在Me.Show处停止。没有错误,它只是停止执行代码。似乎在VBA中的模式UserForm中执行代码的唯一方法是将它包含在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的文档说“当UserForm是模态的时,用户必须在使用应用程序的任何其他部分之前提供信息或关闭UserForm。在隐藏UserForm之前不会执行后续代码或者卸载。

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

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

5 个答案:

答案 0 :(得分:11)

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

如果您更新表单属性

ShowModal = False

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

答案 1 :(得分:6)

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

  

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

运行这行代码时

UserForm1.Show True

即使这条线有效:

UserForm1.Show False

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

UserForm1.Show vbModal
UserForm1.Show vbModeless

答案 2 :(得分:2)

我想我想出来了。

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

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

我想要运行的任何代码都必须在UserForm_Activate过程中,并且必须在 Me.Hide之前

结构非常严格,但我可以利用这种结构。

答案 3 :(得分:-3)

我想我明白了 尝试做这个简单的步骤 在您的窗体中右键单击银行部分,然后单击属性 将“ShowModal”更改为False 或者在使用以下代码显示userform时在VBA代码中:

UserForm1.Show False

答案 4 :(得分:-4)

我真的不知道你的想法是什么,因为你的问题有各种各样的代码,但我希望这可以帮助

Private Sub cmdSwitch_Click() UserForm1.Hide UserForm2.Show

End Sub