この記事でわかること
- セルの右クリックメニューに独自のマクロ項目を追加できる
- 追加したメニューをクリックするとマクロが実行される
- ブックを開いたとき自動追加、閉じたとき自動削除する実務的な運用ができる
対象: Excel 2016以降 / Microsoft 365、Windows 10/11
—
どんな場面で使う?
- 頻繁に使うマクロへのアクセスを高速化 — Alt+F8でマクロ一覧を開いて選ぶ手順が面倒なとき、右クリック1回で即実行できるようにしたい場合
- チーム共有ブックの操作を統一 — 「このブックではこの操作をする」というメニューを右クリックに集約すれば、チームメンバーがマクロ名を覚えなくても使える
- マクロ実行のボタンを置く場所がないとき — シート上にボタンを設置するとレイアウトが崩れる帳票系のブックで、見た目を汚さずにマクロ実行手段を提供できる
- 複数の業務マクロをサブメニューで整理 — 「売上集計」「月次レポート」「データクリア」のように、関連マクロをグループ化して1つのサブメニューにまとめたい場合
- ブック固有の操作をブックに紐づけたい — ブックを開いたら自動でメニューが追加され、閉じたら自動で消える運用にすれば、他のブックに影響を与えない
—
完成イメージ(Before / After)
Before: セルを右クリック → 標準メニューのみ表示される。マクロを実行するにはAlt+F8で一覧を開く必要がある。
After: セルを右クリック → メニューの末尾に区切り線と「売上集計を実行」などの独自項目が表示される → クリックするとマクロが即実行される。
—
以前はマクロを実行するたびにAlt+F8を押して一覧から選んでいた。頻繁に使うマクロほど、このワンクッションが地味にストレスだった。右クリックメニューに追加してからは、セルを選んで右クリック→ワンクリックで完了。作業のテンポが全然変わった。同じ「あと一歩の不便」を感じている人が、この記事でサクッと解消できればうれしい。
右クリックメニューのカスタマイズには
CommandBars("Cell")を使う。コピペで追加、コピペで削除できる。
マクロの実行手段にはボタンやショートカットキーもある。ボタンで実行する方法は マクロをボタン1つで実行する方法 を参照。
—
実行前の準備
バックアップを取る
右クリックメニューの変更はExcel全体に影響する(開いている他のブックにも表示される)。必ずファイルのコピーを別フォルダに保存してから実行する。
Excelをマクロ有効ブック(.xlsm)で保存する
拡張子が .xlsx のままだとマクロが保存できない。
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
- 保存
—
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
- Excelで
Alt + F11を押す
標準モジュールを挿入する
- VBEのメニュー →「挿入」→「標準モジュール」
コードを貼り付けて実行する
- コードウィンドウに、下の「基本版」コードをそのままコピペする
Alt + F8→AddCustomMenuを選んで「実行」- セルを右クリックして、メニューの末尾に「売上集計を実行」が表示されれば成功
- 項目をクリックして、マクロが実行されることを確認
—
コード(基本版)– 右クリックメニューに1項目追加
セルの右クリックメニューに「売上集計を実行」という項目を1つ追加する。クリックすると MySalesTotal マクロが実行される。
Option Explicit
'============================================================
' ■ 右クリックメニューに独自マクロを追加(基本版)
' → セルの右クリックメニューに1項目追加
' → 貼り付け場所: 標準モジュール
'============================================================
Sub AddCustomMenu()
Dim menuBar As CommandBar
Set menuBar = CommandBars("Cell") '← セルの右クリックメニュー
'--- 同名の既存項目を先に削除(増殖防止)
On Error Resume Next
menuBar.Controls("売上集計を実行").Delete
On Error GoTo 0
'--- 新しいメニュー項目を追加
Dim newBtn As CommandBarButton
Set newBtn = menuBar.Controls.Add(Type:=msoControlButton)
With newBtn
.Caption = "売上集計を実行" '← メニューに表示されるテキスト
.OnAction = "MySalesTotal" '← クリック時に実行するマクロ名
.BeginGroup = True '← 区切り線を表示
.FaceId = 494 '← アイコン(電卓)
End With
MsgBox "右クリックメニューに「売上集計を実行」を追加しました。", vbInformation
End Sub
'============================================================
' ■ 右クリックメニューから独自項目を削除
'============================================================
Sub RemoveCustomMenu()
On Error Resume Next
CommandBars("Cell").Controls("売上集計を実行").Delete
On Error GoTo 0
MsgBox "右クリックメニューから「売上集計を実行」を削除しました。", vbInformation
End Sub
'============================================================
' ■ 右クリックメニューから呼ばれるマクロ本体(サンプル)
' → 実務では自分の処理に書き換える
'============================================================
Sub MySalesTotal()
MsgBox "売上集計マクロが実行されました。" & vbCrLf & _
"ここに実際の処理を書いてください。", vbInformation
End Sub
書き換えポイント
| 項目 | 説明 | 初期値 |
|---|---|---|
"売上集計を実行" |
メニューに表示されるテキスト | 自分の処理名に変更 |
"MySalesTotal" |
クリック時に実行されるマクロ名 | 自分のマクロ名に変更 |
.FaceId = 494 |
アイコン番号 | 省略可。好みのアイコンに変更 |
.BeginGroup = True |
区切り線の表示 | False にすると区切り線なし |
コードの処理フロー解説
基本版のコードは3つの処理ブロックで構成されている。
- メニューオブジェクトの取得 —
CommandBars("Cell")でセルの右クリックメニューを取得する。なぜ"Cell"なのかというと、Excelの右クリックメニューはセル・行ヘッダー・列ヘッダーなど対象ごとに別オブジェクトとして管理されているため。セルを右クリックしたときに表示されるメニューが"Cell"に対応する。
- 既存項目の削除(増殖防止) —
On Error Resume Nextで囲んで同名の項目を削除している。なぜOn Error Resume Nextが必要かというと、初回実行時は削除対象の項目がまだ存在しないのでエラーが出るため。エラーを無視して「なければスキップ、あれば削除」という安全な動きにしている。このOn Error Resume Nextの使い方は エラー処理(On Error)で止まらないマクロを作る方法 で詳しく解説している。
- 新規項目の追加と設定 —
Controls.Addでメニュー項目を追加し、Withブロックで表示名・実行マクロ・区切り線・アイコンを一括設定する。.OnActionにはマクロ名を文字列で指定するので、Subプロシージャ名と完全一致させる必要がある。タイポがあると実行時に「マクロが見つかりません」エラーになるので注意。
ポイント: AddCustomMenu を実行するたびに「先に削除→追加」を行うので、何度実行しても項目が増殖しない。この「削除してから追加」のパターンが重要。
—
コード(実務版)– 複数メニュー+ブック開閉時の自動追加/削除
ブックを開いたときに自動でメニューを追加し、閉じたときに自動で削除する。チームで共有するブックに最適な運用パターン。
ブックを開いたときに自動でメニューが追加され、閉じたときに消えるようにしてからは、チームで共有しているブックでも「何このメニュー?」と聞かれることがなくなった。運用が格段にラクになる。
2つの場所にコードを貼る必要がある。
① 標準モジュールに貼るコード(メニュー追加/削除/実行対象)
※ 右クリックメニューはExcel全体に影響します。追加した項目は必ず削除してください。
Option Explicit
'============================================================
' ■ 右クリックメニューに複数の独自マクロを追加(実務版)
' → 貼り付け場所: 標準モジュール
'============================================================
'--- ★書き換えポイント: サブメニューの親項目名 ---
Private Const MENU_GROUP_CAPTION As String = "業務ツール"
Sub AddCustomMenuItems()
Dim cellMenu As CommandBar
Set cellMenu = CommandBars("Cell")
'--- 既存の独自メニューを先に削除(増殖防止)
Call RemoveCustomMenuItems
'--- サブメニュー(ポップアップ)を追加
Dim popup As CommandBarPopup
Set popup = cellMenu.Controls.Add(Type:=msoControlPopup)
With popup
.Caption = MENU_GROUP_CAPTION '← サブメニューの親項目名
.BeginGroup = True '← 区切り線を表示
End With
'--- サブメニュー内に項目を追加
Dim btn1 As CommandBarButton
Set btn1 = popup.Controls.Add(Type:=msoControlButton)
With btn1
.Caption = "売上集計を実行"
.OnAction = ThisWorkbook.Name & "!MySalesTotal" '← ブック名付きで指定
.FaceId = 494
End With
Dim btn2 As CommandBarButton
Set btn2 = popup.Controls.Add(Type:=msoControlButton)
With btn2
.Caption = "月次レポート出力"
.OnAction = ThisWorkbook.Name & "!MyMonthlyReport"
.FaceId = 352
End With
Dim btn3 As CommandBarButton
Set btn3 = popup.Controls.Add(Type:=msoControlButton)
With btn3
.Caption = "データクリア"
.OnAction = ThisWorkbook.Name & "!MyClearData"
.FaceId = 67
End With
End Sub
'============================================================
' ■ 独自メニューを一括削除
'============================================================
Sub RemoveCustomMenuItems()
Dim cellMenu As CommandBar
Set cellMenu = CommandBars("Cell")
On Error Resume Next
cellMenu.Controls(MENU_GROUP_CAPTION).Delete
On Error GoTo 0
End Sub
'============================================================
' ■ メニューから呼ばれるマクロ本体(サンプル)
' → 実務では自分の処理に書き換える
'============================================================
Sub MySalesTotal()
MsgBox "売上集計を実行しました。", vbInformation
End Sub
Sub MyMonthlyReport()
MsgBox "月次レポートを出力しました。", vbInformation
End Sub
Sub MyClearData()
'--- 破壊的操作のため確認ダイアログを出す
' 実務では先にバックアップ処理を入れること
Dim ans As VbMsgBoxResult
ans = MsgBox("データをクリアしますか?" & vbCrLf & _
"※ この操作は元に戻せません。", vbYesNo + vbExclamation)
If ans = vbYes Then
MsgBox "データをクリアしました。", vbInformation
Else
MsgBox "キャンセルしました。", vbInformation
End If
End Sub
② ThisWorkbookに貼るコード(自動追加/自動削除)
VBEの左側ツリーで「ThisWorkbook」をダブルクリックしてコードウィンドウを開き、以下を貼り付ける。
ブックイベントの仕組みについては ブックを開いたとき・保存時に自動実行するイベント処理の方法 で詳しく解説している。
'============================================================
' ■ ブックを開いたとき → メニューを自動追加
' → 貼り付け場所: ThisWorkbook
'============================================================
Private Sub Workbook_Open()
Call AddCustomMenuItems
End Sub
'============================================================
' ■ ブックを閉じるとき → メニューを自動削除
'============================================================
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call RemoveCustomMenuItems
End Sub
書き換えポイント
| 項目 | 説明 | 初期値 |
|---|---|---|
MENU_GROUP_CAPTION |
サブメニューの親項目名 | "業務ツール" |
各 .Caption |
メニュー項目の表示名 | 自分の処理名に変更 |
各 .OnAction |
クリック時に実行するマクロ名 | 自分のマクロ名に変更 |
各 .FaceId |
アイコン番号 | 好みのアイコンに変更 |
コードの処理フロー解説(実務版)
実務版は基本版と比べて3つの点が進化している。
- サブメニュー(ポップアップ)の活用 —
msoControlPopupで親メニュー項目を作り、その中に子項目を追加している。なぜサブメニューにするかというと、複数のマクロを右クリックメニューに直接並べるとメニューが長くなりすぎて使いにくいため。「業務ツール」という1つの親項目の下にまとめることで、メニューがスッキリする。
- ブック名付きのOnAction指定 —
.OnAction = ThisWorkbook.Name & "!マクロ名"と書いている。なぜブック名を付けるかというと、複数のブックが開いている状態で同名のマクロが存在すると、意図しないブックのマクロが実行される可能性があるため。ブック名を明示することで確実に「このブック」のマクロを呼べる。
- 破壊的操作の確認ダイアログ —
MyClearDataのように元に戻せない操作にはvbYesNo + vbExclamationで確認を挟んでいる。右クリックメニューはワンクリックで実行されるので、誤操作のリスクが高い。MsgBoxの使い方については MsgBoxの使い方 も参照。
ポイント: .OnAction に ThisWorkbook.Name & "!マクロ名" と書くことで、同名のマクロが別のブックにあっても、このブックのマクロが確実に呼ばれる。
マクロ呼び出しの設計については マクロから別のマクロを呼び出して処理を分割する方法 も参考になる。
—
よくある落とし穴5選
1. メニューが増殖する(同じ項目が複数表示される)
自分もこれでやらかした。テスト中にAddCustomMenuを何度も実行して、右クリックメニューに「売上集計を実行」が10個並んだことがある。同僚に見られて恥ずかしかった。
原因: Controls.Add は重複チェックをしない。実行するたびに同名の項目が追加される。
対策: 追加前に既存の同名項目を削除する。上のコード例のように「削除→追加」の順にする。
' NG: 追加だけ(何度も実行すると増殖する)
Set newBtn = CommandBars("Cell").Controls.Add(Type:=msoControlButton)
' OK: 先に削除してから追加(増殖しない)
On Error Resume Next
CommandBars("Cell").Controls("売上集計を実行").Delete
On Error GoTo 0
Set newBtn = CommandBars("Cell").Controls.Add(Type:=msoControlButton)
2. 右クリックメニューの変更が他のブックにも反映される
原因: CommandBars("Cell") はExcelアプリケーション全体のメニュー。ブック単位ではなくExcel単位で管理されている。
対策: Workbook_BeforeClose でメニューを削除する。ブックを閉じれば元に戻る。
3. Excelが異常終了してメニューが残る
原因: フリーズや強制終了で Workbook_BeforeClose が発火しないと、メニューが残り続ける。
対策: AddCustomMenuItems の中で「追加前に既存を削除」するパターンを入れておく。次回ブックを開いたときに自動でリセットされる。どうしても消えない場合は以下を実行する。
' 右クリックメニューを初期状態に完全リセット
' ※ 他のアドインのカスタマイズも消えるので注意
CommandBars("Cell").Reset
4. OnActionのマクロ名が見つからないエラー
原因: .OnAction = "MySalesTotal" とだけ書くと、マクロが見つからない場合にエラーになる。特にブックを閉じた後にメニューが残っている場合に発生する。
対策: .OnAction = ThisWorkbook.Name & "!MySalesTotal" のようにブック名付きで指定する。
5. CommandBars(“Cell”).Resetで他のカスタマイズまで消える
原因: Reset はメニュー全体を初期状態に戻す。自分の項目だけでなく、他のアドインが追加した項目もすべて消える。
対策: Reset は最終手段。通常は Controls("項目名").Delete で個別に削除する。
6. 保護されたブック(SharedWorkbook)で右クリックメニューが動作しない
原因: 共有ブック設定が有効になっていると、VBAからのCommandBars操作が制限される場合がある。
対策: ブックの共有を一旦解除してからメニューを追加する。または、メニュー追加処理を個人用マクロブック(PERSONAL.xlsb)に移動する。
エラー処理の基本パターンは エラー処理(On Error)で止まらないマクロを作る方法 を参照。
VBAで右クリックメニューに追加した項目が表示されないときの対処法
「AddCustomMenuを実行したのに右クリックメニューに項目が出てこない」という場合、原因はコードが CommandBars("Cell") ではなく別のCommandBars名を指定しているか、マクロの実行がエラーで途中終了していることが多い。まず CommandBars("Cell").Controls.Count をイミディエイトウィンドウで確認し、項目数が増えているかチェックする。増えていなければ On Error Resume Next の直後で .Delete がエラーを出してそのまま処理が終わっている可能性があるので、On Error GoTo 0 の位置を確認する。自分も最初、On Error Resume Next の範囲が広すぎて .Add のエラーまで握りつぶしていたことがある。
VBAでCommandBars Resetを実行しても右クリックメニューが元に戻らないときの対処法
「CommandBars("Cell").Reset を実行したのに、追加した項目がまだ残っている」という場合、原因は Workbook_Open イベントでメニューを再追加しているブックが開いたままであることだ。Resetした直後に Workbook_Open が走ると、削除したメニューが即座に復活してしまう。対策として、まず該当ブックを閉じてからResetを実行する。または、該当ブックの Workbook_Open 内の Call AddCustomMenuItems を一時的にコメントアウトしてからResetする。どうしても消えない場合はExcelを完全に終了してから再起動すると初期状態に戻る。
—
FAQ
Q1: 右クリックメニューのどの位置に項目を追加できる?
.Controls.Add の Before パラメータで位置を指定できる。
' メニューの先頭に追加する場合
Set newBtn = CommandBars("Cell").Controls.Add(Type:=msoControlButton, Before:=1)
' 省略すると末尾に追加される(これが一般的)
Set newBtn = CommandBars("Cell").Controls.Add(Type:=msoControlButton)
Q2: 区切り線(セパレーター)を入れるには?
追加したコントロールの .BeginGroup = True を設定すると、その項目の上に区切り線が表示される。
newBtn.BeginGroup = True '← この項目の上に区切り線が入る
Q3: セル以外の右クリックメニュー(行ヘッダー、列ヘッダーなど)もカスタマイズできる?
できる。対象に応じてCommandBarsの名前を変える。
| 対象 | CommandBars名 |
|---|---|
| セル | "Cell" |
| 行ヘッダー | "Row" |
| 列ヘッダー | "Column" |
| シート見出し | "Ply" |
Q4: FaceId(アイコン番号)の一覧はどこで確認できる?
VBAで以下のコードを実行すると、アイコン番号の一覧を確認できる。FaceIdは1〜数千まであり、Excel/Officeのバージョンによって異なる場合がある。
※ 新しい空白シートで実行してください。既存データが上書きされます。
Sub ShowFaceIds()
Dim i As Long
For i = 1 To 300
Cells((i - 1) Mod 50 + 1, Int((i - 1) / 50) * 2 + 1).Value = i
Cells((i - 1) Mod 50 + 1, Int((i - 1) / 50) * 2 + 2).Value = "FaceId=" & i
Next i
MsgBox "FaceId 1〜300 をシートに出力しました。", vbInformation
End Sub
自分も最初はFaceIdの番号がわからず、適当に数字を入れて試していた。上のコードで一覧を出してからはすぐ選べるようになった。
Q5: 個人用マクロブック(PERSONAL.xlsb)に入れたマクロも右クリックメニューから呼べる?
呼べる。.OnAction = "PERSONAL.XLSB!マクロ名" と指定すればよい。ただし、PERSONAL.xlsbが開いていない環境では「マクロが見つかりません」エラーになるので注意。
—
まとめ
- CommandBars(“Cell”) がセルの右クリックメニューのオブジェクト
.Controls.Addでメニュー項目を追加、.OnActionでマクロを紐づける- 増殖防止: 追加前に既存項目を削除する(「削除→追加」のパターン)
- 実務運用:
Workbook_Openで自動追加、Workbook_BeforeCloseで自動削除 - ブック名付き指定:
.OnAction = ThisWorkbook.Name & "!マクロ名"で安全に呼び出す
右クリックメニューのカスタマイズは、地味だけど日常業務の効率を着実に上げてくれる機能。自分は頻繁に使うマクロほど右クリックメニューに入れるようにしていて、毎日の作業で数十秒ずつ短縮できている。まずは基本版で1つメニューを追加してみて、動作を確認したら実務版で Workbook_Open / Workbook_BeforeClose の自動化まで組み込むのがおすすめの進め方。ボタン設置やショートカットキーと組み合わせれば、マクロの実行手段を複数用意できて、状況に応じた最速の操作ができるようになる。
関連記事
- マクロをボタン1つで実行する方法 — ボタン設置による実行手段。右クリックメニューと使い分けると便利
- マクロにショートカットキーを割り当てて素早く実行する方法 — もう1つの時短テクニック。キーボード派はこちら
- ブックを開いたとき・保存時に自動実行するイベント処理の方法 — Workbook_Open/BeforeCloseの仕組みを詳しく
- マクロから別のマクロを呼び出して処理を分割する方法 — OnActionで呼ぶSubの設計方法
- エラー処理(On Error)で止まらないマクロを作る方法 — メニュー操作時のOn Error Resume Nextの使い方
—
次にやりたくなること
- マクロにショートカットキーを割り当てて素早く実行する方法: 右クリックメニューに加えて、キーボードからも一発で呼び出したい場合に。Application.OnKeyでショートカットを設定できる
- ブックを開いたとき・保存時に自動実行するイベント処理の方法: メニューの自動追加/削除以外にも、ブックを開いたときに実行したい処理がある場合に。Workbook_Openの活用パターンを紹介


コメント