こんにちは、Ryoです。
VBAで処理を行うWorksheetでは、場合によってユーザー操作をコントロールしたいこともあると思います。その際の一つとしてシート上の右クリックで表示されるショートカットメニューの表示と作成、実行について書いていきたいと思います。
1.サンプル概要
ワークシート上で通常の右クリックによるショートカットメニューは以下の通りですね。
そのショートカットメニューをVBAで作成し、以下の様なサンプルメニューに変更します。
実行するとメッセージボックスが表示される単純なものですけどね(笑)
このサンプルについて、以下に解説していきます。
2.サンプルコード
ワークシート操作になりますので、「Sheet」モジュールに記述します。
記述する際にオブジェクトボックスで「Worksheet」「BeforeRightClick」を選択。
Private Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean) Dim SC_menu As CommandBar Dim Menu As CommandBarButton 'Sample Shortcut Menuという名前のメニュー作成、格納 Set SC_menu = Application.CommandBars.Add _ (Name:="Sample Shortcut Menu", Position:=msoBarPopup) 'SC_menuに対しサブメニュー無しを設定し、Menu変数に格納 Set Menu = SC_menu.Controls.Add(Type:=msoControlButton) '表示名として”Sample Menu"を設定する Menu.Caption = "Sample Menu" 'メニューをクリックした際に実行されるモジュールをセット Menu.OnAction = "SC_Sample1" 'Face IDのNo.349(雷)図を表示 '※ID一覧はFace IDでネット検索すれば画像公開してるサイトが '多数ありますので、そこを参考にしてください。 Menu.FaceId = 349 'SC_menuのショートカットメニューを表示する SC_menu.ShowPopup 'SC_menuの削除 SC_menu.Delete '既存のショートカットメニューを表示しない(=True) Cancel = True End Sub
シートモジュールには上記サンプルコードを記述すればOKです。
次にメニューをクリックした際に実行する部分は「標準モジュール」に記述します。
Sub SC_Sample1() MsgBox "これが表示されればSample動作成功!" End Sub
メッセージボックスの表示だけなので、標準モジュールはこれだけです(笑)
これで対象とするシート上で右クリックすれば、サンプル概要で示した通り表示されると思います。
シートモジュールの記述内容から解説していきますが、ショートカットメニューを作成するにはCommandBar型、CommandBarButton型を使います。
Dim SC_menu As CommandBar
Dim Menu As CommandBarButton
VBAではショートカットメニューを「コマンドバー」として扱いますので、その実行するメニューもボタン的な役割となりコマンドバーボタンオブジェクトになります。
次に”Sample Shortcut Menu”という名前のショートカットメニューを作成して、先程宣言したSC_menuに格納します。
Set SC_menu = Application.CommandBars.Add _
(Name:=”Sample Shortcut Menu”, Position:=msoBarPopup)
ここで使用するのはCommandBarsコレクションのAddメソッドになります。
オブジェクト.Add(Name,Position,Temporary)
オブジェクトはCommandBarsコレクションを指定し、それぞれの引数に必要な項目を設定します。Nameは、この場合ショートカットメニューですがこの名前は「表示名ではない」ので、その点は留意ください。
引数Positionはショートカットメニューの場合、「msoBarPopup」を指定します。
引数TemporaryはExcel終了時に作成したメニューを削除するかしないかを設定するもので、省略した場合はFalse(削除しない)となります。
作成したショートカットメニューにコントロール(メニュー)を付加するには、CommandBarControlsのAddメソッドを使います。紛らわしいですね(笑)
オブジェクト.Add(Type,Before,Temporary)
構文としてはこのようになっているので、
Set Menu = SC_menu.Controls.Add(Type:=msoControlButton)
先程のSC_menu(コマンドバー)のコントロールとしてサブメニューを持たないボタンであるmsoControlButtonを指定します。サブメニューが必要な場合はmsoControlPopupになりますが、サンプルでは触れないので割愛しますね。
引数Beforeは配置する位置を数値で指定するものですが、省略も可です。その場合はメニューの末尾に配置されます。
引数Temporaryは上述と同内容です。
後は表示名であるCaptionの設定を行いますので、サンプルでは以下の通りです。
Menu.Caption = “Sample Menu”
そしてクリックした際に実行されるモジュール名を指定します。
Menu.OnAction = “SC_Sample1”
ここのFace IDは無くても問題ありませんが、何となく雷マークを表示してみました。
サンプルコード中にも記述していますが、ID一覧はネット上で検索すればありますので、ご興味のある方は探してみてくださいね。
Menu.FaceId = 349
ここまで記述したら、ショートカットメニュを表示させるShowPopupメソッドを使います。
SC_menu.ShowPopup
表示後に変数SC_menuをSC_menu.Deleteにて削除し、最後に既存のショートカットメニューを表示するかしないかを設定します。
Cancel = True
Trueとすれば既存のショートカットメニューは表示されませんので、用途に応じてFalseとしても良いと思います。
標準モジュール側のサンプルコードについてはメッセージ表示だけなので、解説は割愛しますね。
3.まとめ
ショートカットメニューを独自に作成して使用したいケースは、あまり多くないかもしれませんが出来ることを知っておくことで幅が広がることもありますよね。私の場合はセルの指定範囲を計算させた結果表示などで使ったりすることもあります。
今回はサンプルに沿った形での解説に限定しているので、コントロールのプロパティ等は他にもあるのですが、そこはまた別の機会に書ければと思います。
以上、ワークシート右クリックのショートカットメニューを作成する方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo