@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

excelでメニュー追加について

投稿者投稿内容
スンパ
ベテラン
会議室デビュー日: 2005/05/23
投稿数: 85
投稿日時: 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」が出力されるよう)するにはどうしたらよいでしょうか?

宜しくお願いします。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-01-31 16:34
引用:

コード:

With Application.CommandBars("worksheet menu bar")
.Controls("選択(&L)").Delete
End With


「選択」メニューのtestをクリックすると、
なぜ「from Book2.xls」が出力されるのでしょうか?
願いします。


#codeタグを活用してみてください。

Active〜系のメンバで判断する必要があるのかな?

[へんてこりんなことを言ったみたいなので一部削除]

[ メッセージ編集済み 編集者: まどか 編集日時 2006-01-31 16:36 ]
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-01-31 16:45
あ、一瞬で消えてしまった方も書いておられましたが
sub_testの名前が同じなのでxxxxx.sub_testと絶対名にしなければいけないかな。。。
スンパ
ベテラン
会議室デビュー日: 2005/05/23
投稿数: 85
投稿日時: 2006-01-31 17:00
ご返事有り難うございます

>>sub_testの名前が同じなのでxxxxx.sub_testと絶対名にしなければいけないかな。。。
は、だめでした。

>>#codeタグを活用してみてください。
>>Active〜系のメンバで判断する必要があるのかな?

すみませんが、
これについては、もうちょっと具体的に教えていただけませんか?

宜しくお願いします。


まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-01-31 17:25
試してみました。
マクロ起動時にセキュリティ警告を出すようにしているとよくわかります。
最後のクリックで警告が出ました。
つまりBook2を開いています。

たぶん、.OnAction = "ThisWorkBook.sub_test"としてもだめなような気がします。
登録メニューを自分(Book)専用として、それぞれのBookで登録および閉じる際に削除する必要があるのではないでしょうか。
スンパ
ベテラン
会議室デビュー日: 2005/05/23
投稿数: 85
投稿日時: 2006-01-31 17:54
有り難うございます

>>たぶん、.OnAction = "ThisWorkBook.sub_test"としてもだめなような気がします。
そうですね。だめです。

>>登録メニューを自分(Book)専用として、それぞれのBookで登録および閉じる際に削除>>する必要があるのではないでしょうか。
閉じる際に削除する処理を入れてみましたが、
メニュー自体が消えてしまい、book1.xlsから使うことができません。

各workbook専用として登録、削除しないといけないみたいですが、
どうすればよいか良く分かりません。

難しいですね、、
スンパ
ベテラン
会議室デビュー日: 2005/05/23
投稿数: 85
投稿日時: 2006-01-31 18:22
ちなみに、「選択」というメニュー名は、変えたくないですが、、
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-01-31 18:29
引用:

閉じる際に削除する処理を入れてみましたが、
メニュー自体が消えてしまい、book1.xlsから使うことができません。


ブックごとに自分専用のボタンを用意する必要があります。

引用:

各workbook専用として登録、削除しないといけないみたいですが、
どうすればよいか良く分かりません。


.Controls.Addで返ってくるオブジェクトをすべて変数に退避しましょう。
削除する際に参照する必要があるのでモジュールレベルスコープにしておきます。
またボタンのキャプションをどのブックに対してかをわかるようにします。
メニューが増えていくのが嫌なら、親メニューの存在チェックをして
すでに存在すればそこへ追加するようにすればよいと思います。
また削除する際に自分が最後のメニューなら親メニューごと削除するとよいです。

スキルアップ/キャリアアップ(JOB@IT)