【VBA】右クリックメニューに独自のマクロを追加する方法(コピペOK)

VBA
スポンサーリンク
スポンサーリンク
  1. この記事でわかること
  2. どんな場面で使う?
  3. 完成イメージ(Before / After)
  4. 実行前の準備
    1. バックアップを取る
    2. Excelをマクロ有効ブック(.xlsm)で保存する
  5. 手順(コピペ → 実行まで約5分)
    1. VBE(コードを書く画面)を開く
    2. 標準モジュールを挿入する
    3. コードを貼り付けて実行する
  6. コード(基本版)– 右クリックメニューに1項目追加
    1. 書き換えポイント
    2. コードの処理フロー解説
  7. コード(実務版)– 複数メニュー+ブック開閉時の自動追加/削除
    1. ① 標準モジュールに貼るコード(メニュー追加/削除/実行対象)
    2. ② ThisWorkbookに貼るコード(自動追加/自動削除)
    3. 書き換えポイント
    4. コードの処理フロー解説(実務版)
  8. よくある落とし穴5選
    1. 1. メニューが増殖する(同じ項目が複数表示される)
    2. 2. 右クリックメニューの変更が他のブックにも反映される
    3. 3. Excelが異常終了してメニューが残る
    4. 4. OnActionのマクロ名が見つからないエラー
    5. 5. CommandBars(“Cell”).Resetで他のカスタマイズまで消える
    6. 6. 保護されたブック(SharedWorkbook)で右クリックメニューが動作しない
    7. VBAで右クリックメニューに追加した項目が表示されないときの対処法
    8. VBAでCommandBars Resetを実行しても右クリックメニューが元に戻らないときの対処法
  9. FAQ
    1. Q1: 右クリックメニューのどの位置に項目を追加できる?
    2. Q2: 区切り線(セパレーター)を入れるには?
    3. Q3: セル以外の右クリックメニュー(行ヘッダー、列ヘッダーなど)もカスタマイズできる?
    4. Q4: FaceId(アイコン番号)の一覧はどこで確認できる?
    5. Q5: 個人用マクロブック(PERSONAL.xlsb)に入れたマクロも右クリックメニューから呼べる?
  10. まとめ
    1. 関連記事
  11. 次にやりたくなること

この記事でわかること

  • セルの右クリックメニューに独自のマクロ項目を追加できる
  • 追加したメニューをクリックするとマクロが実行される
  • ブックを開いたとき自動追加、閉じたとき自動削除する実務的な運用ができる

対象: 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 のままだとマクロが保存できない。

  1. 「ファイル」→「名前を付けて保存」
  2. ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
  3. 保存

手順(コピペ → 実行まで約5分)

VBE(コードを書く画面)を開く

  1. Excelで Alt + F11 を押す

標準モジュールを挿入する

  1. VBEのメニュー →「挿入」→「標準モジュール」

コードを貼り付けて実行する

  1. コードウィンドウに、下の「基本版」コードをそのままコピペする
  2. Alt + F8AddCustomMenu を選んで「実行」
  3. セルを右クリックして、メニューの末尾に「売上集計を実行」が表示されれば成功
  4. 項目をクリックして、マクロが実行されることを確認

コード(基本版)– 右クリックメニューに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つの処理ブロックで構成されている。

  1. メニューオブジェクトの取得CommandBars("Cell") でセルの右クリックメニューを取得する。なぜ "Cell" なのかというと、Excelの右クリックメニューはセル・行ヘッダー・列ヘッダーなど対象ごとに別オブジェクトとして管理されているため。セルを右クリックしたときに表示されるメニューが "Cell" に対応する。
  1. 既存項目の削除(増殖防止)On Error Resume Next で囲んで同名の項目を削除している。なぜ On Error Resume Next が必要かというと、初回実行時は削除対象の項目がまだ存在しないのでエラーが出るため。エラーを無視して「なければスキップ、あれば削除」という安全な動きにしている。この On Error Resume Next の使い方は エラー処理(On Error)で止まらないマクロを作る方法 で詳しく解説している。
  1. 新規項目の追加と設定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つの点が進化している。

  1. サブメニュー(ポップアップ)の活用msoControlPopup で親メニュー項目を作り、その中に子項目を追加している。なぜサブメニューにするかというと、複数のマクロを右クリックメニューに直接並べるとメニューが長くなりすぎて使いにくいため。「業務ツール」という1つの親項目の下にまとめることで、メニューがスッキリする。
  1. ブック名付きのOnAction指定.OnAction = ThisWorkbook.Name & "!マクロ名" と書いている。なぜブック名を付けるかというと、複数のブックが開いている状態で同名のマクロが存在すると、意図しないブックのマクロが実行される可能性があるため。ブック名を明示することで確実に「このブック」のマクロを呼べる。
  1. 破壊的操作の確認ダイアログMyClearData のように元に戻せない操作には vbYesNo + vbExclamation で確認を挟んでいる。右クリックメニューはワンクリックで実行されるので、誤操作のリスクが高い。MsgBox の使い方については MsgBoxの使い方 も参照。

ポイント: .OnActionThisWorkbook.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.AddBefore パラメータで位置を指定できる。


' メニューの先頭に追加する場合
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 の自動化まで組み込むのがおすすめの進め方。ボタン設置やショートカットキーと組み合わせれば、マクロの実行手段を複数用意できて、状況に応じた最速の操作ができるようになる。

関連記事

次にやりたくなること

コメント

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