【问题标题】:VBA: Detect changes in any textbox of the userformVBA:检测用户窗体的任何文本框中的更改
【发布时间】:2014-06-25 16:38:11
【问题描述】:

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

【问题讨论】:

  • 是的,有一个类和WithEvent。见VBA: Using WithEvents on UserForms
  • 参见控制阵列。从帮助。控件数组是一组具有相同名称和类型的控件。它们还共享相同的事件过程。控制数组至少有一个元素,并且可以增长到系统资源和内存允许的尽可能多的元素;它的大小还取决于每个控件需要多少内存和 Windows 资源。您可以在控件数组中使用的最大索引为 32767。同一控件数组的元素具有自己的属性设置。控件数组的常见用途包括菜单控件和选项按钮分组。
  • 谢谢z̫͋。效果很好!

标签: vba events userform


【解决方案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

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 2022-07-02
    • 1970-01-01
    • 2020-09-25
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多