【问题标题】:Assign module function to ActiveX command button DIRECTLY将模块功能直接分配给 ActiveX 命令按钮
【发布时间】:2016-01-29 21:10:19
【问题描述】:

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

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

Private Sub myFun_Click()
myFun()
End Sub

“直接”是指将按钮命名为“myFun”并将按钮直接指向函数 myFun(),而必须将 myFun() 放在另一个子程序中,如上所示。

【问题讨论】:

  • 不是那么挑剔的挑剔:Sub 是一个过程,而不是一个函数Function 有返回值,Sub 没有。标准代码模块 (.bas) 中的 Function 可以公开以在工作表公式中作为 UDF 使用,标准代码模块 (.bas) 中的 Sub 可以公开用作
  • @Mat'sMug: +1 最后两句话特别中肯。在您的答案下方查看我的评论。谢谢!

标签: excel vba button activex


【解决方案1】:

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

  • ActiveX 控件

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

  • 表单控件

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

如果你想给MyFun分配一个按钮,假设签名是这样的:

Public Sub MyFun()

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

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

【讨论】:

  • 您是说我不能将现有的 sub myFun() 分配给 ActiveX 控件按钮,对吧?我正在尝试将 sub 分配给表单控件按钮,但似乎我无法这样做。我只能为按钮“分配宏”,但我无法在弹出的表格中找到子名称以供选择。我该怎么办?
  • 如果在宏列表中找不到子名称,要么程序不是Public,有参数,要么不是用标准代码模块(.bas)编写的,或者该模块设置了Option Private Module
  • 谢谢。一旦我将“功能”更改为“子”,我现在在宏列表中看到名称 myFun,这要感谢您在我的问题下方的评论。
【解决方案2】:

根据定义,绑定到控件的 VBA 事件对于工作表来说是“本地的”,因此如果您将按钮“A”放在工作表“w1”上,则生成的单击事件处理函数将被命名为:

Private Sub A_Click()

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

如果您想在用户单击不同工作表中的按钮“A”时实现相同的行为,那么您需要通过在 VBA Module 上添加一个 Sub/Function 来实现这一点,即在工作簿对象的所有工作表之间共享。

Private Sub A_Click() {
     CommonFunction()
}

【讨论】:

  • 感谢您的回答。但是,您的回答并没有回答我的问题。您答案中的第二个代码正是我在问题中给出的示例,我明确表示我不想要。我想直接调用 myFun() 而不使用嵌套它的​​另一层函数。
猜你喜欢
  • 2016-11-30
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多