VBA:检测用户窗体的任何文本框中的更改

VBA: Detect changes in any textbox of the userform

提问人:Millik 提问时间:6/25/2014 最后编辑:Millik 更新时间:11/17/2023 访问量:11397

问:

有一个用户窗体有许多文本框,我需要检测每个文本框的更改。因此,我为表单中的每个文本框编写了一个子例程,结果却是一大段代码。 由于每个文本框的代码都是相同的,因此我想对其进行优化。那么,是否可以只编写一个子例程来检测表单任何文本框中的更改?

VBA 事件 用户窗体

评论

0赞 z̫͋ 6/25/2014
是的,使用类和 WithEvent。请参阅 VBA:在用户窗体上使用 WithEvents
0赞 phd443322 6/25/2014
请参见控制数组。从帮助。控件数组是一组具有相同名称和类型的控件。它们还共享相同的事件过程。控制数组至少有一个元素,并且可以在系统资源和内存允许的情况下增长到任意数量的元素;其大小还取决于每个控件所需的内存和 Windows 资源量。可以在控件数组中使用的最大索引为 32767。同一控件数组的元素具有自己的属性设置。控件数组的常见用途包括菜单控件和选项按钮分组。

答:

4赞 z̫͋ 6/25/2014 #1

实现此目的的唯一方法是将类与WithEvents

下面是一个最小的示例:

名为 的类模块的代码:mytextbox

Private WithEvents txtbox As MSForms.TextBox


Public Property Set TextBox(ByVal t As MSForms.TextBox)
    Set txtbox = t
End Property


Private Sub txtbox_Change()
    ' code for handling the event
End Sub

以及用户窗体中的代码,假设您要处理每个文本框的事件

Private myEventHandlers As Collection

Private Sub UserForm_Initialize()
    Dim txtbox As mytextbox

    Set myEventHandlers = New Collection

    Dim c As Control
    For Each c In Me.Controls
        If TypeName(c) = "TextBox" Then
            Set txtbox = New mytextbox

            Set txtbox.TextBox = c

            myEventHandlers.Add txtbox
        End If
    Next c
End Sub