无法使用自定义事件处理程序捕获AfterUpdate事件

时间:2014-06-02 13:37:50

标签: vba events userform

我有一个包含多个TextBox的Userform,我需要检查它们的值,因此我使用带有WithEvent私有对象的类模块创建了一个单独的事件处理程序。 Change事件处理程序工作得很好,但不是AfterUpdate处理程序(BeforeEventEnterExit也是如此。

以下是问题的简短示例:

' 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事件的类,文档。

2 个答案:

答案 0 :(得分:1)

我不知道你是否得到了这个问题的答案,但你的观察是正确的。 WithEvents控件可用的事件只是通常可用于该类型控件的事件的子集。如您所知,Enter,Exit,BeforeUpdate和AfterUpdate事件不可用于声明为WithEvents的变量。

即使在Chip Pearson's page that covers WithEvents,我也看不到任何权威网站,但是如果你在" vba上搜索没有输入更新后退出事件"您将找到几个讨论(包括我在寻找blog post参考的权威页面时登陆的那个讨论)。

您可以通过单击班级中的控件和事件下拉列表来确定哪些事件可用:

enter image description here

答案 1 :(得分:0)

Private WithEvents Control1 As MSForms.Control

将允许您绑定到所有控件的公共事件:Enter,Exit,BeforeUpdate和AfterUpdate

更正。这不起作用,并会导致运行时错误。