7

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

Dim WithEvents CmdBarEvents As CommandBarEvents

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

并且对 a 的引用CommandBarControl被传递给它VBE.Events.CommandBarEvents以注册事件处理程序CommaneBarControl

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

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

Dim WithEvents CmdBarBtn As CommandBarButton

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

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

Set CmdBarButton = myButton

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

我将事件附加到 VBE 的 CommandBars 上的控件(而不是主机应用程序中的 CommandBars)。

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

MZ Tools 的 Carlos Quintero 提供了非常有用的信息,但在这种情况下,他的网站上的信息略有矛盾。他建议在旧的 Microsoft Visual Basic 5.0 / 6.0 环境中使用 CommandBarEvents 方法,但也使用CommandBarControl.Click页面上的方法

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

4

1 回答 1

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

  • Office 2000 在 CommandBarButton 类中引入了 Click 事件,并且必须始终用于针对 Office 2000 及更高版本(或其他 VBA 主机)的 VBA 加载项,因为尽管 CommandBarEvents 显然可用,但 Office 2010 64 位不支持CommandBarEvents(如果使用它会崩溃)。

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

于 2016-12-09T18:09:20.477 回答