You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无模式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:00:00