問題需求:
1、菜單欄屬於CommandBars集合,可以通過菜單欄名稱或索引值對其進行引用:CommandBars(“Worksheet Menu Bar”)或CommandBars(1)
2、新添加的菜單是一個彈出式控件,其類型為msoControlPopup。
3、通過Add方法向Controls集合中添加新的控件。Add方法可以指定控件的類型、內置控件的ID號、位置及是否是一個臨時控件。如果是一個臨時控件,則在關閉Excel時會自動刪除該菜單。
4、可以指定新菜單的位置。如果不指定,則會在菜單工具欄末尾添加新菜單。
5、使用Caption屬性指定新菜單的名稱,使用OnAction屬性指定單擊菜單后的行為。
6、為了避免指定的菜單不存在,可以使用FindControl方法查找要指定的菜單。若指定的菜單不存在,則在工作表菜單欄末尾添加新菜單。
以下是向Excel工作表菜單欄中添加菜單的VBA代碼:
Sub AddNewMenu()
Dim HelpMenu As CommandBarControl
Dim NewMenu As CommandBarPopup
'利用ID屬性查找幫助菜單
Set HelpMenu = CommandBars(1).FindControl(ID:=30010)
If HelpMenu Is Nothing Then
'如果該菜單不存在,則將新菜單添加到末尾
'設置新菜單為臨時的
Set NewMenu = CommandBars(1).Controls _
.Add(Type:=msoControlPopup, Temporary:=True)
Else
'將新菜單添加到幫助菜單之前
Set NewMenu = CommandBars(1).Controls _
.Add(Type:=msoControlPopup, Before:=HelpMenu.Index, _
Temporary:=True)
End If
'添加標題並指定快捷鍵
NewMenu.Caption = "統計(&S)"
End Sub
運行該過程后,將在工作表菜單的“幫助”菜單左側添加一個名為“統計”的新菜單。
注:要刪除新添加的菜單,使用Delete方法即可,例如代碼:
CommandBars(1).Controls("統計(&S)").Delete
將刪除剛創建的“統計”菜單。
添加菜單項
與添加新菜單一樣,在添加菜單項及子菜單時,使用Add方法,且指定合適的控件類型,其代碼清單如下:
Sub AddNewMenu()
Dim HelpMenu As CommandBarControl
Dim NewMenu As CommandBarPopup
Dim MenuItem As CommandBarControl
Dim SubMenuItem As CommandBarButton
On Error Resume Next
'如果菜單已存在,則刪除該菜單
CommandBars(1).Controls("統計(&S)").Delete
'利用ID屬性查找幫助菜單
Set HelpMenu = CommandBars(1).FindControl(ID:=30010)
If HelpMenu Is Nothing Then
'如果該菜單不存在,則將新菜單添加到末尾
'設置新菜單為臨時的
Set NewMenu = CommandBars(1).Controls _
.Add(Type:=msoControlPopup, Temporary:=True)
Else
'將新菜單添加到幫助菜單之前
Set NewMenu = CommandBars(1).Controls _
.Add(Type:=msoControlPopup, Before:=HelpMenu.Index, _
Temporary:=True)
End If
'添加菜單標題並指定熱鍵
NewMenu.Caption = "統計(&S)"
'添加第一個菜單項
Set MenuItem = NewMenu.Controls.Add _
(Type:=msoControlButton)
With MenuItem
.Caption = "輸入數據(&D)..."
.FaceId = 162
.OnAction = "Macro1"
End With
'添加第二個菜單項
Set MenuItem = NewMenu.Controls.Add _
(Type:=msoControlButton)
With MenuItem
.Caption = "匯總數據(&T)..."
'添加快捷鍵
.ShortcutText = "Ctrl+Shift+T"
.FaceId = 590
.OnAction = "Macro2"
End With
'添加第三個菜單項
'本菜單有子菜單項,因此其類型為msoControlPopup
Set MenuItem = NewMenu.Controls.Add _
(Type:=msoControlPopup)
With MenuItem
.Caption = "數據報表(&R)..."
'添加分隔線
.BeginGroup = True
End With
'添加子菜單
'添加第一個子菜單
Set SubMenuItem = MenuItem.Controls.Add (Type:=msoControlButton)
With SubMenuItem
.Caption = "月匯總(&M)"
.FaceId = 110
.OnAction = "Macro3"
End With
'添加第二個子菜單
Set SubMenuItem = MenuItem.Controls.Add _
(Type:=msoControlButton)
With SubMenuItem
.Caption = "季度匯總(&Q)"
.FaceId = 222
.OnAction = "Macro4"
End With
End Sub
注意,菜單類型的不同,有二個菜單項(類型為msoControlButton)、有一個菜單項帶有子菜單(其類型為msoControlPopup)FaceID屬性確定出現在菜單文本旁邊的圖像,以數字表示,一個數字代表一個內置的圖像。
在Caption屬性中使用&號表示該菜單項的熱鍵。
在第二個菜單項中,利用ShortcutText屬性為該菜單項添加了一個快捷鍵,用戶按此快捷鍵可以直接運行命令。
