2016-12-09 54 views
5

VBAVB6外接對象模型(VBIDE)暴露CommandBarEvents對象中具有一個Clickevent,並且事件簽名是:VBE中的CommandBarEvents.Click和CommandBarButton.Click有什麼區別?

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)

辦公室對象模型定義了有自己Clickevents,例如,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 CommandBars無權訪問CommandBarEvents對象,所以我假設他們必須使用CommandBarButton.Click事件。但VBE(在任何Office主機下)都可以訪問事件和CommandBarEvents事件,所以我可以使用這兩種方法,但僅存在CommandBarEvents對象表明它是首選方法(也可能是唯一的非唯一方法-Office VBA主機)和大多數的在線examples向VBE CommandBars添加事件處理程序使用CommandBarEvents

MZ工具的Carlos Quintero非常有用,但在這種情況下,他的網站上的信息有點矛盾。他建議The CommandBarEvents approach was used in the old Microsoft Visual Basic 5.0/6.0 environment,但也使用CommandBarControl.Click方法在這page

是否有什麼特別的VBE和附加事件到CommandBar控制?如果我選擇在CommandBarEvents事件上使用CommandBarControl事件,是否有任何問題(內存泄漏,IDTExtensibility2關機問題等)?

回答

6
  • 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是另一種有其獨特性的動物。

+2

男人,我覺得我欠你一杯啤酒。 –