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
を走らせて、右クリックメニューを戻しておくことをお忘れなく。
 
余談ですが、シートの書き方にもちょっと似たところがありますね。