触发事件,无论用户窗体中的哪个控制项被触发

时间:2018-08-24 09:27:31

标签: vba excel-vba word-vba

到目前为止,我已经为用户窗体中的每个控件创建了一个事件。

Private Sub TextBox_Integrate_Indexes_Change()
    Call LabView.textBoxChange(TextBox_Integrate_Indexes)
End Sub

Private Sub TextBox_Integrate_InputFile_Change()
    Call LabView.textBoxChange(Me.TextBox_Integrate_InputFile)
End Sub

Private Sub TextBox_Integrate_OutputFile_Change()
    Call LabView.textBoxChange(Me.TextBox_Integrate_OutputFile)
End Sub

如所见,这些事件都只是将其对象发送到我的方法,该方法然后处理该事件(检查其值是否已更改,如果已更改,则将更新的值存储在config.json文件中)

但是,我不是在为所有用户窗体文本框,选项按钮列表框,复选框和组合框创建事件,而是在徘徊,是否有办法检测该用户窗体是否发生任何事件,获取触发事件的项目,以及是否上述类型之一,然后将其发送给我的方法。

1 个答案:

答案 0 :(得分:2)

是的,您可以创建一个包含私有文本框变量的自定义类。 然后,您可以在该类中捕获事件并将其传递给Labview类。

在UserForm中,您可以仅创建自定义类的集合,并将用户窗体的文本框设置为自定义类中的私有变量。

示例代码: cTextBox类别:

Private WithEvents p_TextBox As MSForms.TextBox
Public Property Let txtBox(value As MSForms.TextBox)
    Set p_TextBox = value
End Property
Public Property Get txtBox() As MSForms.TextBox
    Set txtBox = p_TextBox
End Property
Private Sub p_TextBox_Change()
    Call Labview.textboxchange(p_TextBox)
End Sub

Labview类:

Public Sub textboxchange(val As MSForms.TextBox)
    MsgBox val.Name
End Sub

用户代码:

Private t As MSForms.Control
Private ctb As cTextBox
Private cTextBoxes As Collection

Private Sub UserForm_Initialize()
    Set cTextBoxes = New Collection
    For Each t In Me.Controls
        If TypeName(t) = "TextBox" Then
            Set ctb = New cTextBox
            ctb.txtBox = t
            cTextBoxes.Add ctb
        End If
    Next t
End Sub

和测试整个程序的例程:

Public Labview As New Labview
Sub test()
    UserForm1.Show
End Sub