【问题标题】:Unable to capture AfterUpdate event with a custom event handler无法使用自定义事件处理程序捕获 AfterUpdate 事件
【发布时间】:2020-05-17 07:00:56
【问题描述】:

我有一个带有多个TextBox 的用户窗体,我需要检查它们的值,因此我使用带有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

用户窗体代码如下所示:

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 事件的类。

【问题讨论】:

    标签: vba events userform


    【解决方案1】:

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

    我没有看到任何权威网站,即使在Chip Pearson's page that covers WithEvents,但如果你搜索“vba withevents no enter afterupdate exit event”,你会发现几个讨论(包括这个,我登陆时寻找权威页面以获取blog post 参考)。

    您可以通过单击类中的控件和事件下拉菜单来判断哪些事件可用:

    【讨论】:

    • 感谢您的评论。我没有找到任何简单的解决方案,但是从我阅读的内容来看,似乎可以通过创建一个处理所有 Userform 事件的类然后将这些事件重新分配到正确的控件来实现它。但是对于我最初打算做的事情来说太复杂了,所以我放弃了
    【解决方案2】:
    Private WithEvents Control1 As MSForms.Control
    

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      相关资源
      最近更新 更多