我有一个包含多个TextBox
的Userform,我需要检查它们的值,因此我使用带有WithEvent
私有对象的类模块创建了一个单独的事件处理程序。
Change
事件处理程序工作得很好,但不是AfterUpdate
处理程序(BeforeEvent
,Enter
,Exit
也是如此。
以下是问题的简短示例:
' class name is NumberBox
Private WithEvents nbTextBox As MSForms.TextBox
Public Property Set TextBox(ByVal t As MSForms.TextBox)
Set nbTextBox = t
End Property
Private Sub nbTextBox_Change()
Debug.Print "Change " & nbTextBox.Value ' Working
End Sub
Private Sub nbTextBox_AfterUpdate()
Debug.Print "AfterUpdate " & nbTextBox.Value 'not working
End Sub
UserForm代码如下所示:
Private col As Collection
Private Sub UserForm_Initialize()
Set col = New Collection
Dim c1 As MSForms.TextBox, c2 As MSForms.TextBox
Dim tb1 As NumberBox, tb2 As NumberBox
Set c1 = Controls("TextBox1")
Set c2 = Controls("TextBox2")
Set tb1 = New NumberBox
Set tb2 = New NumberBox
Set tb1.TextBox = c1
Set tb2.TextBox = c2
col.Add tb1
col.Add tb2
End Sub
我尝试将UserForm.TextBox
更改为UserForm.Control
,但我得到object or class does not support the set of events
,即使Userform.Control
是定义AfterUpdate
事件的类,文档。
答案 0 :(得分:1)
我不知道你是否得到了这个问题的答案,但你的观察是正确的。 WithEvents控件可用的事件只是通常可用于该类型控件的事件的子集。如您所知,Enter,Exit,BeforeUpdate和AfterUpdate事件不可用于声明为WithEvents的变量。
即使在Chip Pearson's page that covers WithEvents,我也看不到任何权威网站,但是如果你在" vba上搜索没有输入更新后退出事件"您将找到几个讨论(包括我在寻找blog post参考的权威页面时登陆的那个讨论)。
您可以通过单击班级中的控件和事件下拉列表来确定哪些事件可用:
答案 1 :(得分:0)
Private WithEvents Control1 As MSForms.Control
将允许您绑定到所有控件的公共事件:Enter,Exit,BeforeUpdate和AfterUpdate
更正。这不起作用,并会导致运行时错误。