Excel:OnActionプロパティでおかしな挙動に遭遇
|
Excelのワークシートメニューバーにオリジナルのメニューを追加したときのことです。 メニューをクリックしても、OnActionプロパティに設定したはずのプロシージャが実行されません。 調べたところ、たまたま開いていた別のブックにも同じ名前のプロシージャがありました。 なんとそちらが実行されていたという。 もっとも、普通ならそんなことは起こりません。たぶん。 再現してみます(以下の画面はExcel2002ですが、2007で試しても同じでした)。 二つのブックがあるとして: それぞれ標準モジュールの中に以下のようなプロシージャがあるとします: Public Sub TEST()
MsgBox "「どんだけ」のテストです。"
End Sub
Public Sub TEST()
MsgBox "「いかほど」のテストです。"
End Sub
プロシージャ名は同じで、メッセージボックスに表示される文字列だけが違います。これをオリジナルメニューのOnActionプロパティに割り当てます。 ThisWorkbookモジュールには以下のようなコードを書いてあります。 ブックを開くときにメニューバーへ追加し、閉じるときに削除します: Private Sub Workbook_Open()
Dim cbcMenu As CommandBarControl
Set cbcMenu = Application.CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlPopup)
cbcMenu.Caption = "どんだけ用メニュー"
With cbcMenu.Controls.Add(Type:=msoControlButton)
.Caption = "どんだけー"
.OnAction = "TEST"
End With
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim cbcTemp As CommandBarControl
For Each cbcTemp In Application.CommandBars("Worksheet Menu Bar").Controls
If cbcTemp.Caption = "どんだけ用メニュー" Then
cbcTemp.Delete
Exit For
End If
Next
End Sub
これで実際にブックを開いてみた時の実行結果:「どんだけー」「い、いかほど」をクリックすると、それぞれのブックのプロシージャ「TEST」が実行されます。 ここまでは問題ありません。 実は別のブックのプロシージャが実行されてしまったのは、ブックをアドインにしていた時のことでした。 再現してみます。「どんだけ」の方のIsAddinプロパティをTrueにしたところ: これでオリジナルメニュー「どんだけー」をクリックすると、なぜか「いかほど」の方の「TEST」が実行されます。 「い、いかほど」をクリックすると、もちろん「いかほど」の方の「TEST」。 「どんだけ」の「TEST」は実行されません。どういうことなの・・・ 試しに「どんだけ」のIsAddinはFalseに戻し、「いかほど」のIsAddinをTrueにしてみました。 すると今度は「どんだけ」の方の「TEST」しか実行されません。 どうも同名のプロシージャがあった場合、IsAddinをTrueにするとそっちを読みにいかなくなる模様。 ちなみに両方ともIsAddinをTrueにすると、どちらも「どんだけ」の方の「TEST」が実行されました。 この場合は、ワークシートメニューバーに先に追加された方を見に行くようです。なんなんだよw ファイルを開く順(メニューに追加される順)を逆にしてみたところ、「いかほど」の方が実行されました。 なんでだろーと調べてみたら、同じ問題でひっかかったという方がおられました: 解決方法も上のリンク先にありました。それぞれの標準モジュールを別の名前にします。 そしてOnActionプロパティはブックのフルパスから指定して、このモジュール名も含めます。 モジュール名を「mdlDondake」に変更してOnActionを設定する部分を修正: .OnAction = ThisWorkbook.FullName & "!mdlDondake.TEST"もう一方も同様に修正します。 これでIsAddinをいじる前と同様、それぞれの「TEST」が正しく実行されるようになりました。 なお、ファイルを.xla(2007では.xlam)で保存しても上の挙動は変わりませんでした。 それにしても、公式のヘルプにはOnActionにプロシージャ名を設定するようにしか書いてありません。
こんなことまでは想定していないのか、なんなのか(^ω^;) |





