【コピペでOK!】右クリックメニューを追加/無効するマクロ

アイキャッチ

セルの右クリックメニューを改造するマクロです。全部で6パターン載せているのでコピペしてお好みの挙動になるよう改造して下さい。

右クリックメニュー改造
  1. 特定のシート(指定したシート)で右クリックメニューを追加
  2. サブメニュー(多段メニュー)を追加
  3. 複数シートを指定して右クリックメニューを追加
  4. 全シートで右クリックメニューを追加
  5. 右クリックメニューの特定の項目を無効
  6. 右クリックメニューを完全無効(メニューのポップアップなし)
目次

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

このマクロはブックを閉じる時に初めてデフォルトの状態に戻ります。エラーが出て正常にブックを閉じられなかった場合、メニューは追加されたままになるので注意して下さい。もしそうなったらCommandbars(“cell”).Reset等で初期化して下さい。

特定のシートで右クリックメニューを追加

マクロ実行後、メニューが追加されている画像。一番上にメニューが追加されている。

標準モジュール

Private Const メニュー名 As String = "メニュー"      '※1 好きなメニュー名に書き換える

Public Sub 右クリックメニュー追加()
    Dim cb As CommandBar

    For Each cb In CommandBars
        If cb.BuiltIn = True And cb.Name = "Cell" Then
            On Error Resume Next
            cb.Controls(メニュー名).Delete
            With cb.Controls.Add(before:=1, Type:=msoControlButton) 'before:= 表示位置
                .Caption = メニュー名
                .OnAction = "デモ1"        '実行するプロシージャを指定
            End With
        End If
    Next cb
End Sub

Public Sub 追加メニュー削除()
Dim cb As CommandBar
    For Each cb In CommandBars
        If cb.BuiltIn = True And cb.Name = "Cell" Then
            On Error Resume Next
            cb.Controls(メニュー名).Delete
        End If
    Next cb
End Sub

Private Sub デモ1()
MsgBox "嫌な予感がする"
End Sub
  1. 標準モジュールの定数に「追加するメニューの名前」を入力

Bookモジュール(ThisWorkBook)

Private Const シート名 As String = "Sheet1"     '※1 有効にするシートのオブジェクト名

Private Sub Workbook_Open()
    Select Case ActiveSheet.CodeName
    Case シート名
        call 右クリックメニュー追加
    End Select
End Sub

Private Sub Workbook_Deactivate()
    call 追加メニュー削除
End Sub

Private Sub Workbook_SheetActivate(ByVal sh As Object)
    Select Case sh.CodeName
    Case シート名
        call 右クリックメニュー追加
    Case Else
        call 追加メニュー削除
    End Select
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
   call 追加メニュー削除
End Sub
  1. Bookモジュールの定数に追加メニューを有効にするシートの「オブジェクト名」を入力

シートをオブジェクト名で参照しているのはシート名が変わってもマクロを機能させるためです。オブジェクト名ではなくシート名で指定したい場合はCode.Nameの部分を.Nameに変更して下さい。

このコードは追加メニューを右クリックメニューの一番上に表示します。表示位置を変更したい場合、標準モジュール10行目before:=1の数字部分を変更して下さい。

蛇足ですが、このコードは改ページプレビューでも追加メニューが機能します。

サブメニューを追加する

マクロ実行後、追加メニューにサブメニューが2列追加されている。

サブメニュー(2段階メニュー)は以下のコードで実装できます。

標準モジュール

Public Sub 右クリックメニュー追加()
    Dim cb As CommandBar

    For Each cb In Application.CommandBars
        If cb.BuiltIn = True And cb.Name = "Cell" Then
            On Error Resume Next
            cb.Controls(メニュー名).Delete
            With cb.Controls.Add(before:=1, Type:=msoControlPopup)      'Type名 msoControlPopup へ変更
                .Caption = メニュー名
                With .Controls.Add
                    .Caption = "サブメニュー1"      'サブメニュー名
                    .OnAction = "デモ1"
                End With
                With .Controls.Add
                    .Caption = "サブメニュー2"      'サブメニュー名
                    .OnAction = "デモ2"
                End With
            End With
        End If
    Next cb
End Sub

Public Sub 追加メニュー削除()
Dim cb As CommandBar
    For Each cb In CommandBars
        If cb.BuiltIn = True And cb.Name = "Cell" Then
            On Error Resume Next
            cb.Controls(メニュー名).Delete
        End If
    Next cb
End Sub

Private Sub デモ1()
MsgBox "嫌な予感がする"
End Sub

Private Sub デモ2()
MsgBox "いい予感しかしないぜ"
End Sub

Bookモジュールは前項のものをそのまま使用して下さい。

他のシートでも追加右クリックメニュー追加を有効にする

Bookモジュールで定数(Select Caseステートメントの引数)を追加して下さい(Caseの引数は「,」区切りで)。

Bookモジュール(ThisWorkBook)

Private Const シート名1 As String = "Sheet1"
Private Const シート名2 As String = "Sheet2"    '追加

Private Sub Workbook_Open()
    Select Case ActiveSheet.CodeName
    Case シート名1, シート名2    '追加
        call 右クリックメニュー追加
    End Select
End Sub

Private Sub Workbook_Deactivate()
    call 追加メニュー削除
End Sub

Private Sub Workbook_SheetActivate(ByVal sh As Object)
    Select Case sh.CodeName
    Case シート名1, シート名2    '追加
        call 右クリックメニュー追加
    Case Else
        On Error Resume Next
        call 追加メニュー削除
    End Select
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
   call 追加メニュー削除
End Sub

全シートで右クリックメニューを追加

標準モジュールは前項のものをそのまま、Bookモジュールを以下のようにすれば、ファイルを開いた時から閉じるまで全てのシートで追加メニューが有効になります。別のブックがアクティブの時は無効になります。

Bookモジュール(ThisWorkBook)

Private Sub Workbook_Open()
    call 右クリックメニュー追加
End Sub

Private Sub Workbook_Activate()
    call 右クリックメニュー追加
End Sub

Private Sub Workbook_Deactivate()
    call 追加メニュー削除
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
   call 追加メニュー削除
End Sub

右クリックメニューを無効にする

このマクロはブックを閉じる時に初めてデフォルトの状態に戻ります。エラーが出て正常にブックを閉じられなかった場合、メニューは無効のままなので注意して下さい。もしそうなったらCommandbars(“cell”).Reset等で初期化して下さい。

メニューの一部をクリック禁止にしたい場合

マクロ実行後の画像。右クリックメニューがグレーアウトされ無効になっている。

デフォルトのメニューをメニュー名毎に無効(グレーアウト)にします。ブックを開いたときに無効、閉じたときに有効(元に戻す)にするマクロです。

マクロ作成直後は機能しません。一度ファイルを保存し、開きなおした時に初めて有効になります。

Bookモジュール(ThisWorkBook)

Private Sub Workbook_Open()
    Call 右クリック無効(False)
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call 右クリック無効(True)
End Sub

標準モジュール

変数無効メニューに無効化するメニューのインデックス番号を格納して下さい。

Sub 右クリック無効(flg As Boolean)
    Dim r As Variant
    Dim 無効メニュー As Variant
    
    無効メニュー = Array(1, 2, 4, 6, 9, 10, 11, 12, 13, 15, 16, 17, 21, 22, 23, 24)
    
    For Each r In 無効メニュー
        Application.CommandBars("Cell").Controls(r).Enabled = flg
    Next r
End Sub
インデックス番号メニュー名
1切り取り​​(&T)
2コピー​​(&C)
3貼り付け​​(&P)…無効不可
4形式を選択して貼り付け(&S)…
6ス‍マ‍ー‍ト​​検索(&L)
9挿入(&I)…
10削除(&D)…
11数式と値のクリア(&N)
12翻訳
13クイック分析(&Q)
15フィルター(&E)
16並べ替え(&O)
17テーブルまたは範囲からデータを取得(&G)…
18コメントの挿入(&M)…無効不可
21セルの書式設定(&F)…
22ドロップダウン リストから選択(&K)…
23ふりがなの表示(&S)
24名前の​​定義(&A)…
30追加アクション(&I)…無効不可

インデックス番号3,18,30は無効に出来ませんでした。理由はよくわかりませんが、特別扱いのようです。

この表はエクセル2016(ビルド番号[16.0.xxxxxx])で調査したものです。旧バージョンでは違いがあるかも知れません。

右クリックメニューを完全に無効にする

右クリックメニューを完全に無効にします。右クリックしてもメニューダイアログがポップアップしません。前項同様、ファイル保存後に開き直して初めて有効になります。

Sub 右クリック無効(flg As Boolean)
    Application.CommandBars("Cell").Enabled = flg
End Sub

Bookモジュールは前項と同じものでOKです。

全シートでマクロが有効になります。シートを特定したい場合は、「右クリックメニューを追加する」のコードを参考にして下さい。

CommandBarsコレクションの中には“Cell”以外にもシートタブを右クリックしたときに現れる“Ply”や、行/列の右クリックで現れる“Row”,“Column”といった色々なコマンドバーがあります。知っておいて損はないです。

よかったらシェアしてね!
  • URLをコピーしました!
目次