利用VBA創建Excel新菜單
使用VBA,可以很方便地向Excel菜單欄添加新菜單。
背景知識
1、菜單欄屬於CommandBars集合,可以通過菜單欄名稱或索引值對其進行引用:
CommandBars(“Worksheet Menu Bar”)或CommandBars(1)
2、新添加的菜單是一個彈出式控件,其類型爲msoControlPopup。
3、通過Add方法向Controls集合中添加新的控件。Add方法可以指定控件的類型、內置控件的ID號、位置及是否是一個臨時控件。如果是一個臨時控件,則在關閉Excel時會自動刪除該菜單。
4、可以指定新菜單的位置。如果不指定,則會在菜單工具欄末尾添加新菜單。
5、使用Caption屬性指定新菜單的名稱,使用OnAction屬性指定單擊菜單後的行爲。
6、爲了避免指定的菜單不存在,可以使用FindControl方法查找要指定的菜單。若指定的菜單不存在,則在工作表菜單欄末尾添加新菜單。
添加菜單
向Excel工作表菜單欄中添加菜單的過程清單如下:
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方法即可,例如代碼:
將刪除剛創建的“統計”菜單。
添加菜單項
與添加新菜單一樣,在添加菜單項及子菜單時,使用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屬性爲該菜單項添加了一個快捷鍵,用戶按此快捷鍵可以直接運行命令。
所添加的菜單如下圖所示。
圖:添加的新菜單