Контекстное меню макрос excel

Программное добавление кнопки в контекстное меню ячейки (строки, столбца) из кода 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.

Программа выводит список всех контекстных меню и панелей инструментов, доступных в текущей версии 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, наверно так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub AddPopUpSubMenu()
  Dim objCmdBrBtn As CommandBarButton
  
  Set objCmdBrBtn = CommandBars("Cell").Controls.Add(msoControlButton, , , , True)
  
  With objCmdBrBtn
    .Caption = "Мой Личный Новенький Пункт! "
    .DescriptionText = "Да, да - мой личный"
    .Enabled = True
    .OnAction = "MyNewPopUpSubMenu"
    .TooltipText = "Мой тул тип для моего пункта"
    .Visible = True
    .FaceId = 2
  End With
End Sub
Sub MyNewPopUpSubMenu()
  MsgBox "Вуа Ля!"
End Sub



2



Nevsky

0 / 0 / 0

Регистрация: 01.12.2011

Сообщений: 25

13.09.2006, 16:00

 [ТС]

3

Спасибо большое, Влад, за пример.

В коде, что я использовал, пункт меню остается постоянно, а также есть варианты по использованию в зависимости от поставленной задачи.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _
        Cancel As Boolean)
    Dim icbc As Object
    For Each icbc In Application.CommandBars("cell").Controls
        If icbc.Tag = "brccm" Then icbc.Delete
    Next icbc
 
    If Not Application.Intersect(Target, Range("b1:b10")) _
         Is Nothing Then
                    With Application.CommandBars("cell").Controls _
                .Add(Type:=msoControlButton, before:=1, _
                temporary:=False)
           .Caption = "Подпись"
           .OnAction = "Макрос"
           .Tag = "brccm"
        End With
   End If
End Sub



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”.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Sub New_Commandbar() 
Dim Cbr As CommandBar, Ctr As CommandBarControl 
On Error Resume Next 
Application.CommandBars("My_cell").Delete 
Application.CommandBars.Add Name:="My_cell", Position:=msoBarPopup, Temporary:=True 
For Each Ctr In Application.CommandBars("cell").Controls 
    With Application.CommandBars("My_cell").Controls.Add(Ctr.Type, Ctr.ID, Ctr.Parameter, , 1) 
        .Caption = Ctr.Caption 
'       .OnAction = Ctr.OnAction 
        .BeginGroup = Ctr.BeginGroup
‘ Копировать также используя CopyButton или CopyControl не помню как называется метод.
    End With 
Next 
End Sub

В Workbook_SheetBeforeRightClick ставлю:

Visual Basic
1
2
3
4
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) 
  Cancel = True
  New_Commandbar
  Application.CommandBars("My_cell").Show



0



rediffusion

5 / 5 / 0

Регистрация: 13.11.2016

Сообщений: 90

24.04.2019, 22:01

6

Всем ку!

Нашёл скрипт «VBA» который немного подправил под свои нужды:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub Спец_Примечание()
Dim myComm As Comment
  If Not ActiveCell.Comment Is Nothing Then
    If MsgBox("Ячейка уже содержит примечание, удалить?", 4) - 7 Then
      ActiveCell.Comment.Delete
    Else: Exit Sub
    End If
  End If
 
  Set myComm = ActiveCell.AddComment
  With myComm.Shape 'выставляем требуемый формат
    .Height = 110
    .Width = 200
    .AutoShapeType = 1             'форма
    .Fill.ForeColor.SchemeColor = 13 'заливка
    .Line.ForeColor.RGB = RGB(255, 0, 0) 'цвет линии
    .DrawingObject.Font.Name = "Consolas" 'шрифт
    .DrawingObject.Font.FontStyle = "обычный"
    .DrawingObject.Font.Size = 9    'размер шрифта
  End With
  'эмулируем выбор пункта "Изменить примечание"
  SendKeys "%": SendKeys "а": SendKeys "и": SendKeys "и": SendKeys "~": SendKeys "{BS}": SendKeys "{BS}"
End Sub

Он работает отлично!
Но я захотел добавить пункт в «Контекстное Меню». Файл «PERSONAL.XLSB» в папке XLSTART создан скрипты сохраняются и работают во всех «Excel» документах. Но ничего не добавляется в «Контекстное Меню». Для этого дела использовал такой скрипт:

Visual Basic
1
2
3
4
5
6
7
Sub SHD_CommAdd()
Dim MyPoint As CommandBarControl
  Set MyPoint = Application.CommandBars("Cell").Controls.Add
  MyPoint.Caption = "Спец примечание"
  MyPoint.OnAction = "PERSONAL.XLSB!AddComm"
  MyPoint.Move , 10
End Sub

Получаю окно с такой формулировкой:
Не удается выполнить макрос «PERSONAL.XLSB’AddComm». Возможно, этот макрос отсутствует в текущей книге либо все макросы отключены.
Вообщем погуглил и нашёл такое «Для добавления макроса в контекстное меню нужно сохранять в ЭТА КНИГА».
Есть какое лекарство? Мне не удобно если только в одном документе будет добавлен пункт, удобно когда во всех документах.

P.S.
Для отмены есть такой скрипт (кстати он робит):

Visual Basic
1
2
3
Sub KMRangeClear()
  Application.CommandBars("Cell").Reset
End Sub

UPD:

:=::=::=::=::=::=::=::=::=::=::=::=::=::=::=::
1. Если создали примечание то функция для возврата «CTRL+Z» не робит (с обычным примечанием робит). Как вернуть работоспособность?
2. Если в контекстное меню добавили несколько пунктов (вызываемых через ПКМ). Как удалить выборочно (ещё раз повторю что эта штука не работает во всех доках, только в одном)? Например:
Спец примечание_1
Спец примечание_2
Спец примечание_3
Хочу удалить только «Спец примечание_1» как реализовать в макросе?
:=::=::=::=::=::=::=::=::=::=::=::=::=::=::=::



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-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (15)


Оценок пока нет. Оцените первым!

 

tol64

Пользователь

Сообщений: 99
Регистрация: 01.01.1970

Приветствую!  

  На форуме уже много было вопросов по редактированию контекстного меню, но я к сожалению не нашёл ответа на свой вопрос. То есть, добавить/удалить свои кнопки в то или иное контекстное меню не вызывает вопросов. Вопрос стоит, как удалить/скрыть стандартные опции.  

  В файле книга с примером. В Module1 макрос OnOffPopupMenu формирует контекстное меню для листа (Ply) и тут же показывает его. После его скрытия на текущем листе в таблице выводятся все опции этого меню. Не запускайте макрос на листе с данными, так как лист очищается полностью в начале макроса.    

  Макрос DisableHideMenuItems удаляет/отключает или скрывает указанную опцию в указанном меню. Точнее так хотелось бы, но этого не происходит. При клике ПКМ на вкладке листа открывается полное контекстное меню. Но запустив макрос OnOffPopupMenu в таблице не будет опции, которую перед этим удаляли.    

  В общем, помогите, пожалуйста разобраться с этим вопросом.

 

tol64

Пользователь

Сообщений: 99
Регистрация: 01.01.1970

 

tol64

Пользователь

Сообщений: 99
Регистрация: 01.01.1970

Упс. Только сейчас увидел, что файл для 2003-го не прикрепил. :)

 

не понятно чего собственно нужно. изменить контекстное меню или отключить? Лично я не понял, что в конечном итоге нужно. Такие темы Уже вроде бы обсуждались на форуме не однократно.

 

tol64

Пользователь

Сообщений: 99
Регистрация: 01.01.1970

Хочу разобраться, как отключать стандартные опции в контекстом меню. На примере контекстного меню Ply (листы), если можно.  

  Да, темы подобные были, но там нет ответа на мой вопрос (вроде бы все просмотрел). Пока не удаётся решить самому.

 

k61

Пользователь

Сообщений: 2441
Регистрация: 21.12.2012

Отключаем опции. Возможно этот пример поможет?

 

tol64

Пользователь

Сообщений: 99
Регистрация: 01.01.1970

Спасибо за пример, но не получается редактировать вот эти контекстные меню.  

  Например для «Ply» и «Shapes» уже работать не будет:  

  With CommandBars(«Ply»)  
  .Controls(1).Enabled = False  
End With  

  With CommandBars(«Shapes»)  
  .Controls(1).Enabled = False  
End With  

  И вот не могу понять почему. Всё ведь аналогично. )))

 

tol64

Пользователь

Сообщений: 99
Регистрация: 01.01.1970

При чём отключить полностью можно любые контекстные меню. А убрать опции не у всех.

 

tol64

Пользователь

Сообщений: 99
Регистрация: 01.01.1970

Решение найдено!  

  Вот по этой ссылке можно прочитать подробную статью (статьи):  

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>  
   <contextMenu idMso=»ContextMenuWorkbookPly»>  
<button idMso=»SheetDelete» enabled=»false» visible=»false»/>  
   </contextMenu>  
</contextMenus>

 

«добавить кнопки и меню для каждого контекстного меню с помощью RibbonX,»  
Что такое RibbonX? Помогите, пожалуйста!  

  Хочу добавить кнопки «Разгруппировать», и «Группировать» с контекстное меню EXCEL 2010

 

antal10

Пользователь

Сообщений: 459
Регистрация: 01.01.1970

#11

14.06.2012 00:11:03

Может поможет надстройка для редактирования контекстного меню.

Прикрепленные файлы

  • post_340461.rar (93.08 КБ)

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Контекстное меню ленты word
  • Контекстное меню легенды в excel
  • Контекстное меню для word файла
  • Контекстное меню в word 2003
  • Контекстное меню в excel мышкой

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии