關(guān)于在 Excel 中如何自定義菜單欄和工具欄,甚至快捷菜單,微軟有篇很詳細的文檔:
如何在 Excel 中自定義菜單和菜單欄。我再把自己的經(jīng)驗補充一下:
當我們打開 Excel 的時候,我們會看到一個菜單欄,還有根多工具欄。具體顯示哪些工具欄,我們可以通過 View->Toolbars 來控制。同時,這個長長的列表最后一項“Customize”很有用,我們可以通過這個命令來修改 Offcie 系統(tǒng)本身提供的各種各樣的菜單項和工具欄,包括改名,刪除,添加分隔線等,我們還可以添加自己的菜單項和工具欄。
對 Excel 菜單和工具欄的操作,用“Customize”命令和用VBA 的效果是一樣的,不過,用VBA 可以進行更多的自定義操作,我這里總結(jié)的就是用 VBA 操作 Excel 菜單和工具欄的知識和經(jīng)驗。
Excel 里的所有菜單欄,工具欄,以及快捷菜單,在 Office 系統(tǒng)里都是用 CommandBar (命令欄)這個類來表示的。每個工具欄都是一個 CommandBar 對象,比如我們點 View->Toolbars 看到的 “Standard”、“Formatting”等都是單獨的 CommandBar 對象。對于一個 Office 應(yīng)用程序,比如 Excel,里面的所有菜單欄都放在一個 CommandBars 集合對象里。CommandBars 類是 CommandBar 類的集合,當我們想訪問某個具體的菜單欄和工具欄,還有快捷菜單時,我們可以使用如下的表達方式:
Application.CommandBars(index)
Application 對象指當前的應(yīng)用程序,在這里具體的就是 Excel。這里的 CommandBars 是 Application 對象的屬性,返回一個 CommandBars 對象,CommandBars(index) 這種表示法則返回一個具體的 CommandBar 對象。index 可以是 CommandBar 對象的編號,也可以是 CommandBar 對象的名稱。我編了段代碼把我自己機器上安裝的 Excel 的所有 CommandBar 對象的名稱的編號打了份列表出來。如果想通過 VBA 來控制 Excel 的 命令欄,其中有幾個常用的名稱我們應(yīng)該要了解的。Excel 的菜單欄名稱是“Worksheet Menu Bar”,編號是 1。常用的工具欄有“Standard”,編號 3;“Formatting”, 編號 4。鼠標右鍵點工作表區(qū)域出來的快捷菜單名稱是“Cell”,編號是 36。用名稱和用編號訪問 CommandBar 對象是等價的。
Application.CommandBars(“Worksheet Menu Bar”) 和 Application.CommandBars(1) 兩個寫法效果是一樣的。
當我們想添加自己的工具欄時,我們是用 CommandBars 的 Add 方法,語法如下:
CommandBars.Add(Name, Position, MenuBar, Temporary)
Name 參數(shù)是我們給自定義的工具欄起的名稱。已經(jīng)存在的名字不能重復(fù)使用,否則會報錯(Run-Time error 5,無效的參數(shù))。
Position 參數(shù)不僅決定自定義工具欄的位置,還決定自定義工具欄的類型。這個參數(shù)是 MsoBarPosition 枚舉常量里的一個。msoBarLeft, msoBarTop, msoBarRight, msoBarBottom 四個值表示 自定義工具欄出現(xiàn)在 Excel 窗口的上、下、左、右四個位置,是 docked 的。msoBarFloating 表示新工具欄 不是 docked 的,浮在窗體上方。msoBarPopup 則表示創(chuàng)建的是快捷菜單。msoBarMenuBar 這個值 Windows 用不到,只用在 Macintosh 操作系統(tǒng)。
MenuBar 參數(shù)是個布爾值,決定創(chuàng)建的新命令欄是菜單欄還是工具欄,因為 Windows 的傳統(tǒng)是一個程序只有一個菜單欄。當我們指定為 True 時,我們自定義的菜單欄將替換 Excel 默認的菜單欄,最好不要做這件事情。這個參數(shù)默認是 False,也就意味著我們新建的命令欄是工具欄或者快捷菜單。
Temporary 參數(shù)也是個布爾值。True 決定 Excel 程序關(guān)閉再打開后這個新命令欄就沒用了 。這個參數(shù)默認值是 False,也就是說我們自定義的命令欄將一直跟隨 Excel 程序存在。比如 Adobe 公司的 PDF Maker 工具欄。 用上述語句生成的新工具欄不會直接顯示出來,我們還需要把新工具欄的 Visible 屬性設(shè)為 True,在某些 Office 版本里,可能還要先把 Enabled 屬性設(shè)為 True。在 Office 2003 里,只要 Visible 屬性設(shè)為 True 就可以了。下面是示例代碼:
Dim myNewBar As CommandBar
Set myNewBar = Application.CommandBars.Add ("littlegirl", msoBarFloating)
myNewBar.Enabled = True
myNewBar.Visible = True
如果創(chuàng)建的是快捷菜單,情形有點復(fù)雜,Visible 屬性設(shè)為 True 也不會顯示快捷菜單,我們需要在 Workbook_SheetBeforeRightClick 事件里添加如下語句:
Application.CommandBars("myShortcutBar").ShowPopup 200,200
我前面說過,Excel 默認的快捷菜單叫“Cell”,我們加了自定義的快捷菜單后會干擾使用固有的快捷菜單。
如果想要刪除一個工具欄,不管是自定義的還是固有的,就要用 CommandBar 對象的 Delete 方法。注意, 添加是在集合對象 CommandBars 上操作的,刪除則是在單個的 CommandBar 對象上執(zhí)行的。
Application.CommandBars("myShortcutBar").Delete
如果我們修改過了某些工具欄,我們可以用 CommandBar 對象的 Reset 方法將它們還原:
Application.CommandBars("Cell").Reset
上面講的是添加/刪除整個的命令欄,但更多時候,我們是在系統(tǒng)菜單欄里加個菜單項,或者在 “Standard”工具欄上加個我們自己開發(fā)的程序的按鈕。菜單欄、快捷菜單里的菜單項,還有工具欄上的按鈕,是用 CommandBarControl 類來表示的。跟所有的 CommandBar 對象放在一個 CommandBars 集合對象里一樣,某個具體的工具欄(菜單欄)上的所有按鈕,即所有的 CommandBarControl 對象也是放在一個 CommandBarControls 集合對象里的。CommandBar 對象的 Controls 屬性可以返回一個 CommandBarControls 集合對象。我們可以用下面的語句訪問某個具體的菜單項或命令按鈕:
Application.CommandBars("Formatting").Controls(index) --訪問 “Formatting”工具欄的某個按鈕
index 是控件的標題或編號。
工具欄上的按鈕形態(tài)是多種多樣的,有命令按鈕,文本框,下拉框等等;菜單項也是一層層嵌套的,有的菜單項只是彈出更多的菜單項來。CommandBarControl 類是個父類,下面派生出 CommandBarButton,CommandBarComboBox,和 CommandBarPopup 三個子類,對應(yīng)工具欄上不同形態(tài)的按鈕。但是工具欄上實際出現(xiàn)的按鈕類型遠遠超出這三個子類,這時我們就用 CommandBarControl 對象來表示就行了。
Office 里的 MsoControlType 枚舉類型定義了下面這么多的常量:
msoControlActiveX 22
msoControlAutoCompleteCombo 26
msoControlButton 1
msoControlButtonDropdown 5
msoControlButtonPopup 12
msoControlComboBox 4
msoControlCustom 0
msoControlDropdown 3
msoControlEdit 2
msoControlExpandingGrid 16
msoControlGauge 19
msoControlGenericDropdown 8
msoControlGraphicCombo 20
msoControlGraphicDropdown 9
msoControlGraphicPopup 11
msoControlGrid 18
msoControlLabel 15
msoControlLabelEx 24
msoControlOCXDropDown 7
msoControlPane 21
msoControlPopup 10
msoControlSpinner 23
msoControlSplitButtonMRUPopup 14
msoControlSplitButtonPopup 13
msoControlSplitDropdown 6
msoControlSplitExpandingGrid 17
msoControlWorkPane 25

我們可以用 CommandBarControl 對象的 Type 屬性來查看它是上面的哪個類型,如果能夠明確對應(yīng)的子類, 就可以訪問更多的屬性。比如“Formatting”工具欄上的“Font”下拉框是 CommandBarComboBox 子類,我們可以用它的 List(index) 屬性打印出一個字體列表。 向工具欄添加控件的語法如下:(向菜單欄添加菜單項同理) Application.CommandBars("Standard").Controls.Add(Type, Id, Parameter, Before, Temporary) Id 這個參數(shù)的好處是我們可以把 Excel 內(nèi)置的控件添加到我們自己的工具欄里。當然,你先要知道那個控件 的編號。
添加新控件是在 CommandBarControls 集合對象上執(zhí)行的,刪除則是在具體的 CommandBarControl 對象上執(zhí)行。