2009-11-23 29 views
7

以下VBA代码停止在Me.Show。在我的测试中,看起来Me.Show停止了所有的代码执行,即使代码位于UserForm中。为什么显示用户窗体为模态停止代码执行?

这部分是用户窗体外:

Public Sub TestProgress() 
    Dim objProgress As New UserForm1 
    objProgress.ShowProgress 
    Unload objProgress 
End Sub 

这部分是用户窗体内:

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内部代码的唯一方法就是把它列入了UserForm_Activate过程是这样的:

这部分是用户窗体外:

Public Sub TestProgress() 
    Dim objProgress As New UserForm1 
    Load objProgress 
    Unload objProgress 
End Sub 

这部分是用户窗体内:

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因为该过程只UserFo后大火rm显示事件。

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

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

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

回答

2

我想我明白了这一点。

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

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

,我想运行必须UserForm_Activate程序,而且必须Me.Hide之前的任何代码。

该结构非常严格,但我可能能够使用该结构对我有利。

+3

所有你真的需要,如果你想仍然能够在窗体达与纸张互动做的是使用电话的用户窗体时,此代码: 'userform.show vbModeless'。 – Casey 2013-12-06 22:48:07

10

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

如果您更新表单属性

ShowModal = False 

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

+0

是的,vbModeless用户窗体很容易,但我需要锁定用户与应用程序的交互,直到过程完成。这只是解决如何在vbModal UserForm中构造代码的问题。太糟糕了,文档不仅仅是说“如果你使用vbModal,确保你想要在UserForm_Activate和_before_ Me.Hide中执行任何代码。谢谢! – Kuyenda 2009-11-23 18:17:48

+0

这对我不起作用。调用'sub'继续运行,但绝对不会渲染任何组件,甚至不是一个简单的标签。 – cbaldan 2017-12-05 20:19:18

-3

我真的不知道什么进入你的头脑,因为有各种各样的你所问的代码,但我希望这可以帮助

私人小组cmdSwitch_Click() UserForm1.Hide UserForm2 .Show

末次

-2

我想我想通了 尝试做这个简单的步骤, 在你形成对银行部分右键,然后单击属性 改变“的ShowModal”为False 或VBA代码,当你使用下面的代码显示用户窗体:

UserForm1.Show假

5

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

Run time error '5': Invalid procedure call or argument

时运行此行代码:

UserForm1.Show True 

即使这条线的工作原理:

UserForm1.Show False 

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

UserForm1.Show vbModal 
UserForm1.Show vbModeless