VBE 中 CommandBarEvents.Click 和 CommandBarButton.Click 有什么区别?

What's the difference between CommandBarEvents.Click and CommandBarButton.Click in VBE?

VBAVB6 加载项对象模型 (VBIDE) 公开了一个 CommandBarEvents 对象有 Click event,事件签名是:

Dim WithEvents CmdBarEvents As CommandBarEvents

Private Sub CmdBarEvents_Click(ByVal CommandBarControl As Object, handled As Boolean, CancelDefault As Boolean)

并将对 CommandBarControl 的引用传递给 VBE.Events.CommandBarEvents 以注册该 CommaneBarControl 的事件处理程序:

Set CmdBarEvents = Application.VBE.Events.CommandBarEvents(CmdBarItem)

Office 对象模型定义了具有自己 Click events 的各个 CommandBar 控件,例如,CommandBarControl 对象具有Click 事件,签名为:

Dim WithEvents CmdBarBtn As CommandBarButton

Private Sub CmdBarBtn_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)

并将对 CommandBarButton 的引用分配给 WithEvents 对象:

Set CmdBarButton = myButton

为什么会有区别,我应该更喜欢哪个?

我将事件附加到 VBE 的 CommandBars 上的控件(与主机应用程序中的 CommandBars 相反)。

Office CommandBar 无法访问 CommandBarEvents 对象,因此我假设它们必须使用 CommandBarButton.Click 事件。但是 VBE(在任何 Office Host 下)可以访问 CommandBarButton 事件和 CommandBarEvents 事件,所以我 可以 使用任何一种方法,尽管仅仅存在 CommandBarEvents 对象表明它是首选方法(并且可能是非 Office VBA 主机中唯一的方法),并且 most 在线 examples将事件处理程序添加到 VBE CommandBars do 使用 CommandBarEvents.

MZ Tools 的 Carlos Quintero 非常有用,但在这种情况下,他网站上的信息有些矛盾。他建议 The CommandBarEvents approach was used in the old Microsoft Visual Basic 5.0 / 6.0 environment, but also uses the CommandBarControl.Click approach on this page

VBE 和将事件附加到 CommandBar 控件有什么特别之处吗?如果我选择使用 CommandBarControl 事件而不是 CommandBarEvents 事件,是否会出现任何问题(内存泄漏、IDTExtensibility2 关闭问题等)?

  • VB6,作为 1998 年的 IDE(和 1997 年的 VB5)必须始终使用 CommandBarEvents。他们使用的 Office 命令栏是从 Office 97 借用的,其 CommandBarButton 缺少 Click 事件。

  • Office 2000 在 CommandBarButton class 中引入了 Click 事件,并且必须始终用于面向 Office 2000 及更高版本(或其他 VBA hosts),因为虽然 CommandBarEvents 显然可用,但 Office 2010 64 位不支持 CommandBarEvents(如果使用它会崩溃)。

  • Visual Studio是另一种具有独特性的动物。