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

7
VBA和VB6的Add-In对象模型(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)
办公室对象模型定义了单独的 CommandBar 控件,这些控件具有自己的 Click 事件(例如,CommandBarControl 对象具有 Click 事件),其签名为:Click events。请注意,需要保留 HTML 标记。
Dim WithEvents CmdBarBtn As CommandBarButton

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

CommandBarButton的引用分配给WithEvents对象:

Set CmdBarButton = myButton
为什么有差异,我应该选择哪个?
我正在将事件附加到VBE命令栏上的控件(而不是主机应用程序中的命令栏)。
Office命令栏无法访问CommandBarEvents对象,因此我认为它们必须使用CommandBarButton.Click事件。但是,在任何Office宿主下,VBE都可以访问CommandBarButton事件和CommandBarEvents事件,因此我可以使用任一方法,尽管CommandBarEvents对象的存在仅表明它是首选方法(可能是非Office VBA宿主中的唯一方法),并且大多数在线examples添加事件处理程序到VBE CommandBars时使用CommandBarEvents
Carlos Quintero的MZ Tools网站提供了非常有用的信息,但在这种情况下,信息存在轻微矛盾。他建议在旧的Microsoft Visual Basic 5.0 / 6.0环境中使用CommandBarEvents方法,但在此页面上却使用了CommandBarControl.Click方法。
VBE和将事件附加到CommandBar控件是否有什么特殊之处?如果我选择使用CommandBarControl事件而不是CommandBarEvents事件,是否会出现任何问题(例如内存泄漏、IDTExtensibility2关闭问题等)?
1个回答

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

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

  • Visual Studio是另一个具有其独特性的工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接