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.AddのBefore:=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:=TrueとWorkbook_Open/Workbook_BeforeCloseをセットで使うことで、メニューの残留を防げる
配布用の業務ツールに組み込めば、ユーザーがマクロ一覧から探す手間なく、直感的にマクロを実行できるようになります。ぜひ活用してみてください。

コメント