且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-12-06 11:42:04

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

You'll need to build a class to handle the events on the controls.

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

As an example create a new class module called clsMyEvents.
Add this code to the class:

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

注意:输入WithEvents时,您可以选择与该控件类型关联的 most 个事件.

Note: When you enter the WithEvents you'll be able to select most events associated with that type of control.

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

Next, create a blank UserForm and add this code:

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

编辑:我已经更新为包括命令按钮的代码. 当您在组合框中更改值时,它将告诉您控件的名称以及更改为的值.当您单击一个按钮时,它将告诉您按钮上的数字是奇数还是偶数.

I've updated to include code for a command button as well. When you change the value in a combobox it will tell you the name of the control and the value it was changed to. When you click a button it will tell you if the number on it is odd or even.