将Sub分配给动态定义的CommandButton

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将Sub分配给动态定义的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子,但没有成功。任何指导都将非常感谢。

答案

命令按钮没有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,在此处粘贴此代码,当您运行它时,一切都应该完美:

Sub main()
    UserForm1.Show
End Sub

以上是关于将Sub分配给动态定义的CommandButton的主要内容,如果未能解决你的问题,请参考以下文章

动态生成 ice:commandButton 组件

将图像动态分配给 CustomCell

将 ID 分配给动态生成的 Rhandsontable

在C语言进行编程中,为啥要释放旧内存?

使用 'push' 或 'sub' x86 指令时如何分配堆栈内存?

R:将值分配给数据框中的动态变量时遇到问题