VBE 中 CommandBarEvents.Click 和 CommandBarButton.Click 有什么区别?
What's the difference between CommandBarEvents.Click and CommandBarButton.Click in VBE?
VBA 和 VB6 加载项对象模型 (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是另一种具有独特性的动物。
VBA 和 VB6 加载项对象模型 (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是另一种具有独特性的动物。