在Excel中,我們的操作都是通過“工具欄、菜單欄、快捷菜”單實現。Excel通過菜單給我們提供基本操作功能之外,也為我們提供了擴展自定義功能的接口,即自定義自己的工具欄、菜單欄。
本文著重介紹如何在 Excel 2003版本中通過編程方式自定義菜單和菜單欄方法。其中包含Excel 中管理和自定義菜單欄、菜單、命令、子菜單和快捷菜單,我將通過代碼實例分步說明。
與大家分享關於VBA實現菜單欄管理與自定義菜單欄功能的實現。
在 Microsoft Excel 2000以上版本中實現許與自定義菜單欄和菜單相關的常見任務,可以使用“自定義”對話框(見圖1.1)。但如果要實現較高級任務或為自定義程序定制菜單欄和菜單,就需要創建 Microsoft Visual Basic for Applications (VBA) 代碼。
有關如何使用“自定義”對話框的更多信息,你可以單擊“幫助”菜單上的“Microsoft Excel 幫助”,在“Office 助手”或“搜索向導”中鍵入自定義菜單欄,然後單擊“搜索”查看主題。
在 Microsoft Office 中,所有工具欄、菜單欄和快捷菜單都是被作為“命令欄”這樣一種對象以編程方式控制的。下列所有項目在 VBA 中皆用 CommandBar 對象表示:
l 菜單欄、工具欄和快捷菜單。
l 菜單欄和工具欄上的菜單。
l 菜單、子菜單和快捷菜單上的子菜單。
您可以修改任何內置的菜單欄和工具欄,還可以創建和修改用您自己的 VBA 代碼交付的自定義工具欄、菜單欄和快捷菜單。您可以將程序功能以單個按鈕的形式放在工具欄上,或以命令名稱組的形式放在菜單上。因為工具欄和菜單都是命令欄,所以可以使用同一類型的控件。
在 VBA 和 Microsoft Visual Basic 中,按鈕和菜單項用 CommandBarButton 對象表示。顯示菜單和子菜單的彈出控件用 CommandBarPopup 對象表示。在以下示例中,名為“Menu”的控件和名為“Submenu”的控件都是用於顯示菜單和子菜單的彈出控件,並且這兩個控件是各自的控件集中唯一的 CommandBar 對象。
在 Microsoft Excel 中,菜單欄和工具欄被視為是同一種可編程對象,即 CommandBar 對象。可以使用 CommandBar 對象中的控件來指代菜單、菜單項、子菜單和快捷菜單。可以在 Type 參數中使用一個常量為每個控件指定要用於菜單、子菜單或命令的控件類型。
下面是 Excel 2003 中的各種控件常量的列表,這些常量指定用於特定菜單欄控件的圖形控件類型:
• MsoControlActiveX*
• MsoControlAutoCompleteCombo***
• MsoControlButton
• MsoControlButtonDropdown
• MsoControlButtonPopup
• MsoControlComboBox
• MsoControlCustom
• MsoControlDropdown
• MsoControlEdit
• MsoControlExpandingGrid
• MsoControlGauge
• MsoControlGenericDropdown
• MsoControlGraphicCombo
• MsoControlGraphicDropdown
• MsoControlGraphicPopup
• MsoControlGrid
• MsoControlLabel
• MsoControlLabelEx***
• MsoControlOCXDropDown
• MsoControlPane **
• MsoControlPopup
• MsoControlSpinner***
• MsoControlSplitButtonMRUPopup
• MsoControlSplitButtonPopup
• MsoControlSplitDropdown
• MsoControlSplitExpandingGrid
• MsoControlWorkPane**
* 表示 Microsoft Excel 2000 中的新增項
** 表示 Microsoft Excel 2002 中的新增項
*** 表示 Microsoft Office Excel 2003 中的新增項
菜單欄是一種命令欄。它是一種可在其中添加菜單、菜單項和子菜單的對象。
有關如何在 Excel 中管理菜單欄和菜單項的更多信息,請按照下列步驟操作:
1. 啟動 Microsoft Visual Basic 編輯器。
2. 在“幫助”菜單上,單擊“Microsoft Visual Basic 幫助”。
3. 在“Office 助手”框或“應答向導”框中,鍵入菜單欄,然後單擊“搜索”。
4. 在 Excel 2003 和 Excel 2002 中,單擊“添加和管理菜單欄和菜單項”。在 Excel 2000 中,單擊“關於菜單和工具欄”。
可以在運行時修改菜單欄及該菜單欄上的控件。對菜單欄所做的更改可能會影響菜單欄的外觀或位置。可對控件進行的更改取決於控件類型。下表列出了最常見的屬性和常用於更改控件的狀態、操作或內容的方法:
屬性或方法
用途
Add
添加菜單欄,方法是使用 CommandBars 對象集合的 Add 方法,然後為 Menubar 參數指定 TRUE 值。
Enabled
如果 Enabled 屬性的值為 TRUE,那麼用戶可以使用 Visual Basic 代碼使指定的菜單欄可見。如果 Enabled 屬性的值為 FALSE,用戶就無法讓菜單欄可見。不過,菜單欄將出現在可用命令欄列表中。
Protection
使您可以通過特定用戶操作來保護菜單欄。
Position
指定新菜單欄相對於程序窗口的位置。菜單欄相對於程序窗口的位置可以是以下 MsoBarPosition 常量屬性之一:msoBarLeft、msoBarTop、msoBarRight、msoBarBottom、msoBarFloating、msoBarPopup(用於創建快捷菜單)或 msoBarMenuBar(僅用於 Apple Macintosh)。
Visible
定控件是可見的指,還是隱藏的。
新建一個命令欄並添加到命令欄集合。返回 CommandBar 對象。
expression.Add ( Name , Position , MenuBar , Temporary )
l expression必需。該表達式返回一個 CommandBars 對象。
l Name(Variant 類型)可選。新命令欄的名稱。如果忽略該參數,則為命令欄指定默認名稱(例如:Custom 1)。
l Position(Variant 類型)可選。新命令欄的位置或類型。可以為下表所列的 MsoBarPosition 常量之一。
常量
說明
msoBarLeft、msoBarTop、msoBarRight 和 msoBarBottom
指定新命令欄的左側、頂部、右側和底部坐標
msoBarFloating
指定新命令欄不固定
msoBarPopup
指定新命令欄為快捷菜單
msoBarMenuBar
僅適用於 Macintosh 機
l MenuBar (Variant類型)可選。設置為 True 將以新命令欄替換活動菜單欄。默認值為 False。
l Temporary (Variant類型)可選。設置為 True 將使新命令欄為臨時命令欄。臨時命令欄在關閉容器應用程序時刪除。默認值為 False。
以下代碼示例返回活動菜單欄的 ID:
Sub Id_Control ()
Dim myId as Object
Set myId = CommandBars("Worksheet Menu Bar").Controls("工具(&T)")
MsgBox myId.Caption & Chr(13) & MyId.Id
End Sub
以下代碼示例返回活動菜單欄的名稱:
Sub MenuBars_GetName()
MsgBox CommandBars.ActiveMenuBar.Name
End Sub
您可能需要將 originalMenuBar 變量聲明為公共變量,這樣,子例程就可以在其他子例程(如 Auto_Close 子例程)中使用該變量。以這種方式聲明和使用該變量會將用戶的上一個菜單欄重置為初始狀態。以下示例宏重置菜單欄:
Public originalMenuBar as Object
Sub MenuBars_Capture()
Set originalMenuBar = CommandBars.ActiveMenuBar
End Sub
以下代碼示例創建名為 My Command Bar 的自定義命令欄:
Sub MenuBar_Create()
Application.CommandBars.Add Name:="My command bar"
End Sub
您還可以通過使用 Temporary:=True 參數來創建自定義命令欄。Temporary:=True 參數允許命令欄在您退出 Excel 時自動重置。以下代碼使用 Temporary:=True 參數創建自定義命令欄:
Sub MenuBar_Create()
Application.CommandBars.Add Name:="My command bar", Temporary:=True
End Sub
以下示例創建並顯示自定義的“My Custom Bar”菜單欄,然後用它替換內置的菜單欄:
Sub MenuBar_Show()
Dim myNewBar As Object
Set myNewBar = CommandBars.Add(Name:="Custom1", Position:=msoBarFloating)
'您必須先啟用您的自定義菜單欄,然後看見它。
'使菜單欄添加到自定義對話框列表中的可用菜單欄上。
'設置菜單屬性設置為True取代內置的菜單欄。
myNewBar.Enabled = True
myNewBar.Visible = True
End Sub
以下代碼示例刪除名為“Custom 1”的自定義菜單欄:
Sub MenuBar_Delete()
CommandBars("Custom1").Delete
End Sub
以下代碼示例從可用菜單欄列表中刪除內置“圖表”菜單欄:
Sub MenuBar_Display()
CommandBars("Chart").Enabled = False
End Sub
以下代碼示例從可用菜單欄中添加內置“圖表”菜單欄:
Sub MenuBar_Display()
CommandBars("Chart").Enabled = True
End Sub
還原菜單欄會重置(菜單和菜單項的)默認控件。示例代碼還原內置“圖表”菜單欄:
Sub MenuBar_Restore()
CommandBars("Chart").Reset
End Sub
注意:您只能重置內置菜單欄,不能重置自定義菜單欄。