自作のコマンドをメニューから実行
VBAでは、自作のプログラムをメニューに登録して実行する事ができます。
メニューの作成では色々な事ができますが、ここでは基本的な使い方を見ていきます。
メニューを追加してコマンドを登録
以下のコードではメニューバーに「マイ・メニュー」を追加して、そこに「コマンド(&C)」を登録しています。
Sub AddMyMenu()
Dim myMenu As Variant
Dim menuItem As Variant
'メニューを追加
Set myMenu = Application.CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlPopup, temporary:=True)
myMenu.Caption = "マイ・メニュー"
'コマンドを追加
Set menuItem = myMenu.Controls.Add
With menuItem
.Caption = "コマンド(&C)"
.OnAction = "myCommand"
End With
End Sub
Controls.Add として、引数にオプションを指定します。
通常のメニュー項目は、Type に msoControlPopup を指定します。
次の、temporary:=True は一時的なものとして指定します。
こうする事で、アプリケーションを終了した時にこのメニュー項目は削除されます。
指定しない(False=既定値)の場合は、削除コマンドを実行しないとメニューがどんどん追加されてしまします。
(削除の方法は後述します。)
コマンドの追加・登録は、先ほど追加した myMenu に対して .Controls.Addとして追加します。
Caption はメニューの表示文字で (&C) 部分はショートカットキーとして機能します。
この例では、Alt+Cがショートカットキーに割り当てています。
OnAction には実行するプロシージャ名を指定します。
実行すると以下のようになります。

2つ以上コマンドを追加する方法
更にコマンドを追加したい場合は、menuItem を使い回していけばOKです。
'コマンドを追加
Set menuItem = myMenu.Controls.Add
With menuItem
.Caption = "コマンド(&C)"
.OnAction = "myCommand"
End With
'コマンド2を追加
Set menuItem = myMenu.Controls.Add
With menuItem
.Caption = "コマンド2(&D)"
.OnAction = "myCommand2"
End With
メニューに追加するコマンド
実際には上記の AddMyMenu() をどこかのタイミングで実行しなければなりません。
通常は、ブックを開く時のイベントを利用する事になるでしょう。
プロジェクトウインドウの ThisWorkBook から、Workbook_Open() を選択して、ここで AddMyMenu() を実行します。
Private Sub Workbook_Open()
Call AddMyMenu
End Sub
これでアプリケーションが立ち上がるタイミングでメニューに追加されます。
メニュー追加の際に、temporary:=True と指定したのでアプリケーションの終了時にメニューは削除されます。
オリジナルメニューを削除する方法
独自メニューを直接削除するには、メニューを直接削除する方法と、メニューバーを元の状態に戻す方法があります。
追加したメニューを直接削除
Sub deleteMyMenu()
On Error Resume Next
Application.CommandBars("Worksheet Menu Bar").Controls("マイ・メニュー").Delete
End Sub
On Error Resume Next はエラーがあった場合でもスルーするためのコマンドです。
既に、”マイ・メニュー”が既に削除されている場合、再度削除しに行くとエラーが出ますが、これを回避させます。
メニューバーを元の状態に戻す
Sub resetMyMenu()
Application.CommandBars("Worksheet Menu Bar").Reset
End Sub
こちらは、メニューバーを元の状態に戻すコマンドです。こちらは、”マイ・メニュー”があっても無くてもエラーが出る事はないので、On Error Resume Next は不要です。
最後に
独自のメニュー項目を追加して、実行する方法を紹介しました。
実際にはメニュー項目が追加されていること自体は目立たないのでユーザーに周知させる必要性があると思います。なので筆者はあまりこの方法を使う事はありません。
その他にメニュー項目の追加・削除の事も考えなくてはなりません。面倒な事をしている割に効果が無いように思うのは筆者だけでしょうか?
ボタンやイベントでコマンドを実行するシチュエーションの方が多いように感じられます。