10

以下 VBA 代码停在Me.Show. 从我的测试来看,似乎Me.Show停止了所有代码的执行,即使代码在用户窗体中也是如此。

这部分在 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显示 UserForm 后,代码在 处停止。没有错误,它只是停止执行代码。似乎在 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.ShowUserForm_Activate 放入其中,因为该过程仅在 UserForm Show 事件之后触发。

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

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

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

4

5 回答 5

11

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

如果您更新表单属性

ShowModal = False

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

于 2009-11-23T16:45:43.633 回答
8

我正在寻找为什么会出现以下错误的答案:

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

运行这行代码时:

UserForm1.Show True

即使这条线有效:

UserForm1.Show False

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

UserForm1.Show vbModal
UserForm1.Show vbModeless
于 2014-03-18T09:12:31.427 回答
4

我想我想通了。

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

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

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

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

于 2009-11-23T16:10:58.853 回答
-4

我想我想通了尝试执行这个简单的步骤在您的表单中右键单击银行部分并单击属性将“ShowModal”更改为 False 或使用以下代码显示用户表单时在 VBA 代码中:

UserForm1.Show False

于 2013-11-16T16:38:49.670 回答
-5

我真的不知道你在想什么,因为有各种各样的代码可以满足你的要求,但我希望这能有所帮助

Private Sub cmdSwitch_Click() UserForm1.Hide UserForm2.Show

结束子

于 2013-11-16T16:27:35.327 回答