セルの右クリックメニューを改造するマクロです。全部で6パターン載せているのでコピペしてお好みの挙動になるよう改造して下さい。
- 特定のシート(指定したシート)で右クリックメニューを追加
- サブメニュー(多段メニュー)を追加
- 複数シートを指定して右クリックメニューを追加
- 全シートで右クリックメニューを追加
- 右クリックメニューの特定の項目を無効
- 右クリックメニューを完全無効(メニューのポップアップなし)
右クリックメニューを追加する
特定のシートで右クリックメニューを追加
標準モジュール
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
- 標準モジュールの定数に「追加するメニューの名前」を入力
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
- Bookモジュールの定数に追加メニューを有効にするシートの「オブジェクト名」を入力
シートをオブジェクト名で参照しているのはシート名が変わってもマクロを機能させるためです。オブジェクト名ではなくシート名で指定したい場合はCode.Nameの部分を.Nameに変更して下さい。
このコードは追加メニューを右クリックメニューの一番上に表示します。表示位置を変更したい場合、標準モジュール10行目before:=1の数字部分を変更して下さい。
蛇足ですが、このコードは改ページプレビューでも追加メニューが機能します。
サブメニューを追加する
サブメニュー(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
右クリックメニューを無効にする
メニューの一部をクリック禁止にしたい場合
デフォルトのメニューをメニュー名毎に無効(グレーアウト)にします。ブックを開いたときに無効、閉じたときに有効(元に戻す)にするマクロです。
マクロ作成直後は機能しません。一度ファイルを保存し、開きなおした時に初めて有効になります。
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”といった色々なコマンドバーがあります。知っておいて損はないです。