【ExcelVBA・マクロ】CommandBarsの使い方|右クリックメニュー(コンテキストメニュー)をカスタマイズする方法【コピペOK】

ExcelVBA

Excelでセルを右クリックしたときに表示されるメニューに、自分専用の項目を追加できることをご存じでしょうか。VBAのCommandBarsオブジェクトを使えば、右クリックメニュー(コンテキストメニュー)に独自のマクロ実行ボタンを追加したり、逆に不要な標準項目を非表示にしたりできます。

この記事では、CommandBarsを使ったセル右クリックメニューのカスタマイズ方法を、追加・削除・複数条件での表示制御まで、実務でそのまま使えるコード付きで解説します。

スポンサーリンク
スポンサーリンク

CommandBarsとは

CommandBarsは、Excelのツールバーやショートカットメニュー(右クリックメニュー)を操作するためのオブジェクトです。セルを右クリックしたときのメニューは、"Cell"という名前のCommandBarとして管理されています。

Application.CommandBars("Cell")

このオブジェクトのControlsコレクションに項目(ボタン)を追加することで、右クリックメニューに独自のメニュー項目を表示できます。

右クリックメニューに項目を追加する

セルの右クリックメニューの先頭に、「選択範囲を合計してメッセージ表示」というメニュー項目を追加する例です。

Sub AddCustomMenu()
    Dim cbCell As CommandBar
    Dim ctrl As CommandBarControl

    Set cbCell = Application.CommandBars("Cell")

    ' 既に同名の項目があれば一度削除してから追加する(重複防止)
    On Error Resume Next
    cbCell.Controls("選択範囲を合計").Delete
    On Error GoTo 0

    Set ctrl = cbCell.Controls.Add(Type:=msoControlButton, Before:=1, Temporary:=True)
    With ctrl
        .Caption = "選択範囲を合計"
        .OnAction = "ShowSelectionSum"
        .FaceId = 162
    End With
End Sub

Sub ShowSelectionSum()
    Dim total As Double
    total = Application.WorksheetFunction.Sum(Selection)
    MsgBox "選択範囲の合計は " & total & " です。", vbInformation
End Sub
  • Controls.AddBefore:=1で、メニューの一番上に項目を追加しています
  • Temporary:=Trueを指定すると、Excelを終了したときに自動的に削除されるため、ブックを閉じ忘れによるメニューの残留を防げます
  • OnActionに実行したいマクロ名を文字列で指定します
  • FaceIdはメニューに表示するアイコン番号です(省略も可能)

AddCustomMenuを一度実行すれば、以降セルを右クリックするたびにメニューの先頭に「選択範囲を合計」という項目が表示されます。

追加した項目を削除する

カスタマイズしたメニュー項目は、Deleteメソッドで削除できます。ブックを閉じるタイミングで削除しておくと、他のブックの右クリックメニューに影響が残りません。

Sub RemoveCustomMenu()
    On Error Resume Next
    Application.CommandBars("Cell").Controls("選択範囲を合計").Delete
    On Error GoTo 0
End Sub

On Error Resume Nextを挟んでいるのは、対象の項目が存在しない状態でDeleteを呼んでもエラーで処理が止まらないようにするためです。

ブックの開閉に合わせて自動登録・自動削除する

ThisWorkbookモジュールに以下のコードを書いておくと、ブックを開いたときにメニューを追加し、閉じたときに自動で削除できます。

Private Sub Workbook_Open()
    AddCustomMenu
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    RemoveCustomMenu
End Sub

このパターンにしておけば、Temporary:=Trueと合わせて二重の安全策となり、メニューの消し忘れをほぼ防ぐことができます。

標準の項目を非表示にする

特定の業務フローで誤操作を防ぎたい場合、標準メニュー項目を一時的に非表示にすることもできます。例えば「切り取り」を非表示にする場合は次のように書きます。

Sub HideCutMenu()
    Application.CommandBars("Cell").Controls("切り取り(&T)").Visible = False
End Sub

Sub ShowCutMenu()
    Application.CommandBars("Cell").Controls("切り取り(&T)").Visible = True
End Sub

標準項目のキャプションはExcelの表示言語によって変わるため、日本語版と英語版が混在する環境では、キャプション文字列ではなくIDプロパティで指定する方法も検討してください。

サブメニュー(区切り線・複数項目)を追加する

複数の項目を追加したい場合や、標準メニューとの見分けをつけたい場合は、区切り線(セパレーター)を併用すると見やすくなります。

Sub AddMultipleMenuItems()
    Dim cbCell As CommandBar
    Dim ctrl As CommandBarControl

    Set cbCell = Application.CommandBars("Cell")

    Set ctrl = cbCell.Controls.Add(Type:=msoControlButton, Before:=1, Temporary:=True)
    With ctrl
        .Caption = "選択範囲を合計"
        .OnAction = "ShowSelectionSum"
        .BeginGroup = True ' このボタンの上に区切り線を表示
    End With

    Set ctrl = cbCell.Controls.Add(Type:=msoControlButton, Before:=2, Temporary:=True)
    With ctrl
        .Caption = "選択範囲をクリア"
        .OnAction = "ClearSelectionValues"
    End With
End Sub

Sub ClearSelectionValues()
    Selection.ClearContents
End Sub

BeginGroup = Trueを指定すると、そのボタンの直前に区切り線が挿入され、標準メニューとカスタム項目を視覚的に分けることができます。

まとめ

CommandBarsを使うと、セルの右クリックメニューに自分だけの機能を追加したり、逆に業務上不要な標準機能を非表示にしたりと、Excelの操作性を自由にカスタマイズできます。

  • 右クリックメニューはApplication.CommandBars("Cell")で操作する
  • Controls.Addで項目追加、Deleteで項目削除、Visibleで表示・非表示を切り替える
  • Temporary:=TrueWorkbook_OpenWorkbook_BeforeCloseをセットで使うことで、メニューの残留を防げる

配布用の業務ツールに組み込めば、ユーザーがマクロ一覧から探す手間なく、直感的にマクロを実行できるようになります。ぜひ活用してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました