Программное добавление кнопки в контекстное меню ячейки (строки, столбца) из кода VBA Excel. Свойство CommandBars объекта Application.
Свойство Application.CommandBars
Примеры командных панелей, вызываемых кликом правой кнопки мыши (контекстных меню):
- CommandBars(«Cell») – контекстное меню ячейки;
- CommandBars(«Row») – контекстное меню строки;
- CommandBars(«Column») – контекстное меню столбца.
Добавление кнопки в контекстное меню
Добавление кнопки из кода VBA Excel в контекстное меню ячейки. Кнопки в контекстные меню строк и столбцов добавляются аналогично.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
'Объявляем объектную переменную cmdBarBut Dim cmdBarBut As CommandBarButton 'Создаем временную (Temporary:=True) кнопку для контекстного 'меню ячейки и присваиваем ссылку на нее переменной cmdBarBut Set cmdBarBut = Application.CommandBars("Cell").Controls.Add(Temporary:=True) With cmdBarBut 'Присваиваем кнопке название .Caption = "Новая кнопка" 'Задаем отображение в контекстном меню только названия кнопки .Style = msoButtonCaption 'Назначаем кнопке процедуру (макрос) .OnAction = "MySub" End With |
Если хотите создать постоянную кнопку для контекстного меню, используйте параметр Temporary
метода Controls.Add
в значении False
, которое применяется по умолчанию:
1 |
Set cmdBarBut = Application.CommandBars("Cell").Controls.Add |
Удаление кнопки из контекстного меню
Созданная предыдущим кодом VBA временная кнопка контекстного меню ячейки будет утилизирована только при закрытии приложения Microsoft Excel. Это означает, что если в приложении открыты несколько книг, тогда после закрытия книги с кодом, создавшим кнопку, она продолжит существование и будет доступна из других открытых книг. Если это не желательно, можно удалить кнопку следующей строкой:
1 |
Application.CommandBars("Cell").Controls("Новая кнопка").Delete |
Эта же строка удалит и постоянную кнопку.
Примеры добавления и удаления кнопок
Пример 1
Добавление кнопки в контекстное меню ячейки из кода VBA Excel при открытии книги и удаление кнопки при закрытии книги.
Добавление кнопки (код размещается в модуле книги):
1 2 3 4 5 6 7 8 9 10 11 |
Private Sub Workbook_Activate() Dim cmdBarBut As CommandBarButton On Error Resume Next Set cmdBarBut = Application.CommandBars("Cell").Controls.Add(Temporary:=True) With cmdBarBut .Caption = "Новая кнопка" .Style = msoButtonCaption .OnAction = "MySub" End With On Error GoTo 0 End Sub |
Удаление кнопки (код размещается в модуле книги):
1 2 3 4 5 |
Private Sub Workbook_Deactivate() On Error Resume Next Application.CommandBars("Cell").Controls("Новая кнопка").Delete On Error GoTo 0 End Sub |
Вызываемая процедура (код размещается в стандартном модуле):
1 2 3 |
Sub MySub() MsgBox "Кнопка работает!" End Sub |
Пример 2
Добавление кнопки в контекстное меню ячейки из кода VBA Excel при открытии контекстного меню и удаление кнопки при завершении вызываемой процедуры.
Добавление кнопки (код размещается в модуле книги):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Dim cmdBarBut As CommandBarButton On Error Resume Next With Application 'Удаляем ранее созданную кнопку, если она не была 'нажата и не была удалена назначенным ей макросом .CommandBars("Cell").Controls("Новая кнопка").Delete Set cmdBarBut = .CommandBars("Cell").Controls.Add(Temporary:=True) End With With cmdBarBut .Caption = "Новая кнопка" .Style = msoButtonCaption .OnAction = "MySub" End With On Error GoTo 0 End Sub |
Удаление кнопки при закрытии книги, если она при вызове контекстного меню не была нажата и не была удалена назначенным ей макросом (код размещается в модуле книги):
1 2 3 4 5 |
Private Sub Workbook_Deactivate() On Error Resume Next Application.CommandBars("Cell").Controls("Новая кнопка").Delete On Error GoTo 0 End Sub |
Вызываемая процедура с кодом удаления вызвавшей ее кнопки из контекстного меню (код размещается в стандартном модуле):
1 2 3 4 5 6 |
Sub MySub() MsgBox "Кнопка работает!" On Error Resume Next Application.CommandBars("Cell").Controls("Новая кнопка").Delete On Error GoTo 0 End Sub |
Добрый день.
Для инфо.
Есть ещё контекстное меню умной таблицы
CommandBars("List Range Popup")
Данный параметр создаёт контекстное меню если нажимать правой кнопкой в диапазоне умной таблицы, если указан какой то другой параметр, то при нажатии правой кнопкой в диапазоне умной таблицы, контекстное меню создаваться не будет.
Обсуждение закрыто.