直接将模块function分配给ActiveX命令button

在VBA for Excel中,如何将模块中的现有函数或子集myFun()分配给新添加的ActiveX单击button?

我知道我可以在ActiveX命令(单击)button所在的工作表代码页上执行以下操作。

Private Sub myFun_Click() myFun() End Sub 

“直接”我的意思是命名button“myFun”,并将button直接指向函数myFun()必须将myFun()放在另一个子上面,如上所示。

有两种types的控件可以放在工作表上:

  • ActiveX控件

    您可以在代码隐藏中处理它们的Click事件,方法是双击控件并为其生成处理程序。

  • 表单控件

    您为这些控件分配一个macros ,就像您将macros指定给任何其他形状一样 。 macros可以是现有的(非私有标准模块中的任何无参数Public Sub过程)。

如果你想分配一个button到MyFun ,假设签名看起来像这样:

 Public Sub MyFun() 

然后,您可以尝试使用表单控件而不是ActiveX控件。

注意:MyFun()必须是一个Sub才能被暴露为一个macros。 “Sub”是一个过程 ,而不是一个function 。 一个'函数'有一个返回值,'Sub'不是。 一个标准代码模块(.bas)中的函数可以暴露在工作表公式中作为UDF使用,标准代码模块(.bas)中的“Sub”可以被暴露以用作macros

绑定到控件的VBA事件通过定义对工作表是“本地”的,因此如果在工作表“w1”上放置button“A”,则产生的click事件处理函数将被命名为:

 Private Sub A_Click() 

但是,如果在工作表“w2”上放置button“A”,则单击事件处理程序签名将相同,但实际上会触发放置在“w2”上的button的单击事件。

如果要在用户从不同工作表中单击button“A”时实现相同的行为,则需要在工作簿对象的所有工作表中共享的VBA 模块上添加一个子/函数。

 Private Sub A_Click() { CommonFunction() }