Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何向Excel VBA用户窗体中动态创建的控件(按钮、列表框)添加事件_Excel_Vba - Fatal编程技术网

如何向Excel VBA用户窗体中动态创建的控件(按钮、列表框)添加事件

如何向Excel VBA用户窗体中动态创建的控件(按钮、列表框)添加事件,excel,vba,Excel,Vba,我正在尝试实时构建一个用户表单。(在ExcelVBA中)为了试用,我从两个标签开始,一个文本框、一个组合框和一个命令按钮。我在下面列出代码+结果表单 我的问题是:如何将事件链接到控件,特别是combobox和commandbutton?通常(对于手动创建的表单),这将由名为:cmbTabel_change()和cmdExit_click()的例程完成。但当它们被动态创建时,这似乎不起作用。谁能帮我 代码: 结果形式: 您需要构建一个类来处理控件上的事件 例如,创建一个名为clsMyEvents的

我正在尝试实时构建一个用户表单。(在ExcelVBA中)为了试用,我从两个标签开始,一个文本框、一个组合框和一个命令按钮。我在下面列出代码+结果表单

我的问题是:如何将事件链接到控件,特别是combobox和commandbutton?通常(对于手动创建的表单),这将由名为:cmbTabel_change()和cmdExit_click()的例程完成。但当它们被动态创建时,这似乎不起作用。谁能帮我

代码:

结果形式:


您需要构建一个类来处理控件上的事件

例如,创建一个名为
clsMyEvents
的新类模块
将此代码添加到类:

Option Explicit

Public WithEvents MyCombo As MSForms.ComboBox
Public WithEvents MyButton As MSForms.CommandButton

Private Sub MyCombo_Change()
    MsgBox MyCombo.Name & " was changed to value " & MyCombo.Value
End Sub

Private Sub MyButton_Click()

    Dim BtnNum As Long

    BtnNum = Replace(MyButton.Name, "MyButton", "")

    MsgBox MyButton.Name & " is " & IIf(BtnNum Mod 2 = 0, "even", "odd")

End Sub
注意:当您输入带有事件的
时,您将能够选择与该类型控件关联的大多数事件

接下来,创建一个空白的
UserForm
,并添加此代码:

Option Explicit

Public MyEvents As New Collection

Private Sub UserForm_Initialize()

    Dim tmpCtrl As Control
    Dim CmbEvent As clsMyEvents
    Dim x As Long

    'Add some dummy data for the combo-boxes.
    Sheet1.Range("A1:A5") = Application.Transpose(Array("Red", "Yellow", "Green", "Blue", "Pink"))
    Sheet1.Range("B1:B5") = Application.Transpose(Array(1, 2, 3, 4, 5))
    Sheet1.Range("C1:C5") = Application.Transpose(Array(5, 4, 3, 2, 1))

    For x = 1 To 5
        'Add the control.
        Set tmpCtrl = Me.Controls.Add("Forms.ComboBox.1", "MyCombobox" & x)
        With tmpCtrl
            .Left = 10
            .Width = 80
            .Top = (x * 20) - 18 'You might have to adjust this spacing.  I just made it up.
            .RowSource = "Sheet1!" & Sheet1.Cells(1, x).Resize(5).Address
        End With

        'Attach the event.
        Set CmbEvent = New clsMyEvents
        Set CmbEvent.MyCombo = tmpCtrl
        MyEvents.Add CmbEvent

    Next x

    For x = 1 To 5
        Set tmpCtrl = Me.Controls.Add("Forms.CommandButton.1", "MyButton" & x)
        With tmpCtrl
            .Left = 100
            .Width = 50
            .Height = 20
            .Top = (x * 20) - 18
            .Caption = "Num " & x
        End With

        Set CmbEvent = New clsMyEvents
        Set CmbEvent.MyButton = tmpCtrl
        MyEvents.Add CmbEvent
    Next x

End Sub
编辑:我也更新了命令按钮的代码。
当您更改组合框中的值时,它将告诉您控件的名称及其更改为的值。当您单击按钮时,它会告诉您按钮上的数字是奇数还是偶数。

要向VBA项目添加代码,您需要访问VBA项目,但连接到Internet时,不建议授予该项目。任何人都可以控制你的电脑。因此,更好的方法是在创建使用它的表单之前编写代码。Darren,非常感谢。我把它应用到我的组合框和命令按钮上,现在它按照我的预期工作。好东西。请随意选择接受答案。:)
Option Explicit

Public MyEvents As New Collection

Private Sub UserForm_Initialize()

    Dim tmpCtrl As Control
    Dim CmbEvent As clsMyEvents
    Dim x As Long

    'Add some dummy data for the combo-boxes.
    Sheet1.Range("A1:A5") = Application.Transpose(Array("Red", "Yellow", "Green", "Blue", "Pink"))
    Sheet1.Range("B1:B5") = Application.Transpose(Array(1, 2, 3, 4, 5))
    Sheet1.Range("C1:C5") = Application.Transpose(Array(5, 4, 3, 2, 1))

    For x = 1 To 5
        'Add the control.
        Set tmpCtrl = Me.Controls.Add("Forms.ComboBox.1", "MyCombobox" & x)
        With tmpCtrl
            .Left = 10
            .Width = 80
            .Top = (x * 20) - 18 'You might have to adjust this spacing.  I just made it up.
            .RowSource = "Sheet1!" & Sheet1.Cells(1, x).Resize(5).Address
        End With

        'Attach the event.
        Set CmbEvent = New clsMyEvents
        Set CmbEvent.MyCombo = tmpCtrl
        MyEvents.Add CmbEvent

    Next x

    For x = 1 To 5
        Set tmpCtrl = Me.Controls.Add("Forms.CommandButton.1", "MyButton" & x)
        With tmpCtrl
            .Left = 100
            .Width = 50
            .Height = 20
            .Top = (x * 20) - 18
            .Caption = "Num " & x
        End With

        Set CmbEvent = New clsMyEvents
        Set CmbEvent.MyButton = tmpCtrl
        MyEvents.Add CmbEvent
    Next x

End Sub