VBA Excel:类模块中动态创建的按钮立即运行,只运行一次

时间:2015-07-29 08:07:07

标签: excel vba class excel-vba

我正在尝试创建一个可以创建按钮的类。该按钮应该有一个宏指定给它。宏是该类的函数。

类模块的代码如下:

'Class Module: btnClass
Option Explicit

Dim btn As Button

Function addButton()
    'Adding a button
    Set btn = ActiveSheet.Buttons.Add( _
        Range("A1").Left, _
        Range("A1").Top, _
        Range("A1").Width, _
        Range("A1").Height)
    With btn
        'Assigning a function
        .OnAction = Me.onClickAction
        .Caption = "Button"
    End With
End Function

Function onClickAction()
    MsgBox ("Click")
End Function

主宏的代码如下:

'Module
Option Explicit
Sub main()
    Dim btnInstance As btnClass
    Set btnInstance = New btnClass

    'Calling a function of the instance that creates a button
    Call btnInstance.addButton
End Sub

上面的代码成功创建了一个按钮。但是,分配给按钮的功能会立即运行(在创建按钮后,而不是在我单击它时),并且只运行一次(当您稍后单击按钮时,没有任何反应)。

VBA中是否有办法使用类模块实现所需的功能(想要创建一个不依赖于外部函数的类)?

1 个答案:

答案 0 :(得分:1)

要扩展Rory的评论,你的课程需要这样的东西:

Public WithEvents Button As CommandButton

Private Sub Class_Initialize()
    Set Me.Button = Sheet1.OLEObjects("Thebutton").Object
End Sub

Private Sub Button_Click()
    MsgBox "Foo"
End Sub

然后在普通模块中创建该类的公共实例,使其保留在memmory中:

Public myButt As ButtonClass

Public Sub AddEvent()
    Set myButt = New ButtonClass
End Sub

请注意,只有当类的实例保留在内存中时,才会处理click事件。如果您关闭工作簿并再次打开它,将不再处理该事件。

编辑:我忘了提及,你需要设置一个对Microsoft Forms的引用,以声明一个CommandButton类型的变量。