すべてのバージョンの Microsoft Excel でコンテキスト メニューをカスタマイズする

概要: Excel 97 ~ Excel 2010 でコンテキスト メニューをカスタマイズする方法について説明します。

適用対象: Excel | Excel 2010 | Office 2007 | Office 2010 | SharePoint Server 2010 | VBA

Applies to:    Microsoft Excel 97 | Microsoft Excel 2000 | Microsoft Excel 2002 | Microsoft Excel 2003 | Microsoft Office Excel 2007 | Microsoft Excel 2010

公開日:  2010 年 11 月

目次

  • Microsoft Office でのコンテキスト メニューの概要

  • Excel でのコンテキスト メニューの概要

  • Excel でコンテキスト メニューをカスタマイズする

  • VBA コードを使用してコントロールをセルのコンテキスト メニューに追加する

  • リボン拡張機能を使用してコントロールをセルのコンテキスト メニューに追加する

  • VBA コードまたはリボン拡張機能を使用してセルのコンテキスト メニューに動的メニューを追加する

  • コンテキスト メニューのヒントとテクニック

  • まとめ

  • その他の技術情報

Microsoft Office でのコンテキスト メニューの概要

コンテキスト メニュー (ショートカット メニューとも呼ばれます) は、いくつかのユーザー操作 (通常はマウスの右クリック操作) の後に表示されるメニューです。Microsoft Office では、コンテキスト メニューはアプリケーションの現在の状態やコンテキストで利用できる、限定された選択肢のセットを提供します。通常、利用可能な選択肢は、セルや列など、選択したオブジェクトに関連があるアクションです。

Excel でのコンテキスト メニューの概要

Microsoft Excel では、ユーザーが最も一般的に使用するコンテキスト メニューは、Cell コンテキスト メニューです。これは、ワークシートの 1 つのセルや連続するセルを右クリックしたときに表示されるメニューです。しかし、カスタマイズできるコンテキスト メニューはほかにも多数あります。たとえば、行や列のヘッダーを右クリックしたときに表示される Row や Column のコンテキスト メニューなどです。図 1 に、Microsoft Excel 2010 の Cell コンテキスト メニューを示します。

図 1. Excel 2010 のセルのコンテキスト メニュー

Excel 2010 のセルのコンテキスト メニュー

注意

メニューの下部に表示されている NameX セクションは、この記事で後述する Microsoft アドインによって作成されたものです。

Excel でコンテキスト メニューをカスタマイズする

Excel 97 ~ Excel 2007 でコンテキスト メニューをカスタマイズする唯一の方法は、Microsoft Visual Basic for Applications (VBA) コードを使用することです。この例はすぐに紹介します。しかし、Excel 2010 では、Microsoft Office Fluent ユーザー インターフェイスの他のコンポーネントをカスタマイズしてリボンと Backstage ビューを含めるときに使用するのと同じリボン機能拡張 (RibbonX) モデルを使用して、コンテキスト メニューを変更することができます。

Excel 2010 で RibbonX を使用してコンテキスト メニューをカスタマイズする利点の 1 つは、VBA では追加できないコントロールを追加できることです。次の一覧に、コンテキスト メニューに追加できるコントロールを示します。

  • button

  • checkBox

  • control

  • dynamicMenu

  • gallery

  • menu

  • menuSeparator

  • splitButton

  • toggleButton

ただし、繰り返しになりますが、Excel 2010 でコンテキスト メニューをカスタマイズする場合にのみ RibbonX を使用できます。他のバージョンのMicrosoft Excel では、VBA と CommandBars オブジェクトを使用する必要があります。

VBA コードを使用してコントロールをセルのコンテキスト メニューに追加する

次の例では、Cell コンテキスト メニューの上にカスタム ボタン、組み込みボタン ([Save])、およびサブメニューを追加します。

注意

Microsoft Excel には 2 つの Cell コンテキスト メニューがあります。1 つは標準のメニュー、2 つ目は改ページ プレビュー モードのときに表示されるメニューです。改ページ プレビュー モードでは、各ページに表示されるデータを示し、印刷領域と改ページをすばやく調整できます。改ページ プレビュー モードをアクティブ化するには、リボンで [表示] をクリックして、[改ページ プレビュー] をクリックします。2 つ目の種類のメニューを変更する場合は、次のステートメントを使用します。

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

この情報は、Row および Column のコンテキスト メニューにも該当します。

Cell コンテキスト メニューをカスタマイズするには、ブックの VBA プロジェクトに一般的なモジュールを追加します。Alt + F11 を押して Visual Basic エディター (VBE) を開き、[挿入] をクリックしてから、[モジュール] をクリックします。モジュールに次の 6 つのサブルーチンを貼り付けるか入力します。最初のマクロは、コントロールを Cell コンテキスト メニューに追加します。2 つ目のマクロは、コントロールを Cell コンテキスト メニューから削除します。どのようにタグがコントロールに追加され、コントロールを削除するのに使用されているのか注意してください。ほかの 4 つのマクロは、サブメニューのボタンまたは 3 つのオプションのいずれかをクリックしたとき実行されます。この例では、最後の 4 つのマクロは、セルのテキストの大文字と小文字を変更します。

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

次の 2 つのイベント プロシージャをブックの ThisWorkbook モジュールにコピーします。これらのイベントは、ブックを開くかアクティブ化したときに Cell コンテキスト メニューに自動的に追加され、ブックを閉じるか非アクティブ化したときに削除されます。

Private Sub Workbook_Activate()
    Call AddToCellMenu
End Sub

Private Sub Workbook_Deactivate()
    Call DeleteFromCellMenu
End Sub

次に、ブックを保存し、閉じてから再度開き、Cell コンテキスト メニューの変更内容を確認します。Cell コンテキスト メニューは、図 2 に示すメニューのようになります。

図 2. カスタマイズされた Cell のコンテキスト メニュー

カスタマイズされたセルのコンテキスト メニュー

リボン拡張機能を使用してコントロールをセルのコンテキスト メニューに追加する

次の例では、上で説明した例と同じボタンとサブメニューを作成します。今度は、Excel 2010 で RibbonX を使用してコントロールを作成します。このオプションは、Excel 97 ~ Excel 2007 では利用できません。

注意

Custom UI Editor と RibbonX を使用した Microsoft Office Fluent UI のカスタマイズの詳細については、Ron のリボンの Web サイトを参照してください。

Excel 2010 の改ページ プレビュー モードの Cell コンテキスト メニューは、通常の Cell コンテキスト メニューとは異なる ID を持っています。この記事で後述する Microsoft アドインを使用して、これやその他のコンテキスト メニューの ID を調べることができます。

コンテキスト メニューにコントロールを追加するために XML を追加するには

  1. Excel 2010 で新しいブックを開き、マクロ有効ブック (.xlsm) として保存します。

  2. ブックを閉じます。

  3. Custom UI Editor でブックを開き (詳細は前述の注を参照)、[挿入] をクリックして、[Office 2010 のカスタム UI のパーツ] をクリックします。

  4. [Office 2010 のカスタム UI のパーツ] ウィンドウに次の XML を挿入します。

    <customUI xmlns="http://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 で次の 4 つのマクロを一般的なモジュールにコピーするか入力し、ブックを保存します。

    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. ブックでテキストを含むセルを右クリックして、Cell コンテキスト メニューが変更されたことを確認します。

  9. コンテキスト メニューの上部にある大文字と小文字を変更するオプションを選択し、セルのテキストにどのように影響するのか確認します。

注意

ブックを閉じると、追加したすべてのコントロールが Cell コンテキスト メニューから削除されます。ただし、現在のブックで別のブックを開くと、以前 Cell に追加した組み込みの [保存] ボタンは削除されません。これは、組み込みコントロールをコンテキスト メニューに追加するときの問題です。これが問題になる場合は、組み込みコントロールの代わりに、組み込みの [保存] コマンドを実行するマクロを呼び出すカスタム ボタンを挿入できます。

組み込みコマンドを使用するカスタム ボタンを追加するには、ステートメント <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 UI であらゆる組み込みコントロールを実行することができます。

VBA コードまたはリボン拡張機能を使用してセルのコンテキスト メニューに動的メニューを追加する

動的メニューは、実行時にメニューを作成するコールバック プロシージャを指します。dynamicMenu コントロールには、GetContent コールバック プロシージャを指す getContent 属性が含まれます。

以下は、Cell コンテキスト メニューに動的メニューを作成する RibbonX XML です。

<customUI xmlns="http://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 コードは、2 つのボタンを持つ動的メニューを実行時に作成します。つまり、コンテキスト メニューのメニュー コントロールがクリックされるまで、これは作成されません。

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

    xml = "<menu http://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 で使用する地域の言語、またはアクティブなセルの値 (式、空、数値、テキスト) の値に基づいて Cell コンテキスト メニューに動的メニューを追加する 3 つのサンプル ブックをダウンロードできます。関連するブックの例に関するすべての情報の調査と、3 つのブックのダウンロードを、Ron の Web サイト から行えます。

コンテキスト メニューのヒントとテクニック

このセクションでは、この記事で示したコードを変更して、プロシージャをより柔軟にする方法を示します。

この記事の冒頭で示した VBA の例で、ブックの Activate および Deactivate イベントを使用してメニューのコントロールを作成および削除するためのマクロを呼び出し、Cell コンテキスト メニューを変更する方法を確認しました。

次の例では、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

別の例として、Activate の Excel で地域の言語をチェックして、ユーザーの言語でコンテキスト メニューのメニュー キャプションを作成できます。次の例では、オランダ語またはドイツ語のユーザーがブックを開くと、ユーザーのコンピューターの地域の言語の設定に応じて、別のマクロが呼び出されます。

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

注意

各国語の問題の詳細については、Ron de Bruin の Web サイト の Excel の各国語の問題に関する Web ページを参照してください。

次の VBA ステートメントは、Excel 97 ~ Excel 2010 の Cell コンテキスト メニューでコメント [挿入] のコントロールを有効または無効にする方法を示しています。 Application.CommandBars("Cell").FindControl(ID:=2031).Enabled = False

注意

この記事の最後で説明するアドインは、コンテキスト メニューの各コントロールの ID を検索する方法を示しています。

また、次のようなマクロを使用して、キャプションに ID を追加することもできます。Cell コンテキスト メニューは、すべてのバージョンの 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 イベントを使用して、コントロールを無効および有効にできます。

Cell コンテキスト メニューで RibbonX を使用して [削除] コントロールを無効にするには、この記事の「リボン拡張機能を使用してコントロールをセルのコンテキスト メニューに追加する」セクションで示した XML のステートメント contextMenu に <button idMso="CellsDelete" enabled="false" /> を追加します。

このステートメントでわかるように、コンテキスト メニューのコントロールを無効にするには、コントロールの ID (idMso) を知っている必要があります。ただし、この情報を特定のコンテキスト メニューのすべてのコントロールで入手できるわけではないため、これが問題になることがあります。たとえば、これは Cell、 Row、およびColumn コンテキスト メニューに当てはまります。一見すると、RibbonX でサポートされるコントロール ID のリストが存在しないように思えます。前のセクションの説明と同じように、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

VBA を使用してコンテキスト メニューを変更するときには、ほぼすべてのコンテキスト メニューの各コントロールのコントロール ID と コントロール画像 FaceIds を示した、以下のファイルへのリンクを使用します。

  • Jim Rech の BtnFace アドインを使用して、次の Web ページ ですべてのコントロールの画像 FaceId を検索できます。

  • コントロール ID とコントロール画像 ID を検索するには、Ole P. Erlandsen の次の Web ページ にアクセスしてください。

  • John Walkenbach の Web ページ にアクセスして、すべてのコントロール画像の ID を調べてください。

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 を使用して Shapes や Picture などのいくつかのコンテキスト メニューを変更することはできません。また、RibbonX を使用してコンテキスト メニューを変更することはできません。

  • Excel 2010 では、VBA コードを使用してほとんどすべてのコンテキスト メニューにコントロールを追加できます。VBA を使用したいくつかのコンテキスト メニューの変更には、Excel 2007 と同じ制限があります。また、RibbonX を使用してすべてのコンテキスト メニューにボタンとメニューを追加できますが、コントロールを無効にする場合や再利用する場合は、正しい ID (idMso) が見つからない可能性があります。

その他の技術情報

この記事で説明する主題について、以下の場所で詳細を確認できます。