HOME > 即効テクニック > Excel VBA > メニューバー・ツールバー関連のテクニック > OnActionで実行するプロシージャに引数を渡す

即効テクニック

メニューバー・ツールバー関連のテクニック

OnActionで実行するプロシージャに引数を渡す

(Excel 97/2000/2002/2003/2007)

メニューに独自のコマンドを登録するには、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 Sub   
OnActionプロパティに設定するプロシージャ名は、文字列として指定します。 したがって、全体を「""」で囲まなければなりません。 しかし、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   
任意のセルを選択した状態で、メニューを開いてみてください。