【问题标题】:Add click event to CommandButton将点击事件添加到命令按钮
【发布时间】:2021-08-29 13:21:06
【问题描述】:

我正在尝试以编程方式将 onClick 事件添加到 VBA 中的命令按钮。我不希望 CommandButton 与表单相关联,因为最终表单应如下所示:

我已经有一个名为 boardButton 的类模块,其中包含一个应在单击按钮时触发的事件:

Public WithEvents button As MSForms.CommandButton

Private Sub button_Click()
    MsgBox "You've just clicked the button"
End Sub

还有一个 sub,也在类模块中声明,用于创建按钮:

Private Sub AddButton(ByVal row As Integer, ByVal column As Integer)
    Set t = ActiveSheet.Range(Cells(row, column), Cells(row, column))
    
    Set btn = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=t.Left, Top:=t.Top, width:=t.width, height:=t.height)
    Set createdButton = btn.Object
    createdButton.Caption = ""
    createdButton.BackColor = RGB(121, 195, 232)
    
    Dim gameBoardButton As New boardButton
    Set gameBoardButton.button = createdButton
End Sub

我遇到的问题是,每当我单击任何按钮时都不会触发该事件。没有错误,我已经尝试在事件子中使用其他一些代码。我不知道我创建按钮的方式是否正确,以及这是否是未触发点击事件的原因。

我们将不胜感激。感谢您的宝贵时间!

【问题讨论】:

    标签: excel vba button


    【解决方案1】:

    请尝试下一个方法:

    1. 将下一个声明放在标准模块的顶部(在声明区域中):
    Private gameBoardButton(0) As New boardButton
    
    1. 请使用下一个改编的Sub
    Private Sub AddButton(ByVal row As Integer, ByVal column As Integer)
        Dim t as Range, btn as OleObject, createdButton as Object, i as Long
        If Ubound(gameBoardButton) = 0 then
           i = 0
        Else
           Redim Preserve gameBoardButton(ubouond(gameBoardButton) + 1)
           i = ubouond(gameBoardButton) + 1
        End If
        Set t = ActiveSheet.Range(Cells(row, column), Cells(row, column))
        
        Set btn = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=t.Left, Top:=t.Top, width:=t.width, height:=t.height)
        Set createdButton = btn.Object
        createdButton.Caption = ""
        createdButton.BackColor = RGB(121, 195, 232)
        
        Set gameBoardButton(i).button = createdButton
    End Sub
    
    1. 按原样使用您的课程。

    基本上,您应该在模块级别声明一个数组变量,并在按钮创建期间填充它。然后,最好养成声明所有使用的变量的习惯。

    代码未经测试,但这是基本思想。如果您遇到任何错误,请随时提出并寻求帮助...

    【讨论】:

    • 那么,声明和子都应该在一个模块而不是类模块中?如果是这样,为什么会这样?
    • @codingandstuff 因为 VBA 通常使用代码模块(标准、表格、表格)。类模块只需要提供为更多对象分配相同事件的可能性。在这种情况下,按钮。 您是否尝试过上述推荐的方案?我应该明白你展示的所有代码都放在一个类模块或类模块中吗?
    • sub 上的代码在类模块上,这就是我问这个问题的原因,但我会重新排列以尝试您的版本,它看起来不错。有什么我会反馈的,谢谢帮助
    • @codingandstuff 我可以看到“我已经有一个名为 boardButton 的类模块”,然后是“还有一些代码来创建我正在做的按钮:”我无法想象它也属于一个类。可以在类中创建对象,但在您的特定情况下,无需这样做。您可以根据需要多次调用 sub 在讨论中(从工作表代码模块、标准模块、表单等),无需任何初步声明,它将使用您拥有的简单类创建按钮并分配事件。
    • 在一个标准模块上它就像一个魅力!我已经被困在这几天了,非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2019-03-23
    相关资源
    最近更新 更多