VBA Excel:在类模块中dynamic创build的button将立即运行并且只运行一次

我正在尝试创build一个button的类。 该button应该有一个macros分配给它。 macros是类的一个function。

类模块的代码如下:

'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 

主macros的代码如下:

 '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 

上面的代码成功创build一个button。 然而,分配给button的function是立即运行(刚刚创buildbutton后,而不是当我点击它),只有一次(当你点击button后,什么也没有发生)。

有没有办法在VBA中使用类模块实现所需的function(要创build一个不依赖于外部函数的类)?

为了扩大Rory的评论,你的class级需要这样的东西:

 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 

然后在一个正常的模块中创build一个类的公共实例,使它保留在内存中:

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

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

编辑:我忘了提及,你需要设置一个对Microsoft Forms的引用,以便声明CommandButtontypes的variables。