【问题标题】:Excel VBA: How to trigger an Event from code?Excel VBA:如何从代码触发事件?
【发布时间】:2013-12-14 22:33:20
【问题描述】:

我有一个 Worksheet_BeforeDoubleClick 事件,它在目标单元格中​​打开一个列表框。我被要求通过按钮而不是(或除了)双击来提供相同的功能。

在我输入的按钮的 Click 事件中:

Call Worksheet_BeforeDoubleClick(Selection,true)

...所以按钮只是“双击”单元格。它似乎运作良好,但在我开始在整个项目中使用此技术之前,我想知道是否有我应该注意的陷阱。

从另一个事件或从标准代码模块调用事件时,最佳做法是什么?

【问题讨论】:

  • 你为什么不直接定义一个公共子或函数来执行你的操作,然后你可以随时调用它,(包括从你的 BeforeDoubleClickEvent 内部)。
  • 是的,有一个重大缺陷。让我发布一个答案...
  • 谢谢你们俩。 Sam,我正在尝试您的建议,但是将所有代码从 Event 模块移动到标准模块似乎很复杂。我有很多控件可以参考,我不能再只说“Me.CancelButton”了。你知道我在哪里可以读到这个吗?

标签: vba excel


【解决方案1】:

我想知道是否有我应该注意的陷阱。

是的,有一个重大缺陷。 Selection 不一定是一个范围。看这个例子

  1. 插入按钮

  2. 插入空白图表

  3. 在图表中插入图像。让图像突出显示

假设我们有这段代码

Private Sub CommandButton1_Click()
    Call Worksheet_BeforeDoubleClick(Selection, True)
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    MsgBox Target.Address
End Sub

现在按下按钮,你会得到一个错误。

工作表事件火灾当它们需要也......它们不会选择不合适。

话说你可以让你的命令按钮代码像这样工作

Private Sub CommandButton1_Click()
    '~~> Check if what the user selected is a valid range
    If TypeName(Selection) = "Range" Then
        Call Worksheet_BeforeDoubleClick(Selection, True)
    Else
        MsgBox "Not a Valid Range"
    End If
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    MsgBox Target.Address
End Sub

但是你会在哪里放置所有CHECKS :) 最好的方法是按照@Sam 的建议将它放在一个Sub 中,然后从Button/Worksheet_BeforeDoubleClick 调用它。

如果您仍想从按钮调用它,请确保所有相关检查都已到位,包括正确的错误处理程序。

【讨论】:

  • 很好的分析和解释
猜你喜欢
  • 1970-01-01
  • 2021-02-10
  • 2015-07-28
  • 1970-01-01
  • 2019-09-14
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多