将 Sub 分配给动态定义的 CommandButton

Assign Sub to dynamically defined CommandButton

我正在尝试定义一个用户窗体,它根据用户创建多个列表框。在该过程中,我定义了命令按钮,允许用户将项目从一个列表框转移到另一个列表框。 命令按钮定义如下(在一个循环内 - 请参阅下面的 i):

With .Designer.Controls.Add("Forms.CommandButton.1", Name:="GroupButton1" & i)
    .Top = 40 * (i - 1) + 10
    .Left = 100
    .Width = 20
    .Height = 10
    .BackColor = RGB(220, 105, 0)
    .Caption = ">>"
    .Font.Size = 8
    .OnClick = "GroupButton1" & i & "_Click"
End With

我尝试使用.OnClick 和.OnAction 来分配相应的_Click sub,但没有成功。任何指导将不胜感激。

命令按钮没有 OnClick 属性,这就是它不起作用的原因。使用设计器手动构建控件的方式不同于动态构建控件的方式。

这个问题真的很烦人,幸好我最终解决了它,但是我不会走这条路,因为情况很难控制,代码也比较复杂。如果您使用工作表作为控制按钮的基础,那么创建宏并为其分配宏会容易得多,在这种情况下您只需使用 .OnAction 属性。

所以请仔细遵循这些说明:

1- 创建一个用户窗体,其中将动态构建按钮和其他控件。在我的示例中,它的名称是 UserForm1。右键单击它,选择 view code 并准确粘贴此代码。

Option Explicit
Dim btnArray() As New Class1

Sub CreateButton()
    Dim i As Long
    Dim cmdBtn As MSForms.CommandButton


    i = 1

    For i = 1 To 3
        Set cmdBtn = Me.Controls.Add("Forms.CommandButton.1", "MyButton" & i)
        With cmdBtn
            .Name = "GroupButton1" & i
            .Top = 40 * (i - 1) + 10
            .Left = 100
            .Width = 50 'I changed it
            .Height = 25 'I changed it
            .Caption = ">>"
            .Font.Size = 8
            ReDim Preserve btnArray(1 To i)
            Set btnArray(i).btnEvents = cmdBtn
        End With
    Next


End Sub


Private Sub UserForm_Initialize()
    Call Me.CreateButton
End Sub

2- 创建一个 Class Module(class 模块而不是常规模块),默认情况下它的名称应该是 Class1。你可以改变它,但我没有。将以下代码粘贴到该模块中:

Public WithEvents btnEvents As MSForms.CommandButton

Private Sub btnEvents_click()
    MsgBox "It worked"
End Sub

3- 现在您可以通过不同的方式调用 UserForm1。我更喜欢从常规模块中显式调用它们,因此创建一个常规模块,它的名称无关紧要,但默认情况下它将是 Module1,将此代码粘贴到那里,当你 运行 它时,一切都应该完美运行:

Sub main()
    UserForm1.Show
End Sub