如何批量处理Userform内CheckBox控制对应DTPicker无需单独编写点击事件
可以通过类模块绑定控件事件的方式实现批量处理,无需为每个CheckBox单独编写点击事件,具体实现方案如下:
实现步骤
步骤1:创建绑定事件的类模块
- 在VBA编辑器中点击【插入】-【类模块】,将类模块重命名为
clsCheckDTPBinder - 在类模块中写入如下代码:
' 类模块 clsCheckDTPBinder 代码 ' 声明带事件的CheckBox对象 Public WithEvents chk As MSForms.CheckBox ' 绑定对应的DTPicker控件 Public dtp As Object Private Sub chk_Click() ' 点击CheckBox时直接同步DTPicker的启用状态 dtp.Enabled = chk.Value End Sub
步骤2:在UserForm模块中配置绑定
所有批量绑定的逻辑都放在UserForm_Initialize(窗体初始化)事件中执行即可,无需额外触发其他事件:
- 首先打开你的UserForm代码窗口,在模块顶部(所有过程之外)声明模块级的集合,用来存储类实例避免被自动释放:
' UserForm模块顶部声明 Dim colCheckDTPBind As Collection
- 选择以下任意一种绑定方式写入
UserForm_Initialize事件即可:
方式1:通过Tag属性自动配对(推荐,适合大量控件)
提前给每个CheckBox的Tag属性填写对应DTPicker的控件名称,比如CheckBox11的Tag填DTPicker22,CheckBox12的Tag填DTPicker24,用循环即可自动完成所有配对:
Private Sub UserForm_Initialize() Dim ctl As Control Dim binder As clsCheckDTPBinder Set colCheckDTPBind = New Collection ' 遍历UserForm中所有控件自动匹配 For Each ctl In Me.Controls If TypeName(ctl) = "CheckBox" And ctl.Tag <> "" Then Set binder = New clsCheckDTPBinder Set binder.chk = ctl Set binder.dtp = Me.Controls(ctl.Tag) colCheckDTPBind.Add binder End If Next End Sub
方式2:手动指定配对
如果不想修改控件Tag属性,也可以手动逐个添加配对关系:
Private Sub UserForm_Initialize() Dim binder As clsCheckDTPBinder Set colCheckDTPBind = New Collection ' 添加CheckBox11与DTPicker22的配对 Set binder = New clsCheckDTPBinder Set binder.chk = Me.CheckBox11 Set binder.dtp = Me.DTPicker22 colCheckDTPBind.Add binder ' 添加CheckBox12与DTPicker24的配对 Set binder = New clsCheckDTPBinder Set binder.chk = Me.CheckBox12 Set binder.dtp = Me.DTPicker24 colCheckDTPBind.Add binder ' 后续新增配对只需要重复上面4行代码即可,不需要编写单独的Click事件 End Sub
注意事项
- 存储类实例的集合必须声明为UserForm模块级变量,如果放在过程内,过程执行完毕后类实例会被释放,绑定的事件会失效
- DTPicker属于ActiveX控件,类模块中用
Object类型声明兼容性更好
内容的提问来源于stack exchange,提问作者Drawleeh
相关产品推荐
相关产品推荐

