直接将模块功能分配给 ActiveX 命令按钮

Assign module function to ActiveX command button DIRECTLY

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

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

Private Sub myFun_Click()
myFun()
End Sub

"directly" 我的意思是将按钮命名为 "myFun" 并将按钮直接指向函数 myFun() ,而必须将 myFun() 放在另一个子中,如上所示。

VBA 绑定到控件的事件根据定义 "local" 到工作表,因此如果您将按钮 "A" 放在工作表 "w1" 上,生成的单击事件处理函数将被命名为:

Private Sub A_Click()

但是如果您将按钮 "A" 放在工作表 "w2" 上,点击事件处理程序签名将相同但实际上会触发放置在 "w2" 上的按钮的点击事件。

如果您希望在用户单击不同工作表中的按钮 "A" 时实现相同的行为,则需要通过在 VBA 上添加 Sub/Function 模块,工作簿对象的所有工作表共享。

Private Sub A_Click() {
     CommonFunction()
}

您可以在工作表上放置 2 种类型的控件:

  • ActiveX 控件

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

  • 表单控件

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

如果要将按钮分配给 MyFun,假设签名如下所示:

Public Sub MyFun()

那么您可以尝试使用 表单控件 而不是 ActiveX 控件。

注意:MyFun() 必须是一个 Sub 才能作为宏公开。 'Sub' 是一个 过程 ,而不是 函数 。 'Function' 有一个 return 值,'Sub' 没有。可以公开标准代码模块 (.bas) 中的函数以在工作表公式中用作 UDF,可以公开标准代码模块 (.bas) 中的 'Sub' 以用作 .