如何在VBA类中处理MSForms.TextBox的AfterUpdate等事件?
解决MSForms.TextBox自定义类无法捕获AfterUpdate/BeforeUpdate/Enter/Exit事件的问题
问题背景
通过WithEvents定义关联MSForms.TextBox的自定义类后,仅能处理Change事件,无法捕获AfterUpdate、BeforeUpdate、Enter和Exit事件。操作流程如下:
1. 用户窗体代码
Option Explicit Private thisTextBox1 As Class1 Private thisTextBox2 As Class1 Private Sub CommandButton1_Click() Set thisTextBox1 = New Class1 Set thisTextBox2 = New Class1 thisTextBox1.Init TextBox1 thisTextBox2.Init TextBox2 End Sub Private Sub UserForm_Terminate() Set thisTextBox1 = Nothing Set thisTextBox2 = Nothing End Sub
2. 初始自定义类代码(仅支持Change事件)
'@Folder("VBAProject") Option Explicit Private WithEvents thisTextBox As MSForms.TextBox Private thisTextBoxControl As MSForms.Control Public Sub Init(ByVal MyTextBox As MSForms.TextBox) Set thisTextBox = MyTextBox Set thisTextBoxControl = MyTextBox.Parent.Controls.Item(MyTextBox.Name) End Sub Private Sub thisTextBox_Change() Debug.Print "thisTextBox_Change " & thisTextBox.Name & " " & thisTextBox.Text End Sub
3. 错误尝试(触发“对象或类不支持事件集”)
尝试将thisTextBoxControl改为WithEvents声明后,编译通过但赋值时出错:
Private WithEvents thisTextBox As MSForms.TextBox Private WithEvents thisTextBoxControl As MSForms.Control Public Sub Init(ByVal MyTextBox As MSForms.TextBox) Set thisTextBox = MyTextBox Set thisTextBoxControl = MyTextBox.Parent.Controls.Item(MyTextBox.Name) End Sub Private Sub thisTextBox_Change() Debug.Print "thisTextBox_Change " & thisTextBox.Name & " " & thisTextBox.Text End Sub Private Sub thisTextBoxControl_Enter() Debug.Print "thisTextBoxControl_Enter " & thisTextBoxControl.Name End Sub
可行解决方案
无需额外声明通用控件类型的WithEvents变量,直接基于MSForms.TextBox的WithEvents变量添加所有需要的事件处理过程即可——MSForms.TextBox原生支持目标事件。
修改后的Class1代码:
'@Folder("VBAProject") Option Explicit Private WithEvents thisTextBox As MSForms.TextBox Public Sub Init(ByVal MyTextBox As MSForms.TextBox) Set thisTextBox = MyTextBox End Sub Private Sub thisTextBox_Change() Debug.Print "thisTextBox_Change " & thisTextBox.Name & " " & thisTextBox.Text End Sub Private Sub thisTextBox_AfterUpdate() Debug.Print "thisTextBox_AfterUpdate " & thisTextBox.Name & " " & thisTextBox.Text End Sub Private Sub thisTextBox_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) Debug.Print "thisTextBox_BeforeUpdate " & thisTextBox.Name & " " & thisTextBox.Text ' 如需取消更新操作,可设置 Cancel = True End Sub Private Sub thisTextBox_Enter() Debug.Print "thisTextBox_Enter " & thisTextBox.Name End Sub Private Sub thisTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean) Debug.Print "thisTextBox_Exit " & thisTextBox.Name ' 如需取消退出操作,可设置 Cancel = True End Sub
错误原因说明
MSForms.Control是通用控件基类,不包含TextBox特有的事件集合,因此用WithEvents声明该类型变量后,赋值时会触发“对象或类不支持事件集”的错误。而MSForms.TextBox是具体的控件类型,自带完整的原生事件,直接使用其WithEvents变量即可捕获所有目标事件。
内容的提问来源于stack exchange,提问作者Marek Fiołka
相关产品推荐
相关产品推荐

