以下のような処理を Private Sub Workbook_Open か Private Sub auto_Open の中に記述しておけば、そのEXCELブックを開くとメニューバーにユーザーメニューを追加することができます。
ユーザーメニュー追加処理部分
Dim W_CurMenuBar As CommandBar ' 現在のEXCELメニューバー
Dim W_MenuBar As CommandBarControl ' ユーザーメニュー追加後のメニューバー
Dim W_CtlButton As CommandBarButton ' ユーザーメニューに追加した項目ボタン
'デフォルトのEXCELメニューバーに戻す
On Error Resume Next
CommandBars.ActiveMenuBar.Reset
On Error GoTo 0
'メニューに「ユーザーメニュー」を追加
Set W_CurMenuBar = CommandBars.ActiveMenuBar
Set W_MenuBar = W_CurMenuBar.Controls.Add _
(Type:=msoControlPopup, _
Temporary:=True, _
ID:=1)
With W_MenuBar
.BeginGroup = True
.Caption = "ユーザーメニュー"
.Visible = True
.Enabled = True
End With
' 「ユーザーメニュー」に、個々のサブメニューを追加していく
Set W_CtlButton = W_MenuBar.Controls _
.Add(Type:=msoControlButton, Temporary:=True)
W_CtlButton.Caption = "サブメニュー1"
W_CtlButton.Style = msoButtonCaption
W_CtlButton.OnAction = "FuncSubMenu1"
Set W_CtlButton = W_MenuBar.Controls _
.Add(Type:=msoControlButton, Temporary:=True)
W_CtlButton.Caption = "サブメニュー2"
W_CtlButton.Style = msoButtonCaption
W_CtlButton.OnAction = "FuncSubMenu1"
Set W_CtlButton = W_MenuBar.Controls _
.Add(Type:=msoControlButton, Temporary:=True)
W_CtlButton.BeginGroup = True
W_CtlButton.Caption = "サブメニュー3"
W_CtlButton.Style = msoButtonCaption
W_CtlButton.OnAction = "FuncSubMenu1"
個々のサブメニュー設定で W_CtlButton.OnAction に、Public Function 定義したメニューに対応する関数名を指定します。
"ユーザーメニュー"追加時と"サブメニュー3"追加時に .BeginGroup = True を指定していますが、こうすると区切り線を表示することができます。
後は Private Sub Auto_Close の中で
ユーザーメニュー追加処理部分
Private Sub Auto_Close()
Application.ScreenUpdating = False
'デフォルトのEXCELメニューバーに戻す
On Error Resume Next
CommandBars.ActiveMenuBar.Reset
On Error GoTo 0
End Sub
としておけば、そのブックを閉じればデフォルトのメニューバーの状態に戻ります。
Set W_MenuBar = W_CurMenuBar.Controls.Addのときに、Temporary:=Trueにしておけば「コンテナ アプリケーションの終了と同時に自動的に削除されます」とのことなので、ブックを閉じれば削除されるのかと思ったんですが、そうでもないようです。Auto_Closeでの削除処理は入れておきましょう。
Dim W_BaseDirName As Variant ' 検索開始ディレクトリ
Dim W_FileSys As Object ' ファイルシステムオブジェクト
Dim W_FolderObj As Object ' フォルダオブジェクト
W_BaseDirName = Application.GetSaveAsFilename( _
InitialFilename:="Dummy", _
Title:="一覧作成開始フォルダを選択")
If W_BaseDirName <> False Then
Set W_FileSys = CreateObject("Scripting.FileSystemObject")
Set W_FolderObj = _
W_FileSys.GetFolder(W_FileSys.GetParentFolderName(W_BaseDirName))
' フォルダやファイルを使った処理を記述
End If