将Sub分配给动态定义的CommandButton

时间:2018-07-25 17:12:30

标签: excel vba excel-vba userform

我试图定义一个用户窗体,该窗体将根据用户创建许多列表框。在该过程中,我定义了命令按钮,该按钮应允许用户将项目从一个列表框移到另一个列表框。 命令按钮的定义如下(在循环内-参见下面的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子项,但没有成功。任何指导将不胜感激。

1 个答案:

答案 0 :(得分:1)

命令按钮不具有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(类模块而不是常规模块),默认情况下其名称应为Class1。您可以更改它,但我没有。将以下代码粘贴到该模块中:

Public WithEvents btnEvents As MSForms.CommandButton

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

3-现在您可以用不同的方式呼叫UserForm1。我更喜欢从常规模块中显式调用它们,因此创建一个常规模块并不重要,但是默认情况下它将是Module1,将这段代码粘贴到其中,并且在您运行它时,一切应该正常运行: / p>

Sub main()
    UserForm1.Show
End Sub