• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBA アドイン メニューの作成方法)

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

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

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

  • ベストアンサー
  • 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

専門家に質問してみよう