如何优雅规避UserForm中4个TextBox的独立Change事件宏?
优雅复用VBA UserForm文本框Change事件的两种方案
方案一:类模块实现通用事件处理(推荐)
这种方法能彻底避免重复编写多个Change事件,新增符合命名规则的文本框后会自动生效,代码最简洁:
创建类模块
插入一个类模块,命名为clsTextBoxHandler,然后写入以下代码:Option Explicit Public WithEvents txtBox As MSForms.TextBox Private Sub txtBox_Change() ' 去掉首尾空格后判断是否为空,避免用户只输入空格的情况 txtBox.BackColor = IIf(Len(Trim(txtBox.Text)) = 0, vbRed, vbWhite) End Sub在UserForm中绑定控件
在UserForm的代码窗口中写入初始化代码,自动把所有txt开头的文本框绑定到类的事件处理:Option Explicit Private txtHandlers As Collection Private Sub UserForm_Initialize() Dim ctrl As MSForms.Control Dim handler As clsTextBoxHandler Set txtHandlers = New Collection ' 遍历窗体所有控件,筛选txt开头的文本框 For Each ctrl In Me.Controls If TypeName(ctrl) = "TextBox" And Left(ctrl.Name, 3) = "txt" Then Set handler = New clsTextBoxHandler Set handler.txtBox = ctrl txtHandlers.Add handler End If Next ctrl End Sub
方案二:通用过程+简化事件调用
如果不想用类模块,也可以写一个通用处理过程,让每个文本框的Change事件只调用这一个过程:
编写通用处理过程
在UserForm代码窗口中添加:Option Explicit Private Sub UpdateTextBoxBackColor(txt As MSForms.TextBox) txt.BackColor = IIf(Trim(txt.Text) = "", vbRed, vbWhite) End Sub修改每个文本框的Change事件
每个文本框的Change事件只需要一行代码:Private Sub txt1_Change() UpdateTextBoxBackColor txt1 End Sub Private Sub txt2_Change() UpdateTextBoxBackColor txt2 End Sub Private Sub txt3_Change() UpdateTextBoxBackColor txt3 End Sub Private Sub txt4_Change() UpdateTextBoxBackColor txt4 End Sub
两种方案对比:方案一适合需要批量处理多个控件的场景,后续新增文本框无需修改代码;方案二更适合快速改造现有代码,上手门槛更低。
内容的提问来源于stack exchange,提问作者Siegfrid
相关产品推荐
相关产品推荐

