即効テクニック |
任意のセルを選択した状態で、メニューを開いてみてください。メニューに独自のコマンドを登録するには、CommandBarオブジェクトを操作します。 次のコードは、セルの右クリックメニューに2つのコマンドを登録します。
Sub Sample1() With Application.CommandBars("Cell").Controls.Add() .Caption = "コマンド1" .OnAction = "myMacro1" End With With Application.CommandBars("Cell").Controls.Add() .Caption = "コマンド2" .OnAction = "myMacro2" End With End Sub Sub myMacro1() MsgBox "印刷を実行します" End Sub Sub myMacro2() MsgBox "保存を実行します" End Sub[コマンド1]を実行するとmyMacro1が実行され、[コマンド2]ではmyMacro2が実行されます。 なお、登録したコマンドを削除するには、次のようにします。Sub Sample2() Application.CommandBars("Cell").Controls("コマンド1").Delete Application.CommandBars("Cell").Controls("コマンド2").Delete End Subコマンドが実行されたとき起動するプロシージャは、OnActionプロパティに設定します。 一般的には、コマンドごとにひとつのプロシージャが設定されますので、よく似た処理を行うプロシージャであっても、コマンドの数だけ用意しなければなりません。 もし、実行されたコマンドに引数を渡すことができれば、プロシージャをまとめて作成することが可能です。 OnActionプロパティで設定するプロシージャに引数を渡すときは、次のようにします。Sub Sample3() With Application.CommandBars("Cell").Controls.Add() .Caption = "コマンド1" .OnAction = "'myMacro3 ""印刷""'" End With With Application.CommandBars("Cell").Controls.Add() .Caption = "コマンド2" .OnAction = "'myMacro3 ""保存""'" End With End Sub Sub myMacro3(buf As String) MsgBox buf & "を実行します" End SubOnActionプロパティに設定するプロシージャ名は、文字列として指定します。 したがって、全体を「""」で囲まなければなりません。 しかし、OnAction = "myMacro3 印刷"のように指定すると、これは「myMacro3 印刷」という名前のプロシージャを指定したことになります。 かといって、OnAction = "myMacro3 ""印刷"""としても、エラーになります。 ここは、設定したい「myMacro3 ""印刷""」全体をシングルコーテーションで囲み、さらに、その文字列全体をダブルコーテーションで囲みます。 もっとも、似たような処理はほかにも方法があります。 一般的に、メニューに登録するコマンドは名称が異なります。 同じコマンド名では、ユーザーが区別つきませんからね。 そこで、起動するプロシージャに引数を渡すのではなく、どのコマンドが実行されたのかを区別できれば、処理の分岐も可能になります。 実行されたコマンドは、ActionControlプロパティで取得できます。 次のコードは、セルの右クリックメニューに[コマンド1]と[コマンド2]を登録します。 どちらのコマンドが実行されても、起動するプロシージャはmyMacro4です。Sub Sample4() With Application.CommandBars("Cell").Controls.Add() .Caption = "コマンド1" .OnAction = "myMacro4" End With With Application.CommandBars("Cell").Controls.Add() .Caption = "コマンド2" .OnAction = "myMacro4" End With End Subそして、起動するmyMacro4を次のようにします。Sub myMacro4() Select Case Application.CommandBars.ActionControl.Caption Case "コマンド1" MsgBox "印刷を実行します" Case "コマンド2" MsgBox "保存を実行します" End Select End Sub