513号室(保管庫)

移転しました:http://bardiel-of-may.blogspot.jp

全体表示

[ リスト ]

Excel:OnActionプロパティでおかしな挙動に遭遇

Excelのワークシートメニューバーにオリジナルのメニューを追加したときのことです。
メニューをクリックしても、OnActionプロパティに設定したはずのプロシージャが実行されません。
調べたところ、たまたま開いていた別のブックにも同じ名前のプロシージャがありました。
なんとそちらが実行されていたという。

もっとも、普通ならそんなことは起こりません。たぶん。
再現してみます(以下の画面はExcel2002ですが、2007で試しても同じでした)。
二つのブックがあるとして:

イメージ 1

それぞれ標準モジュールの中に以下のようなプロシージャがあるとします:
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
これで実際にブックを開いてみた時の実行結果:

イメージ 2

「どんだけー」「い、いかほど」をクリックすると、それぞれのブックのプロシージャ「TEST」が実行されます。

イメージ 3

ここまでは問題ありません。

実は別のブックのプロシージャが実行されてしまったのは、ブックをアドインにしていた時のことでした。
再現してみます。「どんだけ」の方のIsAddinプロパティをTrueにしたところ:

イメージ 4

これでオリジナルメニュー「どんだけー」をクリックすると、なぜか「いかほど」の方の「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にプロシージャ名を設定するようにしか書いてありません。
こんなことまでは想定していないのか、なんなのか(^ω^;)

閉じる コメント(0) ※投稿されたコメントはブログ開設者の承認後に公開されます。

コメント投稿
名前パスワードブログ
投稿

閉じる トラックバック(0) ※トラックバックはブログ開設者の承認後に公開されます。

トラックバックされた記事

トラックバックされている記事がありません。

トラックバック先の記事

  • トラックバック先の記事がありません。

芸能人・有名人の新着記事

Yahoo Image
武井 咲
その他GUCCI
05月26日 19:49
Yahoo Image
idanbo
Twitteridanbo: ...
05月26日 19:26

.

bardiel
人気度

ヘルプ

Yahoo Image

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
検索 検索
  今日 全体
訪問者 37 122083
ブログリンク 0 14
コメント 0 268
トラックバック 0 3

開設日: 2007/5/6(日)


プライバシーポリシー -  利用規約 -  ガイドライン -  順守事項 -  ヘルプ・お問い合わせ

Copyright (C) 2012 Yahoo Japan Corporation. All Rights Reserved.