- ベストアンサー
特定のエクセルでのみ独自のメニューを出すには
EXCEL97が対象です。 エクセル97を開くとファイル、編集、表示、挿入とメニューが出ます。 ここにブックシート独自のメニューを出す事は可能ですか? A001.xls を 開く ファイル、編集、表示、挿入,メニューA01,メニューA02 B001.xls を 開く ファイル、編集、表示、挿入,メニューB01,メニューB02
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。Wend02です。 通常、ユーザー設定のコマンドバーは、Temporary 属性にします。理由は、ハングした後などに、そのメニューの残骸を残さないためです。また、ワークブックによってメニューを換えたりする場合は、#3 のご指摘にように、Active イベントとDeActive イベントを加えますが、Temporary 属性のために、本来、Applicationを終了すれば、そのメニューは消えてしまいます。つまり、特定のブックのみに、メニューが現れるという仕組みです。 なお、本来は、Addメニューのコードは、Workbook_Open イベントなどには、直接書かないで、標準モジュールなどに書いておき、Call を使います。そのほうが見やすく負担が少ないわけです。ブックによって切り替えるときなどは、ThisWorkbook.Name を取って、分岐させて、Call します。 Private Sub Workbook_Open() Dim MyMenu As CommandBar Set MyMenu = Application.CommandBars("Worksheet Menu Bar") On Error Resume Next MyMenu.Controls("メニュー01(&A)").Delete MyMenu.Controls("メニュー02(&B)").Delete On Error GoTo 0 '親メニュー With MyMenu.Controls.Add(Type:=msoControlPopup, Before:=5, Temporary:=True) .Caption = "メニュー01(&A)" .Tag = "A01" End With 'サブメニュー With MyMenu.FindControl(Tag:="A01").Controls.Add(Type:=msoControlButton, Temporary:=True) .Caption = "A01Sub1" .OnAction = "A01マクロ1" .BeginGroup = False End With With MyMenu.FindControl(Tag:="A01").Controls.Add(Type:=msoControlButton, Temporary:=True) .Caption = "A01Sub2" .OnAction = "Aマクロ2" End With '親メニュー With MyMenu.Controls.Add(Type:=msoControlPopup, Before:=6, Temporary:=True) .Caption = "メニュー02(&B)" .Tag = "B01" End With 'サブメニュー With MyMenu.FindControl(Tag:="B01").Controls.Add(Type:=msoControlButton, Temporary:=True) .Caption = "B01Sub1" .OnAction = "Bマクロ1" End With With MyMenu.FindControl(Tag:="B01").Controls.Add(Type:=msoControlButton, Temporary:=True) .Caption = "B01Sub2" .OnAction = "Bマクロ2" End With Set MyMenu = Nothing End Sub メニューの種類については、ヘルプやマニュアルで確かめてください。サブメニューの下にまた加えることは可能です。
その他の回答 (5)
- bonaron
- ベストアンサー率64% (482/745)
#3 のbonaronです。 >>(1) 新しいツールバーを作成します。 >> 仮に名前を「A001ツールバー」とします。 > 私と同じ手順で 新しいツールバーですか? そうです。 [ユーザー設定] - [ツールバー] - [新規作成] [ツールバー名] を「A001ツールバー」 >>(2) (1)に、メニューA01,メニューA02 を作成します。 > (出来たものをコピーで可) > サブメニューの作り方も教えてくれませんか? [コマンド] タブに変えて [分類]:「新しいメニュー」の[コマンド]:「新しいメニュー」を(1)のツールバーにドラッグ。 プロパティで名前等を設定。(メニューA01など) ------ ※ あとは、この下に 「ユーザ設定メニュー項目」や「新しいメニュー」を 必要なだけドラッグ。 加えたのが「新しいメニュー」の場合には ※ に戻って繰り返し。 (これにコントロールを追加するときは右(三角の向いている方)に追加です。) >>(3) ユーザー設定で「添付」 > 添付の後の処理は? 今作ったツールバー「A001ツールバー」を選択し、「コピーボタン」をクリック」、「OK」をクリック。 あとは、普通に閉じてしまっていいです。 我ながら、説明がヘタだなぁ・・・。
- bonaron
- ベストアンサー率64% (482/745)
#3の訂正です。 With Application .CommandBars(MY_BAR).Controls(2).Copy bar:=.CommandBars(MENU_BAR), Before:=4 'End With <---- この行削除 .CommandBars(MY_BAR).Controls(1).Copy bar:=.CommandBars(MENU_BAR), Before:=4 End With 失礼しました。 m(__)m
- bonaron
- ベストアンサー率64% (482/745)
大雑把に、やり方は2通り。 1つは #1のWendy02さんのやり方で Type:=msoControlPopup にして さらにその下層にボタンを追加していく方法。 こちらがよければサンプルをアップします。 2つ目は、現在のやり方をちょっと工夫する。 こちらの方が簡単かと思いますが。 A001.xlsの場合で。 (1) 新しいツールバーを作成します。 仮に名前を「A001ツールバー」とします。 (2) (1)に、メニューA01,メニューA02 を作成します。 (出来たものをコピーで可) (3) ユーザー設定で「添付」 (4) This Workbook に以下をコーディング Option Explicit Const MENU_BAR = "Worksheet Menu Bar" Const MY_BAR = "A001ツールバー" Private Sub Workbook_Activate() With Application .CommandBars(MY_BAR).Controls(2).Copy bar:=.CommandBars(MENU_BAR), Before:=4 End With .CommandBars(MY_BAR).Controls(1).Copy bar:=.CommandBars(MENU_BAR), Before:=4 End With End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.CommandBars(MY_BAR).Delete End Sub Private Sub Workbook_Deactivate() Application.CommandBars(MENU_BAR).Reset End Sub
補足
下記の手順をもう少し詳しく説明してくれませんか? >(1) 新しいツールバーを作成します。 > 仮に名前を「A001ツールバー」とします。 私と同じ手順で 新しいツールバーですか? >(2) (1)に、メニューA01,メニューA02 を作成します。 > (出来たものをコピーで可) サブメニューの作り方も教えてくれませんか? >(3) ユーザー設定で「添付」 添付の後の処理は?
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。#1のWendy02です。 >どのエクセルファイルを開いても同じメニューが出てしまいます。 >(1),(2),(3)……以上の操作で独自メニューは作れますが ? もしかしたら、ほとんど、マクロはご存知ないのでしょうか?もし、そうでしたら、おっしゃっているようなことは、不可能だと思います。メニューの取り付け方がまったく違います。
補足
私の独自メニューの作り方では欠点があるので 他の方法を模索してました。 Wendy02さんの Private Sub Workbook_Open() で、目標はほぼ達成出来そうです。 後メニューA01の下に サブメニュをぶら下げられれば完璧です。 サブメニュの作成方法をご存知ですか? マクロはある程度、使えますよ。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 ある程度、ご自身が、マクロでどの程度まで組み込んでいるのか提示してもらわないと、話の進めようがありません。これは、マクロでしか解決の方法がありません。もう少し、質問の仕方を考えてください。 今、97 では試していませんが、たぶん、並びが同じならできるはずです。以下は、サンプルですから、応用できましたら、お使いください。それぞれの ThisWorkbook_Open イベントに入れてください。 Private Sub Workbook_Open() With Application.CommandBars("Worksheet Menu Bar") On Error Resume Next .Controls("メニュー001(&A)").Delete .Controls("メニュー002(&B)").Delete On Error GoTo 0 With .Controls.Add(Type:=msoControlButton, Before:=5, Temporary:=True) .Caption = "メニュー001(&A)" .OnAction = "マクロA" .TooltipText = "メニュー001" .Style = msoButtonCaption .Tag = "A001" '通常はいらない .Visible = True End With With .Controls.Add(Type:=msoControlButton, Before:=6, Temporary:=True) .Caption = "メニュー002(&B)" .OnAction = "マクロB" .TooltipText = "メニュー002" .Style = msoButtonCaption .Tag = "B001" '通常はいらない .Visible = True End With End With End Sub なお、ユーザー設定のTag は、FindControlメソッドのために使用するものです。
補足
(1) ツール - ユーザ設定 - コマンド (2)新しいメニュー を メニュー部分(ファイル,編集,表示)に ドラッグ (3)マクロ- ユーザ設定メニュー項目 - を メニュー部分(ファイル,編集,表示)に ドラッグ 以上の操作で独自メニューは作れますが どのエクセルファイルを開いても 同じメニューが出てしまいます。
お礼
ありがとうございます。バッチリです。