• ベストアンサー

特定のエクセルでのみ独自のメニューを出すには

EXCEL97が対象です。 エクセル97を開くとファイル、編集、表示、挿入とメニューが出ます。 ここにブックシート独自のメニューを出す事は可能ですか? A001.xls を 開く ファイル、編集、表示、挿入,メニューA01,メニューA02 B001.xls を 開く ファイル、編集、表示、挿入,メニューB01,メニューB02

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。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 メニューの種類については、ヘルプやマニュアルで確かめてください。サブメニューの下にまた加えることは可能です。

PYTHON357
質問者

お礼

ありがとうございます。バッチリです。

その他の回答 (5)

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.6

#3 のbonaronです。 >>(1) 新しいツールバーを作成します。 >>  仮に名前を「A001ツールバー」とします。 >   私と同じ手順で 新しいツールバーですか? そうです。 [ユーザー設定] - [ツールバー] - [新規作成] [ツールバー名] を「A001ツールバー」     >>(2) (1)に、メニューA01,メニューA02 を作成します。 >  (出来たものをコピーで可) >   サブメニューの作り方も教えてくれませんか? [コマンド] タブに変えて [分類]:「新しいメニュー」の[コマンド]:「新しいメニュー」を(1)のツールバーにドラッグ。 プロパティで名前等を設定。(メニューA01など) ------ ※ あとは、この下に 「ユーザ設定メニュー項目」や「新しいメニュー」を 必要なだけドラッグ。 加えたのが「新しいメニュー」の場合には ※ に戻って繰り返し。 (これにコントロールを追加するときは右(三角の向いている方)に追加です。) >>(3) ユーザー設定で「添付」 >   添付の後の処理は? 今作ったツールバー「A001ツールバー」を選択し、「コピーボタン」をクリック」、「OK」をクリック。 あとは、普通に閉じてしまっていいです。 我ながら、説明がヘタだなぁ・・・。

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.4

#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)
回答No.3

大雑把に、やり方は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

PYTHON357
質問者

補足

下記の手順をもう少し詳しく説明してくれませんか? >(1) 新しいツールバーを作成します。 >  仮に名前を「A001ツールバー」とします。    私と同じ手順で 新しいツールバーですか?     >(2) (1)に、メニューA01,メニューA02 を作成します。 >  (出来たものをコピーで可)    サブメニューの作り方も教えてくれませんか? >(3) ユーザー設定で「添付」     添付の後の処理は?

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。#1のWendy02です。 >どのエクセルファイルを開いても同じメニューが出てしまいます。 >(1),(2),(3)……以上の操作で独自メニューは作れますが ? もしかしたら、ほとんど、マクロはご存知ないのでしょうか?もし、そうでしたら、おっしゃっているようなことは、不可能だと思います。メニューの取り付け方がまったく違います。

PYTHON357
質問者

補足

私の独自メニューの作り方では欠点があるので 他の方法を模索してました。 Wendy02さんの Private Sub Workbook_Open()  で、目標はほぼ達成出来そうです。 後メニューA01の下に サブメニュをぶら下げられれば完璧です。 サブメニュの作成方法をご存知ですか? マクロはある程度、使えますよ。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 ある程度、ご自身が、マクロでどの程度まで組み込んでいるのか提示してもらわないと、話の進めようがありません。これは、マクロでしか解決の方法がありません。もう少し、質問の仕方を考えてください。 今、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メソッドのために使用するものです。

PYTHON357
質問者

補足

(1) ツール - ユーザ設定 - コマンド (2)新しいメニュー を  メニュー部分(ファイル,編集,表示)に ドラッグ (3)マクロ- ユーザ設定メニュー項目 - を  メニュー部分(ファイル,編集,表示)に ドラッグ 以上の操作で独自メニューは作れますが どのエクセルファイルを開いても 同じメニューが出てしまいます。