エクセルVBA アドイン メニューの作成方法

このQ&Aのポイント
  • エクセルVBAでアドインのメニューを作成する方法について教えてください
  • アドインをxla形式で保存し、エクセル上で起動させると、ファイルが展開されてしまいます。展開させずにアドインを起動させる方法を知りたいです
  • マクロを使用してメニューを作成し、コマンド1とコマンド2が選択されたときの動作を設定したいです
回答を見る
  • ベストアンサー

エクセルVBA アドイン メニューの作成方法

OS:windowsXP HomeEdition ソフト:Excel2003 アドインを作成し配布したいのですが、xla形式で保存しエクセル上でアドインさせ、 作成したメニューからテスト起動させてみると、アドインの元のファイル(拡張子xls)が 展開してしまいます。展開させずにアドインプロシージャを起動させたいのですが 何が原因か調べてもわかりませんでした。知っている方、ご助言御願い致します。 以下に、私の作成したマクロを記述します。 マクロ解説HPで勉強しつつ作成致しました。 ~~~~~~~~~~~~~~~~~~~~~~~~~ <ThisWorkBookへの記述> Dim mySubMenu As CommandBarControl Sub MakeSubMenu() Dim myMenu As CommandBar Dim cmdSubMenu As CommandBarControl 'すでにサブメニューがあれば削除する DelSubMenu Set myMenu = Application.CommandBars("worksheet Menu Bar") Set mySubMenu = myMenu.Controls.Add(Type:=msoControlPopup) mySubMenu.Caption = "メニュー" Set cmdSubMenu = myMenu.Controls("メニュー").Controls.Add(Type:=msoControlButton) cmdSubMenu.Caption = "コマンド1" 'サブメニューでコマンド1を選択したとき cmd1() を呼び出す cmdSubMenu.OnAction = "cmd1" Set cmdSubMenu = myMenu.Controls("メニュー").Controls.Add(Type:=msoControlButton) cmdSubMenu.Caption = "コマンド2" 'サブメニューでコマンド2を選択したとき cmd2() を呼び出す cmdSubMenu.OnAction = "cmd2" End Sub Sub DelSubMenu() 'メニューバーのサブメニューを削除する On Error Resume Next mySubMenu.Delete End Sub <標準モジュールへの記述> Private Sub cmd1() MsgBox "コマンド1を選択しました" End Sub Private Sub cmd2() MsgBox "コマンド2を選択しました" End Sub ~~~~~~~~~~~~~~~~~~~~~~~ 尚、マクロは簡略化し、のせております。 よろしく御願い致します。

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

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

>マクロは簡略化し、のせております。 とはいっても、出来る限り、イベントのひとつぐらいは省略しないでほしいです。コードが読めなくなります。 問題点は、片方のプロシーシャを、ThisWorkbook モジュールに入れておいて、 標準モジュールのPrivate キーワードを付けたプロシージャは、ThisWorkbookから、呼び出せませんね。 これを、同じThisWorkbookに入れるなら、そのままでも可能です。 >Private Sub cmd1() >   MsgBox "コマンド1を選択しました" >End Sub >Dim mySubMenu As CommandBarControl それと、これは、モジュール・スコープの変数にする必要はありませんね。 DelSubMenu の代わりに Private Sub Workbook_Open() Dim myMenu As CommandBar Dim cmdSubMenu As CommandBarControl   'すでにサブメニューがあれば削除する   ''DelSubMenu '←ここは不要   Set myMenu = Application.CommandBars("Worksheet Menu Bar")   On Error Resume Next   myMenu.Controls("メニュー").Delete   On Error GoTo 0   Set mySubMenu = myMenu.Controls.Add(Type:=msoControlPopup, Temporary:=True)   mySubMenu.Caption = "メニュー"    ユーザーメニューを加える時は、Temporary:=True は、必ず入れてください。 VBAが失敗しても、再起動すれば、ユーザー・メニューは消えています。 すでにサブメニューがあれば削除するということで、サブルーチンで、  mySubMenu.Delete を元のコードから供給するのでは、ほとんど意味がありません。しかし、これは、コーディング・マナーというのか、あくまでも、削除するのものは自分のマクロのみにします。Reset を使うものもありますが、数多くなると、Reset は使いません。 >マクロ解説HPで勉強しつつ作成致しました。 本当にVBAを勉強したいのでしたら、Webサイトでは、よろしくありません。体系的な知識を身につけにくく、知識が断片的になりやすいのと、いろんな寄せ集めて、統合化しにくいのです。コーディング・スタイルというものも、人それぞれ、ないようでいてありますから、そういうものを混ぜてしまうと、読みにくくなります。

gokigenn
質問者

お礼

詳しくご回答頂きありがとうございます。 解決できました。

その他の回答 (1)

  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

展開してしまうのは、以下の部分のOnActionで「xls」ファイルにある「cmd1」をマクロ登録されてしまっている為、だと考えられます。 cmdSubMenu.OnAction = "cmd1" つまり、「xls」が閉じられた状態で、開いているファイルのどこにも同じプロシージャ名が存在しない状態で、メニューが作成されれば、「xla」ファイルに対してマクロ登録されるはずです。 なので、開いている全てのファイルの中に、同じプロシージャ名が存在しない状態(無論、個人用マクロブックにも存在しない状態)にして、「MakeSubMenu」を実行すればいいです。 まぁ、以下の様にファイル名も指定して登録してもいいかもしれません。 cmdSubMenu.OnAction = ThisWorkbook.Name & "!cmd1"

gokigenn
質問者

お礼

ありがとうございます。 解決できました

関連するQ&A

  • めっちゃ困ってます

    ソフトを使おうとしたのですがいきなりつまづきました。11行目の◎◎のところがまちがってる?という事らしいのですが、どなたかどうしたらなおるか教えていただけないでしょうか。 Sub MortalityMenu() DeleteMort Dim MortMenu As CommandBarControl Dim MainMenu As CommandBar Dim SecondMenu As CommandBarControl Dim HelpIndex As Integer Dim NewButton As CommandBarControl Dim IconSheet As Worksheet 'Set IconSheet = Worksheets("Sheet5") Set MainMenu = Application.CommandBars("Worksheet Menu Bar") ◎HelpIndex = MainMenu.Controls("Help").Index◎ Set MortMenu = MainMenu.Controls.Add(Type:=msoControlPopup, _ Before:=HelpIndex) MortMenu.Caption = "&Mortality" Set SecondMenu = MortMenu.Controls.Add(Type:=msoControlPopup) SecondMenu.Caption = "&P-spline" Set NewButton = SecondMenu.Controls.Add(Type:=msoControlButton) With NewButton .Caption = "Fit Model" .Style = msoButtonIconAndCaption .OnAction = "Graduation.RunPS" End With Set NewButton = SecondMenu.Controls.Add(Type:=msoControlButton) With NewButton .Caption = "Generate Scenario" .Style = msoButtonIconAndCaption .OnAction = "Graduation.AddScenPS" End With Set SecondMenu = MortMenu.Controls.Add(Type:=msoControlPopup) SecondMenu.Caption = "&Lee-Carter" Set NewButton = SecondMenu.Controls.Add(Type:=msoControlButton) With NewButton .Caption = "Fit Model" .Style = msoButtonIconAndCaption .OnAction = "Graduation.RunLC" End With Set NewButton = SecondMenu.Controls.Add(Type:=msoControlButton) With NewButton .Caption = "Generate Scenario" .Style = msoButtonIconAndCaption .OnAction = "Graduation.RunLCProjection" End With ' Set SecondMenu = MortMenu.Controls.Add(Type:=msoControlButton) ' SecondMenu.Caption = "&Add Mortality Data" ' SecondMenu.OnAction = "AddData.AddMortalitySheets" Set SecondMenu = MortMenu.Controls.Add(Type:=msoControlButton) SecondMenu.Caption = "&About CMI Software" SecondMenu.OnAction = "Graduation.ShowAbout" End Sub Sub DeleteMort() On Error Resume Next CommandBars(1).Controls("Mortality").Delete End Sub

  • エクセル2007で自前のツールバーを作る方法

    エクセル2000です。 以下のマクロで自前の新しいツールバーが作れ、作動します。 ところがエクセル2007ではうんともすんとも言ってくれません。 エクセル2007で使う場合はどのようにしたらよいでしょうか? ユーザーフォームで似たようなものを作る方法はわかるのですが、できれば以下の方法を使いたいのです。 Sub 三択メニュー() On Error Resume Next Application.CommandBars("選択します").Delete On Error GoTo 0 Application.CommandBars.Add Name:="選択します", Position:=msoBarFloating With Application.CommandBars("選択します") .Visible = True .Controls.Add Type:=msoControlButton With .Controls(1) .Style = msoButtonCaption .Caption = "⇒メニュー1 " .OnAction = "Msg_1" End With .Controls.Add Type:=msoControlButton With .Controls(2) .Style = msoButtonCaption .Caption = "⇒メニュー2 " .OnAction = "Msg_2" End With .Controls.Add Type:=msoControlButton With .Controls(3) .Style = msoButtonCaption .Caption = "⇒メニュー3 " .OnAction = "Msg_3" End With End With End Sub Sub Msg_1() Application.CommandBars("選択します").Delete MsgBox "追加コマンド1を処理しました。" End Sub Sub Msg_2() Application.CommandBars("選択します").Delete MsgBox "追加コマンド2を処理しました。" End Sub Sub Msg_3() Application.CommandBars("選択します").Delete MsgBox "追加コマンド3を処理しました。" End Sub

  • EXCELで右クリックメニューの追加

    EXCELで右クリックメニューを追加するにあたり、以下のコードをネットで取得しました。 右クリックメニューを階層化してさらに、いくつか選べるようにするにはどうしたら良いのでしょうか? ------------------------------------------------------------- Dim Newb Set Newb = Application.CommandBars("Cell").Controls.Add() With Newb .Caption = "コマンド" .OnAction = "Sample_cmd" .BeginGroup = False End With Sub Sample_cmd() MsgBox Now End Sub ------------------------------------------------------------- 判る方お願いします。

  • ExcelVBA AddinでOnAction

    ツールバーにボタンを作って、そのボタンをクリックしたら OnActionプロパティ で指定したマクロを実行するというワークブックを作りアドイン化しました。 以下、アドインのマクロ。 ThisWorkbookに Private Sub Workbook_Open() ' ツールバーを削除 On Error Resume Next Application.CommandBars("MyMenu1").Delete On Error GoTo 0 With Application.CommandBars.Add(Name:="MyMenu1") .Visible = True .Position = msoBarBottom .RowIndex = 1 .Controls.Add (msoControlButton) With .Controls.Item(1) .Caption = "test1" .OnAction = "a" .FaceId = 59 End With End With End Sub 標準モジュールに Public Sub a() MsgBox "アドイン" End Sub としました。 これでこのアドインをExcelに登録すれば、どのファイルを開いた時でも ツールバーのボタンをクリックすれば、アドインのマクロが実行されます。 が、上記OnActionに記述したのと同じ名前のサブルーチンが、 今アクティブになっているワークブックにあった場合には、アドイン側の サブルーチンではなく、ワークブック側のが実行されてしまいます。 色々検索した結果、 OnActionの指定を「.OnAction = Thiswokbook.FullName & "!a"」とすればよい という記述を目にし、その通りにしましたが効果ありませんでした。 なお、Excel2000または2003で起きました。2010では通常にアドイン側のサブルーチンが 起動しています。 取りあえず、誰もつけそうにない名前をアドイン側のサブルーチンにつけていますが、 これしか手立てはないものでしょうか?

  • Excel-VBA ショートカットメニュー追加

    Excel-VBA ショートカットメニュー追加 マウス右クリックでのショートカットメニュー「テストA、テストB、テストC」を最上段に追加(挿入)したい、 CommandBarControls.Add メソッド 構文:式.Add(Type, Id, Parameter, Before, Temporary) これのBeforeを定義すれば良さそうに思えるのですが、成功しません!? 正しい記述事例を教えて下さい。 参考(現状):下記は最後(末尾)にメニューが追加されてしまう状態です。 Public Sub ShortCutMenuAdd() Dim newMenu As CommandBarControls Set newMenu = Application.CommandBars("Cell").Controls newMenu.Add Type:=msoControlButton, Temporary:=True newMenu(newMenu.Count).Caption = "テストA" newMenu(newMenu.Count).OnAction = "mymsgA" newMenu(newMenu.Count).BeginGroup = True newMenu.Add Type:=msoControlButton, Temporary:=True newMenu(newMenu.Count).Caption = "テストB" newMenu(newMenu.Count).OnAction = "mymsgB" newMenu.Add Type:=msoControlButton, Temporary:=True newMenu(newMenu.Count).Caption = "テストC" newMenu(newMenu.Count).OnAction = "mymsgC" Set newMenu = Nothing End Sub

  • メニューバーのイベントが2回実行される

    CommandBarControlでメニューバーを作成し、イベントを実行していますが、何故か2回実行されてしまいます。 具体的には、  Set myMenu = Application.CommandBars("Worksheet Menu Bar"). _ Controls.Add(Type:=msoControlPopup, before:=11) With myMenu .Caption = "User's MenuBar(xx)" With .Controls.Add .Caption = "フォームを開く" .OnAction = "OpenForm(2)" End With 上記で「フォームを開く」メニューバーを作成して、これを選択すると、UserForm1.Show というロジックが書かれているSubプロシジャーが実行されます。 これにより、フォームが開くのですが、どうもこのプロシジャーが2回実行されており、フォームが2つ開いているのです。 しかし、原因がわかりません。 対策としては、 1.2回実行される原因を調べる。 2.UserForm1が既に開いていたら開かないようにロジックを変更す   る。 1は皆無ですし、2はUserForm1が既に開いているかをチェックするロジックが分かりません。 どなたか教えて下さい。 よろしくお願いします m(_ _)m

  • Excel:メニューから関数に飛ぶ際に引数を持たせる

    Excel2003でマクロを組んでいます。 ThisWorkbookにて、  With Menu1   .Controls.add Type:=msoControlButton   With .Controls(1)    .Caption = "手順1"    .OnAction = "Jikkou"   End With  End With のように記述し、Menu1というオリジナルのメニューの中に、 「手順1」というメニューを表示させ、これを実行すると関数"Jikkou"が動くようにしました。 このJikkouという関数に、引数を持って行きたいのですが、 どのように記述すればよいでしょうか。 具体的には、異なるメニューを実行して同じ関数へ移動する際、 「どのメニューを選択してきたのか」によって、Jikkouの中で処理を分岐させたいのです。 引数を持たせられたら解決しそうだと思って質問しています。 他に何か方法があれば(例えば、それよりこちらの方が自然だ、のような方法があれば)教えていただきたいです。 以下、引数の持たせ方がわからず詰まった、自分の考えたコードです(勿論動きません)。 目的が伝われば幸いです。 ---▼ThisWorkbookの一部---------------------------  With Menu1   .Controls.add Type:=msoControlButton   With .Controls(1)    .Caption = "手順1"    a = 0    .OnAction = "Jikkou a"   End With  End With  With Menu1   .Controls.add Type:=msoControlButton   With .Controls(2)    .Caption = "手順2"    a = 1    .OnAction = "Jikkou a"   End With  End With ---▼関数Jikkou------------------------------------ Sub Jikkou(byVal a as integer)  if a = 0 then   msgbox "手順1から来た"  elseif a = 1 then   msgbox "手順2から来た"  end if End Sub

  • VBA アドイン

    今,下記のプログラムを組みメニューバーに登録しユーザフォームを実行させようとしています. Private Sub workbook_addininstall() Dim Menubar As CommandBar Set Menubar = Application.CommandBars.Add(Name:="グラフ作成ツール") With Menubar.Controls.Add(Type:=msoControlButton) '1 .FaceId = 23 .Style = msoButtonIconAndCaption .TooltipText = "グラフ作成ツール" .OnAction = ThisWorkbook.Name & "!UserForm_open" End With Menubar.Visible = True MsgBox "「グラフ作成ツール」ツールバーがインストールされました。", vbOKOnly End Sub 標準モジュールに Sub UseForm_open() graph.Show End Sub として実行させようとすると,下記のようなエラーが返ってきて実行できませんでした. マクロ''グラフ作成ツール.xla'!UserForm'を実行できません。   このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性があります。 どうすれば実行できますでしょうか?ご指導ご鞭撻のほどよろしくお願いいたします.

  • EXCEL VBA:シートの右クリックメニューへの追加方法

    (1)EXCEL VBAで、シートの右クリックメニューへの追加方法が下記の通り、ある本に載っていたので試してみましたが、うまく動作しません。 どこが間違っているか教えて下さい。  Sub シートの右クリックメニュー追加()  With CommandBars("Ply").Controls.Add  .Caption = "AAA(メニューの表示文字)"  .OnAction = "BBB(実行するマクロ名)"  .BeginGroup = True  End With  End Sub (2)上記「シートの右クリックメニュー追加」+BBBマクロをアドインへ組み込み、皆さんへ配布して、右クリックメニューで動作させたいのですが、やり方を教えて下さい。 宜しく、お願いします。

  • EXCEL VBAアドイン:シートの右クリックメニューへの追加方法その2

    下記「シートの右クリックメニュー追加」+BBBマクロをアドインへ組み込み、皆さんへ配布して、自動的に右クリックメニューに組み込んでBBBマクロを動作させたいのですが、やり方を教えて下さい。 PERSONAL.XLSのThisWorkbookにAddinstallイベントプロシージャーで下記のように記述しましたがエラーが出ます。 どのように修正すれば良いか、教えて下さい。 また、やり方はこれでOKでしょうか。 なお、標準モジュールに登録して実行すると動きます。 宜しく、お願いします。 「エラー内容」 実行時エラー’91’ オブジェクト変数またはWithプロック変数が設定されていません。 Sub シートの右クリックメニュー追加()  With CommandBars("Cell").Controls.Add   .Caption = "AAA(メニューの表示文字)"   .OnAction = "BBB(実行するマクロ名)"   .BeginGroup = True  End With End Sub

専門家に質問してみよう