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