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

中級VBA

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

 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 に設定しておくとブックを閉じた時に自動で削除されます。
 直接削除する方法に関しても一応知っておいた方が良いでしょう。

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