Спасибо за ответ, - так работает! К сожалению пришлось задействовать классы, но, похоже, иначе никак.
Спасибо!
С Вашими дополнениями работающий модуль теперь выглядит так (а вдруг еще кому понадобится;) :
Здесь предложенные дополнения модуля просто скопированы в отдельную подпрограмму, а в мою часть внесены косметические изменения.
Предложенный же код для класса CBarEvents теперь выглядит так:
Узнать бы еще - почему Microsoft сделал обработчик событий для VBA именно таким хитрым способом
Спасибо!
С Вашими дополнениями работающий модуль теперь выглядит так (а вдруг еще кому понадобится;) :
| Код |
|---|
Option Explicit 'эта коллекция будет хранить все контролы с обработкой событий Public oVBE_BarEvents As New Collection Private Sub Ro_AddEvent(ctrl As CommandBarButton) Dim CBarE As CBarEvents If ctrl.Type = msoControlButton Then ' проверка - защита от собственной невнимательности (надо бы еще дать Else...) 'инициализируем класс Set CBarE = New CBarEvents 'добавляем в класс, чтобы события обрабатывались Set CBarE.cBarC_Event = Application.VBE.Events.CommandBarEvents(ctrl) 'добавляем в обработчики oVBE_BarEvents.Add CBarE End If End Sub Public Sub Ro_AddMenuVBE() Dim mnuName As String, u As String Dim N As Integer, i As Integer, c As Integer u = "&Moё" N = Application.VBE.CommandBars.Count For i = 1 To N With Application.VBE.CommandBars.Item(i) If .Type = msoBarTypeMenuBar Then ' ищется меню-бар (д.б. под №1, но на всяк случай) For c = 1 To .Controls.Count ' удаляется предыдущая установка моего меню If .Controls.Item(c).caption = u Then .Controls(u).Delete Exit For End If Next With .Controls.Add(Type:=msoControlPopup) .caption = u With .Controls.Add(Type:=msoControlButton, ID:=107) .OnAction = "a_Bосстановить_Обработку_Событий" .caption = "Bосстановить события" .TooltipText = "Bосстановить обработку событий" End With Ro_AddEvent .Controls(.Controls.Count) ' тут каждый раз будет последний добавленный пункт меню With .Controls.Add(Type:=msoControlButton, ID:=107) .OnAction = "a_другие_обработчики" .caption = "Bыровнить код" .TooltipText = "Bыровнить код активного модуля" End With Ro_AddEvent .Controls(.Controls.Count) With .Controls.Add(Type:=msoControlPopup) .caption = "Работа с проектом" With .Controls.Add(Type:=msoControlButton, ID:=107) .OnAction = "a_другие_обработчики" .caption = "Cохранение" .TooltipText = "Cохранить все модули в архив" End With Ro_AddEvent .Controls(.Controls.Count) ' и т.д., и т.п. End With With .Controls.Add(Type:=msoControlButton, ID:=107) .OnAction = "a_другие_обработчики" .caption = "Справка" .TooltipText = "Справка по Подключаемой Библиотеке" End With Ro_AddEvent .Controls(.Controls.Count) End With Exit For End If End With Next End Sub Private Sub a_Bосстановить_Обработку_Событий(caption As String) MsgBox "Bосстановить Обработку Событий - сработало!" End Sub Private Sub a_другие_обработчики(caption As String) ' общее название - чтобы сократить текст примера MsgBox "сработало " & caption End Sub |
Предложенный же код для класса CBarEvents теперь выглядит так:
| Код |
|---|
Option Explicit 'объявляем кнопку с возможностью отслеживать события это событие срабатывает при клике мышью на кнопке собственно, оно единственное доступное Public WithEvents cBarC_Event As CommandBarEvents Private Sub cBarC_Event_Click(ByVal CommandBarControl As Object, handled As Boolean, CancelDefault As Boolean) handled = True CancelDefault = True Application.Run CommandBarControl.OnAction, CommandBarControl.caption End Sub |
Изменено: - 15.11.2017 23:43:16