无模式UserForm中动态创建按钮的类事件失效问题求助
问题解决:无模式UserForm动态按钮事件不触发
问题原因
当UserForm以无模式(Show或Show vbModeless)方式打开时,tests过程执行完毕后,局部变量colButtons会被销毁,绑定按钮事件的类实例MyCustomButton失去引用,导致事件无法触发。而模态窗体时,Show会阻塞过程执行,colButtons持续存在,事件因此正常生效。
解决方案
将colButtons声明为模块级变量,确保在窗体打开期间始终维持类实例的引用:
步骤1:修改标准模块代码
把colButtons的声明移到所有过程外部,作为模块级变量:
' 模块级变量,放在所有Sub/Function代码之前 Dim colButtons As Collection Sub tests() Dim i As Integer Dim MyB As MSForms.Control Dim btnEvent As MyCustomButton Set colButtons = New Collection For i = 1 To 7 Set MyB = UserForm1.Controls.Add("Forms.CommandButton.1") With MyB .Name = "dugme" & i .Caption = "Captiones" & i .Left = 10 .Top = 25 * i .Width = 75 .Height = 20 .Tag = "tagi" & i End With Set btnEvent = New MyCustomButton Set btnEvent.btn = MyB Set btnEvent.frm = UserForm1 colButtons.Add btnEvent Next i UserForm1.Show vbModeless ' 显式指定无模式,也可直接写UserForm1.Show End Sub
步骤2:类模块代码保持不变
Public WithEvents btn As MSForms.CommandButton Public frm As UserForm Private Sub btn_Click() MsgBox btn.Name End Sub
补充说明
模块级变量的作用范围覆盖整个标准模块,只要模块未被卸载,变量就会持续存在,从而维持类实例的引用关系,保证按钮点击事件正常触发。若需跨过程使用该集合,也可将其声明为全局变量(标准模块顶部用Public colButtons As Collection),但当前场景下模块级变量已足够满足需求。
内容的提问来源于stack exchange,提问作者Alhn
相关产品推荐
相关产品推荐

