ユーザーに好きなタイミングでマクロを実行させるとき、ショートカットキーを割り当てるということもできますが、普通は何かをマウスでクリックすると思います。
例えば開発メニューから表示できるマクロリストやシートに貼り付けたコマンドボタンなどがあると思います。
一つの選択肢として、シートの右クリックメニュー(コンテキストメニュー)がふさわしい場合もあると思うので、その場合の基本的なコードは以下の通りです。
対象のシートのコード
対象のシートがSheet1の場合、そのシートのコードに以下を記述します。
右クリック実行前イベント
コードの説明は、コメント欄の通りです。
ポイントとしては、右クリックのたびにメニューが増えないように、毎回右クリックしたときに最初にリセットしています。
なお、Mac版 Excel 2016ではエラーにはなりませんが、FaceIdで指定したアイコンは表示されません。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) With Application.CommandBars("Cell") .Reset 'コンテキストメニューを初期化 With .Controls.Add() .BeginGroup = True '区切り線を入れる場合True、入れない場合False .Caption = "オリジナルメニュー " 'メニューのキャプションを入れる .FaceId = 59 'メニューのアイコンをFaceIdから選択して番号を指定 .OnAction = "MacroName" '実行するマクロ(引数は渡せない) End With End With End Sub |
シートのDeactivateイベント
他のシートでは表示されないようにリセットします。
1 2 3 4 5 6 7 8 |
Private Sub Worksheet_Deactivate() 'このシートがアクティブでなくなった場合 ' (他のシートがアクティブになったとき) 'コンテキストメニューを初期化 Application.CommandBars("Cell").Reset End Sub |
対象ブックのコード
複数開いている時に他のブックでは表示されないようにリセットします。
1 2 3 4 5 6 7 8 |
Private Sub Workbook_Deactivate() 'このブックがアクティブでなくなった場合 ' (他のブックがアクティブになったとき) 'コンテキストメニューを初期化 Application.CommandBars("Cell").Reset End Sub |
対象シートを右クリックすると
このようになり、選択するとOnActionで指定したマクロが実行されます。ただし、引数は渡せません。