VBA和VB6加载项对象模型 (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
此页面上的方法
CommandBar
VBE 和将事件附加到控件有什么特别之处吗?CommandBarControl
如果我选择使用事件而不是事件,是否存在任何问题(内存泄漏、IDTExtensibility2 关闭问题等)CommandBarEvents
?