セルを右クリックしたときに表示されるショートカットメニューに、独自のコマンドを追加するには次のようにします。
Sub AddMenu() Dim Newb As CommandBarControl Set Newb = CommandBars("Cell").Controls.Add() With Newb .Caption = "独自のコマンド" .OnAction = "Sample" End With End Sub Sub Sample() MsgBox "tanaka" End Sub
CommandBars("Cell")が、セルの右クリックメニューを表しています。標準モジュールに記述するマクロでしたら、このままで動作しますが、もし標準モジュールではないモジュール(ドキュメントモジュールやUserFormモジュールなど)に記述するときは、Application.CommandBars("Cell")のように、Applicationをつけてください。
上記のコードは、右クリックメニューのメニュー項目(Controls)に、新しい項目を追加(Add)しています。その追加した新しい独自の項目を、一度オブジェクト変数に入れています。このとき、オブジェクト変数の型は、上記のようにCommandBarControlを指定しますが、分からなかったらバリアント型(Variant)でもOKです。
Sub AddMenu() Dim Newb As Variant Set Newb = CommandBars("Cell").Controls.Add() With Newb .Caption = "独自のコマンド" .OnAction = "Sample" End With End Sub
あるいは次のように、Withステートメントを使う手もあります。
Sub AddMenu() With CommandBars("Cell").Controls.Add() .Caption = "独自のコマンド" .OnAction = "Sample" End With End Sub
記述が短くなるので、私はよくこの書き方をします。いずれにしても実行すると、セルの右クリックメニューに新しいコマンドが追加され、そのコマンドをクリックすると、指定したプロシージャ(ここではSample)が実行されます。
メニュー項目を削除するには、Deleteメソッドを使います。
Sub DeleteMenu() CommandBars("Cell").Controls("独自のコマンド").Delete End Sub
あるいは、Resetメソッドを使うと、ユーザーが追加したすべての独自コマンドが削除されて、Excelの標準状態に戻せます。
Sub ResetMenu() CommandBars("Cell").Reset End Sub
メニュー項目には一般的にアクセスキーが設定されています。
アクセスキーとは、メニューを表示した状態で、そのキーを押すと、そのメニュー項目が"クリックされたことにする"というキーです。独自のコマンドにもアクセスキーを設定しておくと、たとえばShift+[F10]で右クリックメニューを開き、すかさずアクセスキーを押すことで、キーボードによる操作が可能になって超便利です。
アクセスキーは、独自のコマンドを追加するときのCaptionプロパティに指定しますが、
.Caption = "独自のコマンド(B)"
のように、ただアルファベットを記述するだけでは、アクセスキーにはなりません。これでは、ただ「(B)」という文字列を指定したことになります。アクセスキーを指定するときは、アルファベットの前に「&」をつけます。
.Caption = "独自のコマンド(&B)"
この項目を削除するときは
CommandBars("Cell").Controls("独自のコマンド(&B)").Delete
または
CommandBars("Cell").Controls("独自のコマンド(B)").Delete
とします。
上記のように、何も指定しないと、独自のコマンドはメニューの一番下に追加されます。追加する位置を指定するには、AddメソッドのBeforeオプションを指定します。既存メニュー項目のうち、Beforeオプションで指定した位置の直前に新しい項目が追加されます。
Sub AddMenu() With CommandBars("Cell").Controls.Add(Before:=1) .Caption = "独自のコマンド(&B)" .OnAction = "Sample" End With End Sub
Sub AddMenu() With CommandBars("Cell").Controls.Add(Before:=4) .Caption = "独自のコマンド(&B)" .OnAction = "Sample" End With End Sub