Настройка контекстных меню во всех версиях Microsoft Excel

Сводка. Узнайте, как настраивать контекстные меню в версиях от Excel 97 до Excel 2010.

Дата последнего изменения: 24 апреля 2015 г.

Применимо к: Excel | Excel 2010 | Office 2007 | Office 2010 | SharePoint Server 2010 | VBA

Дата публикации: ноябрь 2010 г.

Содержание

  • Обзор контекстных меню в Microsoft Office

  • Обзор контекстных меню в Excel

  • Настройка контекстных меню в Excel

  • Добавление элементов управления в контекстное меню ячейки с помощью кода VBA

  • Добавление элементов управления в контекстное меню ячейки с помощью расширения ленты

  • Добавление динамического меню в контекстное меню ячейки с помощью кода VBA или расширения ленты

  • Советы по использованию контекстного меню

  • Сводка

  • Дополнительные ресурсы

Обзор контекстных меню в Microsoft Office

Контекстное меню — это меню, которое появляется в результате какого-либо действия пользователя, обычно после щелчка правой кнопкой мыши. В контекстном меню Microsoft Office отображается ограниченный набор операций, доступных в текущем состоянии, или контексте, приложения. Обычно сюда входят действия, связанные с выбранным объектом, например ячейкой или столбцом.

Обзор контекстных меню в Excel

В Microsoft Excel пользователи чаще всего открывают контекстное меню ячейки. Оно отображается, если щелкнуть правой кнопкой мыши одну или несколько выделенных ячеек листа. Но вы можете настроить и многие другие подобные меню. Например, контекстные меню строки и столбца, которые отобразятся, если щелкнуть правой кнопкой мыши заголовок строки или столбца. На рисунке 1 показано контекстное меню ячейки в Microsoft Excel 2010.

Рисунок 1. Контекстное меню ячейки в Excel 2010

Контекстное меню ячейки в Excel 2010

Примечание

Раздел NameX, отображенный в нижней части меню, создается надстройкой Microsoft, которая описана ниже в этой статье.

Настройка контекстных меню в Excel

Единственный способ настроить контекстные меню в версиях от Excel 97 до Excel 2007 — использовать код Microsoft Visual Basic для приложений (VBA). Пример такого кода приведен ниже. Тем не менее в Excel 2010 контекстное меню также можно изменять с помощью той же модели расширения ленты (RibbonX), которая применяется при настройке других компонентов пользовательского интерфейса Microsoft Office Fluent для включения ленты и представления Backstage.

Одно из преимуществ настройки контекстных меню в Excel 2010 с помощью RibbonX — возможность добавить элементы управления, которые невозможно добавить в коде VBA. Элементы управления, которые можно добавить в контекстные меню:

  • button;

  • checkBox;

  • control;

  • dynamicMenu;

  • gallery;

  • menu;

  • menuSeparator;

  • splitButton;

  • toggleButton.

Еще раз обращаем ваше внимание, что использование RibbonX для настройки контекстного меню возможно только в Excel 2010. В других версиях Microsoft Excel необходимо использовать код VBA и объект CommandBars.

Добавление элементов управления в контекстное меню ячейки с помощью кода VBA

В примере ниже показано, как добавить настраиваемую кнопку, встроенную кнопку (Сохранить) и вложенное меню в верхнюю часть контекстного меню ячейки.

Примечание

В Microsoft Excel существует два контекстных меню ячейки. Первое — это стандартное меню, а второе появляется при переходе в страничный режим. В таком режиме можно просмотреть данные, которые отображаются на каждой странице, а также быстро задать область печати и разрывы страниц. Для активации такого режима на ленте откройте вкладку Вид, а затем нажмите кнопку Страничный режим. Чтобы изменить второй тип меню, воспользуйтесь приведенным ниже выражением.

Set ContextMenu = Application.CommandBars(Application.CommandBars("Cell").Index + 3)

Эти сведения также применимы к контекстным меню строки и столбца.

Чтобы настроить контекстное меню ячейки, добавьте общий модуль к проекту VBA в книге. Откройте редактор Visual Basic (VBE), нажав клавиши ALT+F11, откройте меню Insert (Вставка), а затем выберите пункт Module (Модуль). Вставьте или введите в модуль шесть приведенных ниже подпрограмм. Первый макрос добавляет элементы управления в контекстное меню ячейки. Второй — удаляет элементы управления из контекстного меню ячейки. Обратите внимание, как теги добавляются к элементам управления и затем используются для их удаления. Остальные четыре макроса запускаются, когда вы нажимаете кнопку или выбираете один из трех параметров во вложенном меню. В этом примере последние четыре макроса изменяют регистр любого текста в ячейке.

Sub AddToCellMenu()
    Dim ContextMenu As CommandBar
    Dim MySubMenu As CommandBarControl

    ' Delete the controls first to avoid duplicates.
    Call DeleteFromCellMenu

    ' Set ContextMenu to the Cell context menu.
    Set ContextMenu = Application.CommandBars("Cell")

    ' Add one built-in button(Save = 3) to the Cell context menu.
    ContextMenu.Controls.Add Type:=msoControlButton, ID:=3, before:=1

    ' Add one custom button to the Cell context menu.
    With ContextMenu.Controls.Add(Type:=msoControlButton, before:=2)
        .OnAction = "'" & ThisWorkbook.Name & "'!" & "ToggleCaseMacro"
        .FaceId = 59
        .Caption = "Toggle Case Upper/Lower/Proper"
        .Tag = "My_Cell_Control_Tag"
    End With

    ' Add a custom submenu with three buttons.
    Set MySubMenu = ContextMenu.Controls.Add(Type:=msoControlPopup, before:=3)

    With MySubMenu
        .Caption = "Case Menu"
        .Tag = "My_Cell_Control_Tag"

        With .Controls.Add(Type:=msoControlButton)
            .OnAction = "'" & ThisWorkbook.Name & "'!" & "UpperMacro"
            .FaceId = 100
            .Caption = "Upper Case"
        End With
        With .Controls.Add(Type:=msoControlButton)
            .OnAction = "'" & ThisWorkbook.Name & "'!" & "LowerMacro"
            .FaceId = 91
            .Caption = "Lower Case"
        End With
        With .Controls.Add(Type:=msoControlButton)
            .OnAction = "'" & ThisWorkbook.Name & "'!" & "ProperMacro"
            .FaceId = 95
            .Caption = "Proper Case"
        End With
    End With

    ' Add a separator to the Cell context menu.
    ContextMenu.Controls(4).BeginGroup = True
End Sub

Sub DeleteFromCellMenu()
    Dim ContextMenu As CommandBar
    Dim ctrl As CommandBarControl

    ' Set ContextMenu to the Cell context menu.
    Set ContextMenu = Application.CommandBars("Cell")

    ' Delete the custom controls with the Tag : My_Cell_Control_Tag.
    For Each ctrl In ContextMenu.Controls
        If ctrl.Tag = "My_Cell_Control_Tag" Then
            ctrl.Delete
        End If
    Next ctrl

    ' Delete the custom built-in Save button.
    On Error Resume Next
    ContextMenu.FindControl(ID:=3).Delete
    On Error GoTo 0
End Sub

Sub ToggleCaseMacro()
    Dim CaseRange As Range
    Dim CalcMode As Long
    Dim cell As Range

    On Error Resume Next
    Set CaseRange = Intersect(Selection, _
        Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues))
    On Error GoTo 0
    If CaseRange Is Nothing Then Exit Sub

    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    For Each cell In CaseRange.Cells
        Select Case cell.Value
        Case UCase(cell.Value): cell.Value = LCase(cell.Value)
        Case LCase(cell.Value): cell.Value = StrConv(cell.Value, vbProperCase)
        Case Else: cell.Value = UCase(cell.Value)
        End Select
    Next cell

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = CalcMode
    End With
End Sub

Sub UpperMacro()
    Dim CaseRange As Range
    Dim CalcMode As Long
    Dim cell As Range

    On Error Resume Next
    Set CaseRange = Intersect(Selection, _
        Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues))
    On Error GoTo 0
    If CaseRange Is Nothing Then Exit Sub

    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    For Each cell In CaseRange.Cells
        cell.Value = UCase(cell.Value)
    Next cell

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = CalcMode
    End With
End Sub

Sub LowerMacro()
    Dim CaseRange As Range
    Dim CalcMode As Long
    Dim cell As Range

    On Error Resume Next
    Set CaseRange = Intersect(Selection, _
        Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues))
    On Error GoTo 0
    If CaseRange Is Nothing Then Exit Sub

    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    For Each cell In CaseRange.Cells
        cell.Value = LCase(cell.Value)
    Next cell

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = CalcMode
    End With
End Sub

Sub ProperMacro()
    Dim CaseRange As Range
    Dim CalcMode As Long
    Dim cell As Range

    On Error Resume Next
    Set CaseRange = Intersect(Selection, _
        Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues))
    On Error GoTo 0
    If CaseRange Is Nothing Then Exit Sub

    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    For Each cell In CaseRange.Cells
        cell.Value = StrConv(cell.Value, vbProperCase)
    Next cell

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = CalcMode
    End With
End Sub

Скопируйте две приведенные ниже процедуры обработки событий в модуль ThisWorkbook книги. Эти события автоматически добавят элементы управления в контекстное меню ячейки в случае открытия или активации книги и удалят их, когда вы ее закроете или отключите.

Private Sub Workbook_Activate()
    Call AddToCellMenu
End Sub

Private Sub Workbook_Deactivate()
    Call DeleteFromCellMenu
End Sub

Чтобы просмотреть изменения в контекстном меню ячейки, сохраните книгу, затем закройте и снова откройте ее. Контекстное меню ячейки должно выглядеть, как показано на рисунке 2.

Рисунок 2. Настроенное контекстное меню ячейки

Настроенное контекстное меню ячейки

Добавление элементов управления в контекстное меню ячейки с помощью расширения ленты

В этом примере рассматривается создание тех же кнопок и вложенных меню, которые были описаны ранее. Теперь для создания элементов управления в Excel 2010 используется RibbonX. Этот вариант изменения контекстного меню невозможно применить в версиях от Excel 97 до Excel 2007.

Примечание

Дополнительные сведения о редакторе настраиваемого пользовательского интерфейса и использовании RibbonX для настройки пользовательского интерфейса Microsoft Office см. на веб-сайте Рона дю Брана, посвященном ленте.

Идентификатор контекстного меню ячейки в страничном режиме в Excel 2010 отличается от идентификатора обычного контекстного меню ячейки. Идентификаторы этого и других контекстных меню можно найти с помощью надстройки Microsoft, о которой речь пойдет далее в этой статье.

Как добавить XML-код для добавления элементов управления в контекстное меню

  1. Откройте в Excel 2010 новую книгу и сохраните ее, как книгу с поддержкой макросов (XLSM).

  2. Закройте книгу.

  3. Откройте книгу в редакторе настраиваемого пользовательского интерфейса (дополнительные сведения см. в предыдущем разделе), откройте вкладку Insert (Вставка), а затем выберите пункт Office 2010 Custom UI Part (Настраиваемая часть пользовательского интерфейса Office 2010).

  4. Вставьте следующий XML-код в окно "Office 2010 Custom UI Part" (Настраиваемая часть пользовательского интерфейса Office 2010).

    <customUI xmlns="https://schemas.microsoft.com/office/2009/07/customui">
       <contextMenus>
          <contextMenu idMso="ContextMenuCell">
             <button idMso="FileSave" insertBeforeMso="Cut" />
             <button id="MyButton" label="Toggle Case Upper/Lower/Proper"
                 insertBeforeMso="Cut" 
                 onAction="ToggleCaseMacro" 
                 imageMso="HappyFace"/>
             <menu id="MySubMenu" label="Case Menu" insertBeforeMso="Cut"  >
                <button id="Menu1Button1" label="Upper Case" 
                   imageMso="U" onAction="UpperMacro"/>
                <button id="Menu1Button2" label="Lower Case" 
                   imageMso="L" onAction="LowerMacro"/>
                <button id="Menu1Button3" label="Proper Case" 
                   imageMso="P" onAction="ProperMacro"/>
             </menu>
            <menuSeparator id="MySeparator" insertBeforeMso="Cut" />
          </contextMenu>
       </contextMenus>
    </customUI>
    
  5. Сохраните изменения и закройте редактор.

  6. Откройте книгу в Excel 2010.

  7. Скопируйте или введите следующие четыре макроса в общий модуль в VBE и сохраните книгу.

    Sub ToggleCaseMacro(control As IRibbonControl)
        Dim CaseRange As Range
        Dim CalcMode As Long
        Dim cell As Range
    
        On Error Resume Next
        Set CaseRange = Intersect(Selection, _
            Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues))
        If CaseRange Is Nothing Then Exit Sub
    
        With Application
            CalcMode = .Calculation
            .Calculation = xlCalculationManual
            .ScreenUpdating = False
            .EnableEvents = False
        End With
    
        For Each cell In CaseRange
            Select Case cell.Value
            Case UCase(cell.Value): cell.Value = LCase(cell.Value)
            Case LCase(cell.Value): cell.Value = StrConv(cell.Value, vbProperCase)
            Case Else: cell.Value = UCase(cell.Value)
            End Select
        Next cell
    
        With Application
            .ScreenUpdating = True
            .EnableEvents = True
            .Calculation = CalcMode
        End With
    End Sub
    
    Sub UpperMacro(control As IRibbonControl)
        Dim CaseRange As Range
        Dim CalcMode As Long
        Dim cell As Range
    
        On Error Resume Next
        Set CaseRange = Intersect(Selection, _
            Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues))
        If CaseRange Is Nothing Then Exit Sub
    
        With Application
            CalcMode = .Calculation
            .Calculation = xlCalculationManual
            .ScreenUpdating = False
            .EnableEvents = False
        End With
    
        For Each cell In CaseRange
            cell.Value = UCase(cell.Value)
        Next cell
    
        With Application
            .ScreenUpdating = True
            .EnableEvents = True
            .Calculation = CalcMode
        End With
    End Sub
    
    Sub LowerMacro(control As IRibbonControl)
        Dim CaseRange As Range
        Dim CalcMode As Long
        Dim cell As Range
    
        On Error Resume Next
        Set CaseRange = Intersect(Selection, _
            Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues))
        If CaseRange Is Nothing Then Exit Sub
    
        With Application
            CalcMode = .Calculation
            .Calculation = xlCalculationManual
            .ScreenUpdating = False
            .EnableEvents = False
        End With
    
        For Each cell In CaseRange
            cell.Value = LCase(cell.Value)
        Next cell
    
        With Application
            .ScreenUpdating = True
            .EnableEvents = True
            .Calculation = CalcMode
        End With
    End Sub
    
    Sub ProperMacro(control As IRibbonControl)
        Dim CaseRange As Range
        Dim CalcMode As Long
        Dim cell As Range
    
        On Error Resume Next
        Set CaseRange = Intersect(Selection, _
            Selection.Cells.SpecialCells(xlCellTypeConstants, xlTextValues))
        If CaseRange Is Nothing Then Exit Sub
    
        With Application
            CalcMode = .Calculation
            .Calculation = xlCalculationManual
            .ScreenUpdating = False
            .EnableEvents = False
        End With
    
        For Each cell In CaseRange
            cell.Value = StrConv(cell.Value, vbProperCase)
        Next cell
    
        With Application
            .ScreenUpdating = True
            .EnableEvents = True
            .Calculation = CalcMode
        End With
    End Sub
    
  8. В книге щелкните правой кнопкой мыши ячейку с текстом и убедитесь, что контекстное меню ячейки изменилось.

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

Предупреждение

Когда вы закрываете книгу, удаляются все элементы управления, добавленные вами в контекстное меню ячейки. Тем не менее, если вы откроете другую книгу, не закрывая при этом текущую, в контекстном меню ячейки сохранится добавленная вами встроенная кнопка Сохранить. Эта проблема возникает при добавлении встроенных элементов управления в контекстное меню. Если вы хотите ее избежать, вместо встроенной добавьте настраиваемую кнопку, вызывающую макрос, который выполняет встроенную команду Сохранить.

Чтобы добавить настраиваемую кнопку со встроенной командой, замените выражение <button idMso="FileSave" insertBeforeMso="Cut" /> выражением <button id="DuplicateBuiltInButton1" label="Save" insertBeforeMso="Cut" onAction="BuiltInSaveCommand" imageMso="FileSave"/>. Затем в VBE добавьте приведенный ниже макрос, который вызывается атрибутом onAction.

Sub BuiltInSaveCommand(control As IRibbonControl)
    CommandBars.ExecuteMso "FileSave"
End Sub

Кроме того, можно использовать метод ActiveWorkbook.Save. С помощью метода ExecuteMso можно выполнить любые встроенные элементы управления в пользовательском интерфейсе Microsoft Office Fluent.

Добавление динамического меню в контекстное меню ячейки с помощью кода VBA или расширения ленты

Динамические меню указывают на процедуры обратного вызова, которые создают меню в среде выполнения. Элемент управления dynamicMenu включает в себя атрибут getContent, указывающий на процедуру обратного вызова GetContent.

Ниже приводится образец XML для RibbonX, который создает динамическое меню в контекстном меню ячейки.

<customUI xmlns="https://schemas.microsoft.com/office/2009/07/customui">
   <contextMenus>
      <contextMenu idMso="ContextMenuCell">
         <dynamicMenu id="MyDynamicMenu" 
            label= "My Dynamic Menu" imageMso="HappyFace" 
            getContent="GetContent" insertBeforeMso="Cut"/>
      </contextMenu>
   </contextMenus>
</customUI>

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

Sub GetContent(control As IRibbonControl, ByRef returnedVal)
    Dim xml As String

    xml = "<menu xmlns=""https://schemas.microsoft.com/office/2009/07/customui"">" & _
          "<button id=""but1"" imageMso=""Help"" label=""Help"" onAction=""HelpMacro""/>" & _
          "<button id=""but2"" imageMso=""FindDialog"" label=""Find"" onAction=""FindMacro""/>" & _
          "</menu>"

    returnedVal = xml
End Sub

Sub HelpMacro(control As IRibbonControl)
    MsgBox "Help macro"
End Sub

Sub FindMacro(control As IRibbonControl)
    MsgBox "Find macro"
End Sub

Предлагаем скачать три примера книг, с помощью которых можно добавить динамическое меню в контекстное меню ячейки, учитывая имя пользователя, язык, используемый в Excel, или значение активной ячейки (формула, пустая ячейка, числовой или текстовый формат). Просмотреть всю информацию о примерах в соответствующей книге, а также скачать эти три книги можно на веб-сайте Рона дю Брана.

Советы по использованию контекстного меню

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

В примере VBA, приведенном в начале статьи, мы показали, как изменить контекстное меню ячейки с помощью событий Activate и Deactivate книги, которые вызывают макрос для создания и удаления элементов управления меню.

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

Private Sub Workbook_Activate()
    Dim sUserName As String
    sUserName = Application.UserName

    Select Case sUserName
    Case "Ron de Bruin": Call AddToCellMenu
    Case "Nancy Davolio": Call AddToCellMenu2
    Case Else: Call AddToCellMenu3
    End Select
End Sub

Другим примером может послужить поиск регионального языка Excel в событии Activate, с тем чтобы заголовки в контекстном меню создавались на языке пользователя. Ниже приводится пример кода, при открытии книги вызывающий разные макросы в зависимости от настройки регионального языка на компьютере пользователя.

Private Sub Workbook_Activate()
    Dim LangID As Long
    LangID = Application.International(xlCountryCode)

    Select Case LangID
    Case 31: Call AddToCellMenuInDutch
    Case 49: Call AddToCellMenuinGerman
    Case Else: Call AddToCellMenu
    End Select
End Sub

Примечание

Дополнительные сведения о подобных проблемах см. на веб-странице, посвященной использованию Excel в различных странах, на веб-сайте Рона де Брана.

Фрагмент кода VBA, позволяющий включить и отключить элемент управления Вставить примечание в контекстном меню ячейки в версиях от Excel 97 до Excel 2010: Application.CommandBars("Cell").FindControl(ID:=2031).Enabled = False.

Примечание

Надстройка, описанная в конце этой статьи, помогает найти идентификатор всех элементов управления контекстного меню.

Кроме того, чтобы добавить идентификатор в заголовок, можно использовать приведенный ниже макрос. Обратите внимание, что контекстное меню ячейки может отличаться в разных версиях Excel.

Sub Add_ID_To_ContextMenu_Caption()
' Add the Id to the caption of the context menu controls.
    Dim ctl As CommandBarControl
    For Each ctl In Application.CommandBars("Cell").Controls
        On Error Resume Next
        ctl.Caption = ctl.ID & " ::: " & ctl.Caption
        On Error GoTo 0
    Next ctl
End Sub

Sub Reset_ContextMenu()
' Remove the Id of the caption of the context menu controls.
    Dim ctl As CommandBarControl
    Dim myPos As Long
    For Each ctl In Application.CommandBars("Cell").Controls
        myPos = InStr(1, ctl.Caption, " ::: ", vbTextCompare)
        If myPos > 0 Then
            ctl.Caption = Mid(ctl.Caption, myPos + 4)
        End If
    Next ctl
End Sub

Sub Reset_ContextMenu_To_Factory_Defaults()
    Application.CommandBars("Cell").Reset
End Sub

Включить и отключить элементы управления можно с помощью событий Activate и Deactivate, описанных ранее.

Чтобы отключить элемент управления Удалить в контекстном меню ячейки с помощью RibbonX, добавьте выражение <button idMso="CellsDelete" enabled="false" /> в элемент управления contextMenu в XML-коде, приведенном выше в разделе Добавление элементов управления в контекстное меню ячейки с помощью расширения ленты этой статьи.

Как показывает пример выражения, для отключения элемента управления в контекстном меню нужно знать его идентификатор (idMso). Это может вызвать определенные затруднения, так как подобные сведения доступны не для всех элементов управления в контекстном меню. Например, такая информация отсутствует для контекстных меню ячейки, строки и столбца. Кроме того, отсутствует список идентификаторов элементов управления, поддерживаемых в ленте RibbonX. В качестве обходного решения для отключения определенного элемента управления можно использовать код VBA, сходный с описанным в предыдущем разделе.

Итак, как найти имена других контекстных меню, которые нужно изменить? Приведенный ниже макрос добавляет кнопку с именем меню в конце каждого контекстного меню. Невозможно просмотреть имя любого контекстного меню при его запуске в Excel 2007 или Excel 2010. Например, вы не увидите имя меню, если щелкнете правой кнопкой мыши фигуру или рисунок в Excel 2007 или Excel 2010. Поэтому не удастся изменить эти меню в Excel 2007 или Excel 2010 с помощью VBA.

Sub Add_Name_To_Contextmenus()
    Dim Cbar As CommandBar
    For Each Cbar In Application.CommandBars
        With Cbar
            If .Type = msoBarTypePopup Then
                On Error Resume Next
                With .Controls.Add(Type:=msoControlButton)
                    .Caption = "Name for VBA = " & Cbar.Name
                    .Tag = "NameButtonInContextMenu"
                End With
                On Error GoTo 0
            End If
        End With
    Next
End Sub

Sub Delete_Name_From_Contextmenus()
    Dim Cbar As CommandBar
    Dim ctrl As CommandBarControl

    For Each Cbar In Application.CommandBars
        With Cbar
            If .Type = msoBarTypePopup Then
                For Each ctrl In .Controls
                    If ctrl.Tag = "NameButtonInContextMenu" Then
                        ctrl.Delete
                    End If
                Next ctrl
            End If
        End With
    Next
End Sub

Ниже приводятся ссылки на файлы, содержащие идентификаторы и значения FaceId изображений для всех элементов управления в большинстве контекстных меню, если необходимо изменить такое меню с помощью VBA.

  • Скачайте надстройку BtnFace, разработанную Джимом Речем, чтобы найти все значения FaceId изображений для элементов управления, на этой веб-странице.

  • Чтобы найти идентификаторы элементов управления и идентификаторы их изображений, откройте веб-страницу Оле П. Ерландсена.

  • Веб-страница Джона Волкенбаха поможет найти идентификаторы всех изображений элементов управления.

Если необходимо изменить контекстные меню с помощью RibbonX, используйте приведенную ниже ссылку на файлы, содержащие значения idMso или imageMso для всех элементов управления в большинстве контекстных меню.

http://www.rondebruin.nl/ribbon.htm#images

С помощью надстройки Microsoft COM можно найти имена всех контекстных меню в Microsoft Office 2010. Кроме того, эта надстройка добавляет в нижней части контекстного меню кнопку, благодаря которой вы найдете имена большинства контекстных меню.

Сводка

Эта статья содержит следующую информацию:

  • В версиях от Excel 97 до Excel 2003 элементы управления в любое контекстное меню можно добавлять, используя код VBA, хотя эта возможность не проверена для всех сценариев. При этом невозможно изменить контекстные меню с помощью RibbonX.

  • В Excel 2007 элементы управления в большинство контекстных меню можно добавлять с помощью кода VBA. Тем не менее некоторые контекстные меню, такие как контекстные меню фигур и изображений, не удастся изменить, используя VBA. К тому же, невозможно изменять контекстные меню с помощью RibbonX.

  • В Excel 2010 с помощью кода VBA можно добавить элементы управления в большинство контекстных меню. Тем не менее существуют те же ограничения на изменение некоторых контекстных меню с помощью VBA, что и в Excel 2007. Кроме того, используя RibbonX, можно добавлять кнопки и меню во все контекстные меню, но если нужно отключить элементы управления или изменить их назначение, вы можете не найти необходимые идентификаторы (idMso).

Дополнительные ресурсы

Подробнее с темами, раскрытыми в этой статье, можно ознакомиться на следующих ресурсах: