Создал пункты меню в VBA. Именно в панели VBA а не панели Excel'я. Создавал вот так:
Код
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
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осстановить_Обработку_Событий"
.OnAction = "RestoreAlertsEvents"
.Caption = "Bосстановить события 2"
.TooltipText = "Bосстановить обработку событий"
End With
With .Controls.add(Type:=msoControlButton, ID:=107)
.OnAction = "a_Bыровнить_Код_Активного_Модуля"
.Caption = "Bыровнить код"
.TooltipText = "Bыровнить код активного модуля"
End With
With .Controls.add(Type:=msoControlPopup)
.Caption = "Работа с проектом"
With .Controls.add(Type:=msoControlButton, ID:=107)
.OnAction = "a_Cохранить_все_Модули_в_Архив"
.Caption = "Cохранение"
.TooltipText = "Cохранить все модули в архив"
End With
' и т.д., и т.п.
End With
With .Controls.add(Type:=msoControlButton, ID:=107)
.OnAction = "a_Справка_по_Подключаемой_Библиотеке"
.Caption = "Справка"
.TooltipText = "Справка по Подключаемой Библиотеке"
End With
End With
Exit For
End If
End With
Next
End Sub
В результате получается красивая картинка , но пункты .OnAction - не работают. Подпрограммы просто не вызываются и ничего не происходит.
На этой картинке показан момент остановки отладчика и видно, что обработчик присваивается (слева внизу выделено синим). А почему потом не обрабатывает? не сохраняет, что ли? При повторном входе в этот (или иной) модуль для Item 12 (со второй картинки) будет уже OnAction="" - почему?
Изменено: leonrom - 15.11.2017 13:49:32(не могу вставить рисунок)
М.б. будет кому полезным мой опыт. Если при передаче аргумента указанного в вызываемой функции как ByRef оный аргумент заключить в скобки, то он передастся как ByVal и внесенные (вызываемой функцией первый символ меняется на '!') в него изменения будут утеряны. Вот пример (VBA, Excel 2010), где в комментариях показан получаемый результат:
Код
Private Sub mByRef(ByRef s As String)
Mid(s, 1, 1) = "!"
End Sub
Private Sub tByValByRef()
Const s0 = "abc"
Dim sx As String
sx = s0
mByRef sx
Debug.Print " sx " & sx ' sx !bc
sx = s0
mByRef (sx)
Debug.Print "(sx) " & sx ' (sx) abc (значение sx не изменилось!)
sx = s0
Call mByRef(sx)
Debug.Print "Call " & sx ' Call !bc
End Sub