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

ExcelVBAでは、シート上で右クリックした時のメニューを追加する事ができます。
方法は、メニューバーに追加する時と同じコマンドを使います。
メニューの追加では、独自で追加したメニューを後始末(削除)する必要があります。
右クリックメニューの追加方法
右クリックメニューの追加は、
Application.CommandBars(“Cell”).Controls.Add()
というコマンドを使います。
まずはサンプルを示します。
'右クリックメニュー
Sub AddMenu1()
Dim Newb As CommandBarControl
Set Newb = Application.CommandBars("Cell").Controls.Add(Before:=1, temporary:=True) '①
With Newb
.Caption = "独自のコマンド" '②
.OnAction = "myCommand" '③
End With
End Sub
まず①で、アプリケーションコマンドのCommandBars() に “Cell” を指定します。
右クリックメニューを追加するので、.Controls.Add() とします。
Add() には、いくつか引数を指定できますが、今回は2つの引数を指定しています。
Before には表示させる順番を指定でき、指定した数値の直前に配置されます。
1で一番上となります。省略した場合は一番最後となります。
次の、temporary:=True は一時的なものとして指定します。
こうする事で、アプリケーションを終了した時にこのメニュー項目は削除されます。
指定しない(False=既定値)の場合は、削除コマンドを実行しないとメニューがどんどん追加されてしまします。
(削除の方法は後述します。)
次に、①で生成された CommandBarControlオブジェクトに対してプロパティを設定します。
②の Caption はメニュー表記の文字列です。
③の OnAction には、実行したいプロシージャ名を指定します。
ブックが開いた時に右クリックメニューを追加
実際には上記の AddMyMenu1() をどこかのタイミングで実行しなければなりません。
通常は、ブックを開く時のイベントを利用する事になるでしょう。
プロジェクトウインドウの ThisWorkBook から、Workbook_Open() を選択して、ここで AddMyMenu1() を実行します。

Private Sub Workbook_Open()
Call AddMenu1
End Sub
追加したメニューの削除方法
上記のコードでは、①で temporary:=True としましたので、ブックを閉じる際に右クリックメニューは削除されるようになっています。 ここでは削除のコマンドも紹介します。
追加した右クリックメニュー項目を削除するには、メニューを直接削除する方法と、メニューバーを元の状態に戻す方法があります。
メニューを直接削除する方法
Sub DeleteMenu()
On Error Resume Next
CommandBars("Cell").Controls("独自のコマンド").Delete
End Sub
On Error Resume Next はエラーがあった場合でもスルーするためのコマンドです。
既に、”独自のコマンド”が削除されている場合は、エラーが出ますが、これを回避させます。
メニューバーを元の状態に戻す方法
Sub ResetMenu()
CommandBars("Cell").Reset
End Sub
こちらは、右クリックメニューを元の状態に戻すコマンドです。追加した項目があっても無くてもエラーが出る事はないので、On Error Resume Next は不要となります。
メニューを削除するタイミング
削除は、ブックを閉じるイベント(Workbook_BeforeClose)などを使用する事になると思います。またその他に、追加するプログラムの前段階で、削除を試みてから追加するような手法もよく使います。上記プログラムを書きなおした例を以下に示します。
'右クリックメニュー
Sub AddMenu1()
Call DeleteMenu
Dim Newb As CommandBarControl
Set Newb = Application.CommandBars("Cell").Controls.Add(Before:=1, temporary:=True)
With Newb
.Caption = "独自のコマンド"
.OnAction = "myCommand"
End With
End Sub
まとめ
右クリックメニューの基本的な追加方法を見てきました。
ここでは、追加はブックを開いた時のイベントで行いましたが、独自のタイミングで追加することもできます。
最後の後始末に関しては、Add() で temporary を True に設定しておくとブックを閉じた時に自動で削除されます。
直接削除する方法に関しても一応知っておいた方が良いでしょう。