Программное добавление кнопки в контекстное меню ячейки (строки, столбца) из кода VBA Excel. Свойство CommandBars объекта Application.
Свойство Application.CommandBars
Свойство CommandBars объекта Application возвращает коллекцию командных панелей Microsoft Excel.
Примеры командных панелей, вызываемых кликом правой кнопки мыши (контекстных меню):
- CommandBars(«Cell») – контекстное меню ячейки;
- CommandBars(«Row») – контекстное меню строки;
- CommandBars(«Column») – контекстное меню столбца.
Добавление кнопки из кода VBA Excel в контекстное меню ячейки. Кнопки в контекстные меню строк и столбцов добавляются аналогично.
‘Объявляем объектную переменную 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
, которое применяется по умолчанию:
Set cmdBarBut = Application.CommandBars(«Cell»).Controls.Add |
Созданная предыдущим кодом VBA временная кнопка контекстного меню ячейки будет утилизирована только при закрытии приложения Microsoft Excel. Это означает, что если в приложении открыты несколько книг, тогда после закрытия книги с кодом, создавшим кнопку, она продолжит существование и будет доступна из других открытых книг. Если это не желательно, можно удалить кнопку следующей строкой:
Application.CommandBars(«Cell»).Controls(«Новая кнопка»).Delete |
Эта же строка удалит и постоянную кнопку.
Примеры добавления и удаления кнопок
Пример 1
Добавление кнопки в контекстное меню ячейки из кода VBA Excel при открытии книги и удаление кнопки при закрытии книги.
Добавление кнопки (код размещается в модуле книги):
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 |
Удаление кнопки (код размещается в модуле книги):
Private Sub Workbook_Deactivate() On Error Resume Next Application.CommandBars(«Cell»).Controls(«Новая кнопка»).Delete On Error GoTo 0 End Sub |
Вызываемая процедура (код размещается в стандартном модуле):
Sub MySub() MsgBox «Кнопка работает!» End Sub |
Пример 2
Добавление кнопки в контекстное меню ячейки из кода VBA Excel при открытии контекстного меню и удаление кнопки при завершении вызываемой процедуры.
Добавление кнопки (код размещается в модуле книги):
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 |
Удаление кнопки при закрытии книги, если она при вызове контекстного меню не была нажата и не была удалена назначенным ей макросом (код размещается в модуле книги):
Private Sub Workbook_Deactivate() On Error Resume Next Application.CommandBars(«Cell»).Controls(«Новая кнопка»).Delete On Error GoTo 0 End Sub |
Вызываемая процедура с кодом удаления вызвавшей ее кнопки из контекстного меню (код размещается в стандартном модуле):
Sub MySub() MsgBox «Кнопка работает!» On Error Resume Next Application.CommandBars(«Cell»).Controls(«Новая кнопка»).Delete On Error GoTo 0 End Sub |
Макрос для облегчения работы с контекстными меню и панелями инструментов в Excel.
Программа выводит список всех контекстных меню и панелей инструментов, доступных в текущей версии Excel.
Дополнительные возможности:
- двойной щелчок на ячейках первого столбца (с названиями панелей инструментов) вызовет отображение или скрытие данной панели
-
двойной щелчок на ячейках третьего столбца (с названиями контекстных меню) вызовет вывод этого контекстного меню
Кроме того, есть возможность добавить во все контекстные меню по одному пункту (кнопке), содержащей название и индекс данного выпадающего меню (popup)
Вызвав нужное контекстное меню, можно увидеть его название и индекс:
- 26722 просмотра
Не получается применить макрос? Не удаётся изменить код под свои нужды?
Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.
0 / 0 / 0 Регистрация: 01.12.2011 Сообщений: 25 |
|
1 |
|
11.09.2006, 20:36. Показов 20405. Ответов 7
Здравствуйте всем. Подскажите, пожалуйста, каким образом можно добавить собственный пункт в контекстное меню Excel. Спасибо. Вопрос администратору, у меня не работает поиск по форуму при вводе образца для поиска русскими буквами (англ — ОК!). При задании «Контекстное меню» получаю следующее: Sorry the application encountered an unexpected error. Information about this error has been logged. If you continue to receive this message please contact the board administrator. Можно ли это исправить?
0 |
VladConn 5 / 5 / 3 Регистрация: 17.10.2007 Сообщений: 1,119 |
||||
12.09.2006, 02:30 |
2 |
|||
Nevsky, наверно так:
2 |
Nevsky 0 / 0 / 0 Регистрация: 01.12.2011 Сообщений: 25 |
||||
13.09.2006, 16:00 [ТС] |
3 |
|||
Спасибо большое, Влад, за пример. В коде, что я использовал, пункт меню остается постоянно, а также есть варианты по использованию в зависимости от поставленной задачи.
0 |
0 / 0 / 0 Регистрация: 24.04.2010 Сообщений: 29 |
|
10.10.2006, 22:57 |
4 |
А как потом этот пункт удалить?
0 |
Avtopic 2 / 2 / 0 Регистрация: 23.04.2011 Сообщений: 159 |
||||||||
11.10.2006, 18:18 |
5 |
|||||||
Чтобы вообще не беспокоится об удалении, если требуется в контекстное меню что-то поменять, я делаю так: В самом начале (напр. в Open) копирую все меню “cell” в новое, собственное “My_cell”.
В Workbook_SheetBeforeRightClick ставлю:
0 |
rediffusion 5 / 5 / 0 Регистрация: 13.11.2016 Сообщений: 90 |
||||||||||||
24.04.2019, 22:01 |
6 |
|||||||||||
Всем ку! Нашёл скрипт «VBA» который немного подправил под свои нужды:
Он работает отлично!
Получаю окно с такой формулировкой: P.S.
UPD: :=::=::=::=::=::=::=::=::=::=::=::=::=::=::=::
0 |
11482 / 3773 / 677 Регистрация: 13.02.2009 Сообщений: 11,145 |
|
24.04.2019, 22:48 |
7 |
0 |
5 / 5 / 0 Регистрация: 13.11.2016 Сообщений: 90 |
|
12.06.2019, 20:14 |
8 |
Alex77755, Привет! Вот решение данного вопроса. Работает сам пользуюсь доволен как слон!
0 |
Как показано на скриншотах ниже, многие люди склонны добавлять свои часто используемые функции в меню правой кнопки мыши Excel, чтобы в будущем быстро использовать эти функции одним щелчком мыши. В этой статье говорится о добавлении кнопки пользовательского кода в меню, вызываемое правой кнопкой мыши в Excel.
Добавить пользовательскую кнопку в контекстное меню в Excel с кодом VBA
Добавить пользовательскую кнопку в контекстное меню в Excel с кодом VBA
Предположим, вы создали сценарий VBA с именем MyMacro в своем Excel, и теперь вам нужно добавить эту функцию в контекстное меню для запуска кода, просто щелкнув его. Пожалуйста, сделайте следующее.
1. нажмите другой + F11 клавиши одновременно, чтобы открыть Microsoft Visual Basic для приложений окно.
2. в Microsoft Visual Basic для приложений окно, дважды щелкните Эта рабочая тетрадь слева Проекты под застройку панель. Затем скопируйте и вставьте приведенный ниже код VBA в ThisWorkbook (Код) окно.
Код VBA: добавить пользовательскую кнопку в контекстное меню в Excel
Private Sub Workbook_Deactivate()
On Error Resume Next
With Application
.CommandBars("Cell").Controls("MyMacro").Delete
End With
On Error GoTo 0
End Sub
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
Dim cmdBtn As CommandBarButton
On Error Resume Next
With Application
.CommandBars("Cell").Controls("MyMacro").Delete
Set cmdBtn = .CommandBars("Cell").Controls.Add(Temporary:=True)
End With
With cmdBtn
.Caption = "MyMacro"
.Style = msoButtonCaption
.OnAction = "MyMacro"
End With
On Error GoTo 0
End Sub
Внимание: В коде замените все «MyMacro» с именем макроса, который вы создали в Excel.
3. нажмите другой + Q ключи для выхода из Microsoft Visual Basic для приложений окно.
Теперь вы вернетесь в интерфейс Excel, после щелчка правой кнопкой мыши по ячейке вы увидите, что новая кнопка с указанным именем добавлена в контекстное меню, как показано ниже. При нажатии на кнопку немедленно запускается соответствующий макрос.
Статьи по теме:
- HКак вставить новую пустую строку автоматически с помощью командной кнопки в Excel?
- Как использовать командную кнопку для сохранения активного рабочего листа в виде файла PDF в Excel?
- Как сохранить и закрыть активную книгу без запроса командной кнопки в Excel?
- Как обновить или вставить (текущую) дату и время с помощью командной кнопки в Excel?
- Как отключить кнопку после однократного нажатия в Excel?
Лучшие инструменты для работы в офисе
Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%
- Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
- Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон…
- Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны…
- Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
- Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
- Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии…
- Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
- Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF…
- Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.
Вкладка Office: интерфейс с вкладками в Office и упрощение работы
- Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
- Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
- Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!
Комментарии (15)
Оценок пока нет. Оцените первым!
tol64 Пользователь Сообщений: 99 |
Приветствую! На форуме уже много было вопросов по редактированию контекстного меню, но я к сожалению не нашёл ответа на свой вопрос. То есть, добавить/удалить свои кнопки в то или иное контекстное меню не вызывает вопросов. Вопрос стоит, как удалить/скрыть стандартные опции. В файле книга с примером. В Module1 макрос OnOffPopupMenu формирует контекстное меню для листа (Ply) и тут же показывает его. После его скрытия на текущем листе в таблице выводятся все опции этого меню. Не запускайте макрос на листе с данными, так как лист очищается полностью в начале макроса. Макрос DisableHideMenuItems удаляет/отключает или скрывает указанную опцию в указанном меню. Точнее так хотелось бы, но этого не происходит. При клике ПКМ на вкладке листа открывается полное контекстное меню. Но запустив макрос OnOffPopupMenu в таблице не будет опции, которую перед этим удаляли. В общем, помогите, пожалуйста разобраться с этим вопросом. |
tol64 Пользователь Сообщений: 99 |
|
tol64 Пользователь Сообщений: 99 |
Упс. Только сейчас увидел, что файл для 2003-го не прикрепил. |
не понятно чего собственно нужно. изменить контекстное меню или отключить? Лично я не понял, что в конечном итоге нужно. Такие темы Уже вроде бы обсуждались на форуме не однократно. |
|
tol64 Пользователь Сообщений: 99 |
Хочу разобраться, как отключать стандартные опции в контекстом меню. На примере контекстного меню Ply (листы), если можно. Да, темы подобные были, но там нет ответа на мой вопрос (вроде бы все просмотрел). Пока не удаётся решить самому. |
k61 Пользователь Сообщений: 2441 |
Отключаем опции. Возможно этот пример поможет? |
tol64 Пользователь Сообщений: 99 |
Спасибо за пример, но не получается редактировать вот эти контекстные меню. Например для «Ply» и «Shapes» уже работать не будет: With CommandBars(«Ply») With CommandBars(«Shapes») И вот не могу понять почему. Всё ведь аналогично. ))) |
tol64 Пользователь Сообщений: 99 |
При чём отключить полностью можно любые контекстные меню. А убрать опции не у всех. |
tol64 Пользователь Сообщений: 99 |
Решение найдено! Вот по этой ссылке можно прочитать подробную статью (статьи): http://msdn.microsoft.com/ru-ru/library/gg469862.aspx ‘— Ключевой момент был раскрыт в этом абзаце (машинный перевод): В Microsoft Excel 97 — Excel 2003 можно добавить элементы управления для каждого контекстного меню с помощью VBA-кода (хотя это не было протестировано для любого случая) но это не возможно изменение контекстные меню с помощью RibbonX. Excel 2007 можно добавить элементы управления почти каждый контекстное меню с помощью VBA-кода. Тем не менее не позволяет изменить некоторые контекстные меню, такие как Shapes и Picture контекстное меню с помощью VBA. Кроме того это невозможно изменить контекстное меню с помощью RibbonX. Excel 2010 можно добавить элементы управления почти каждый контекстное меню с помощью VBA-кода. Действуют те же ограничения для изменения некоторых контекстных меню с помощью VBA как Excel 2007. Кроме того можно добавить кнопки и меню для каждого контекстного меню с помощью RibbonX, но если вы хотите отключить или re-purpose элементы управления, будет возможность найти правильные идентификаторы (idMso). ‘— Например, при редактировании контекстного меню для листов, чтобы убрать кнопку Удалить нужно вставить такие теги: <contextMenus> |
«добавить кнопки и меню для каждого контекстного меню с помощью RibbonX,» Хочу добавить кнопки «Разгруппировать», и «Группировать» с контекстное меню EXCEL 2010 |
|
antal10 Пользователь Сообщений: 459 |
#11 14.06.2012 00:11:03 Может поможет надстройка для редактирования контекстного меню. Прикрепленные файлы
|