以下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
?
答案 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