【发布时间】:2021-02-14 07:25:42
【问题描述】:
我想在运行时创建一个 vbModeless 动态用户表单。用户表单只有一个按钮,就是这样。该表单使用vbModal 可以正常工作,但不幸的是vbModeless 我无法让按钮工作的点击事件。单击按钮不会调用事件。我正在使用以下步骤/代码:
-
创建了一个名为
UserForm1的空用户表单 -
使用以下代码创建了一个名为
Modul1的模块:Sub CreateFormControls() 'Create Command Button Dim Button01 As MSForms.CommandButton Set Button01 = UserForm1.Controls.Add("Forms.CommandButton.1", "dynButton01", False) Button01.Visible = True 'Reference click event Dim ClickEvents As New Class1 Set ClickEvents.ButtonEvent = Button01 'Show User Form UserForm1.Show vbModeless '-> THIS DOES NOT WORK, only vbmodal works End Sub -
使用以下代码创建了一个名为
Class1的类模块:Public WithEvents ButtonEvent As MSForms.CommandButton Private Sub ButtonEvent_Click() MsgBox "Test" Unload UserForm1 End Sub
有没有办法让这个工作与vbModeless 一起工作,还是有不同的工作?
注意:我还没有大量使用动态表单,我使用 existing code snippet 复制/修改了显示的实现,但没有完全理解按钮对象如何引用点击事件,例如为什么需要一个单独的类,而我不能在 Modul1 的过程中做到这一点。我认为这就是为什么它无法打开非模态表单的原因。对这个问题稍加了解也将不胜感激。
【问题讨论】:
-
ClickEvents应该在模块级别声明,即在任何其他过程之前的模块顶部。 -
顺便说一句,您好像有错字。看起来应该是
Set ClickEvents.ButtonEvent = Button01。 -
我建议您经常将
Option Explicit放在任何模块的最顶部,以帮助捕获错误,例如上面的那个。 -
@Domenic 是的,您的错字是正确的,谢谢。我在我的代码中更改了它,但我忘记在问题中更改它(所以这不是实际代码中的问题)。我也使用 Option Explicit,它与这个问题无关,所以我把它省略了。事件的减速 在类模块中它在最上面,在任何程序之前(实际上我测试中的类和模块只包含本例所示的代码)
标签: vba events runtime userform