OnAction と引数
MOUG(Excel VBA)2008/05/27 22:42:47
『OnActionで実行するプロシージャに引数を渡すと2度実行される?』
http://www.moug.net/faq/viewtopic.php?t=28150
で、なかなかおもしろいことがあったので書いておきます。
だいたいタイトルのとおりなんですが、もう少し正確に書くと、「OnActionで実行するプロシージャに引数を渡すときに、ある書き方をすると、そのプロシージャは2度実行される」という話です。
ま、コードの書き方にちょっと問題があるだけのことなんですが…
質問者は Excel2003 で冒頭の現象が起こっているらしいのですが、Excel2002 でも再現しました。
以下は実験用のサンプルコードです。
Public Sub Sample() Dim MenuA As Office.CommandBar Set MenuA = Application.CommandBars("Cell") MenuA.Reset With MenuA.Controls.Add .Caption = "追加Menu1" .OnAction = "Macro1(""Test1"")" End With With MenuA.Controls.Add .Caption = "追加Menu2" .OnAction = "'Macro1(""Test2"")'" End With With MenuA.Controls.Add .Caption = "追加Menu3" .OnAction = "'Macro1 ""Test3""'" End With End Sub Public Sub Macro1(ArgText As String) MsgBox ArgText End Sub
コードを見てのとおり、Sample プロシージャを実行すると、セルの右クリックメニューにリストが3つ追加されます。
そして、そのうちの"追加Menu1"をクリックした場合だけ、メッセージボックスが2度表示されます。
質問者は、1つ目の書き方をしていました。
正しい書き方は3つ目です。
ヘルプの使用例では ' は書かれていないとか、引数なしの場合は ' なしでも動くとか、↑のとおり意図したとおりにならないけどエラーにもならないとか… ちょっとばかしややこしいです。
実験が終わったら、イミディエイトウィンドウででも
Application.CommandBars("Cell").Reset
を走らせて、右クリックメニューを戻しておくことをお忘れなく。
余談ですが、シートの書き方にもちょっと似たところがありますね。