- - PR -
excelでメニュー追加について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-01-31 16:24
質問させていただきます。
以下のように、book1.xls、book2.xlsにそれぞれマクロを書きました。 >>book1.xls Private Sub Workbook_Open() With Application.CommandBars("worksheet menu bar") On Error Resume Next .Controls("選択(&L)").Delete With .Controls.Add(Type:=msoControlPopup, Temporary:=True) .FaceId = 59 .BeginGroup = True .Caption = "選択(&L)" With .Controls.Add(Type:=msoControlButton, Temporary:=True) .FaceId = 1954 .Caption = "test" .OnAction = "sub_test" End With End With End With Exit Sub End Sub Sub sub_test() MsgBox "from Book1.xls" End Sub ******************************************************************************* >>book2.xls Private Sub Workbook_Open() With Application.CommandBars("worksheet menu bar") On Error Resume Next .Controls("選択(&L)").Delete With .Controls.Add(Type:=msoControlPopup, Temporary:=True) .FaceId = 59 .BeginGroup = True .Caption = "選択(&L)" With .Controls.Add(Type:=msoControlButton, Temporary:=True) .FaceId = 1954 .Caption = "test" .OnAction = "sub_test" End With End With End With Exit Sub End Sub Sub sub_test() MsgBox "from Book2.xls" End Sub まず、book1.xlsを起動して「選択」メニューのtestをクリックすると、 「from Book1.xls」が出力されます。 (book1.xlsが開かれている状態で) 次に、book2.xlsを起動して「選択」メニューのtestをクリックすると、 「from Book2.xls」が出力されます。 そして、book2.xlsを閉じます。 book1.xlsだけ残っている状態です。 ここで、 「選択」メニューのtestをクリックすると、 なぜ「from Book2.xls」が出力されるのでしょうか? なんとなく理由は分かりそうですが、、 どなたか明確に説明していただけますでしょうか? また、 回避(「from Book1.xls」が出力されるよう)するにはどうしたらよいでしょうか? 宜しくお願いします。 | ||||||||
|
投稿日時: 2006-01-31 16:34
#codeタグを活用してみてください。 Active〜系のメンバで判断する必要があるのかな? [へんてこりんなことを言ったみたいなので一部削除] [ メッセージ編集済み 編集者: まどか 編集日時 2006-01-31 16:36 ] | ||||||||
|
投稿日時: 2006-01-31 16:45
あ、一瞬で消えてしまった方も書いておられましたが
sub_testの名前が同じなのでxxxxx.sub_testと絶対名にしなければいけないかな。。。 | ||||||||
|
投稿日時: 2006-01-31 17:00
ご返事有り難うございます
>>sub_testの名前が同じなのでxxxxx.sub_testと絶対名にしなければいけないかな。。。 は、だめでした。 >>#codeタグを活用してみてください。 >>Active〜系のメンバで判断する必要があるのかな? すみませんが、 これについては、もうちょっと具体的に教えていただけませんか? 宜しくお願いします。 | ||||||||
|
投稿日時: 2006-01-31 17:25
試してみました。
マクロ起動時にセキュリティ警告を出すようにしているとよくわかります。 最後のクリックで警告が出ました。 つまりBook2を開いています。 たぶん、.OnAction = "ThisWorkBook.sub_test"としてもだめなような気がします。 登録メニューを自分(Book)専用として、それぞれのBookで登録および閉じる際に削除する必要があるのではないでしょうか。 | ||||||||
|
投稿日時: 2006-01-31 17:54
有り難うございます
>>たぶん、.OnAction = "ThisWorkBook.sub_test"としてもだめなような気がします。 そうですね。だめです。 >>登録メニューを自分(Book)専用として、それぞれのBookで登録および閉じる際に削除>>する必要があるのではないでしょうか。 閉じる際に削除する処理を入れてみましたが、 メニュー自体が消えてしまい、book1.xlsから使うことができません。 各workbook専用として登録、削除しないといけないみたいですが、 どうすればよいか良く分かりません。 難しいですね、、 | ||||||||
|
投稿日時: 2006-01-31 18:22
ちなみに、「選択」というメニュー名は、変えたくないですが、、
| ||||||||
|
投稿日時: 2006-01-31 18:29
ブックごとに自分専用のボタンを用意する必要があります。
.Controls.Addで返ってくるオブジェクトをすべて変数に退避しましょう。 削除する際に参照する必要があるのでモジュールレベルスコープにしておきます。 またボタンのキャプションをどのブックに対してかをわかるようにします。 メニューが増えていくのが嫌なら、親メニューの存在チェックをして すでに存在すればそこへ追加するようにすればよいと思います。 また削除する際に自分が最後のメニューなら親メニューごと削除するとよいです。 |