在EXCEL中,我们的操作都是通过“工具栏、菜单栏、快捷菜”单实现。EXCEL通过菜单给我们提供基本操作功能之外,也为我们提供了扩展自定义功能的接口,即自定义自己的工具栏、菜单栏。
本文着重介绍如何在 Excel 2003版本中通过编程方式自定义菜单和菜单栏方法。其中包含Excel 中管理和自定义菜单栏、菜单、命令、子菜单和快捷菜单,我将通过代码实例分步说明。
与大家分享关于VBA实现菜单栏管理与自定义菜单栏功能的实现。
在 Microsoft Excel 2000以上版本中实现许与自定义菜单栏和菜单相关的常见任务,可以使用“自定义”对话框(见图1.1)。但如果要实现较高级任务或为自定义程序定制菜单栏和菜单,就需要创建 Microsoft Visual Basic for Applications (VBA) 代码。
500)this.width=500}" alt="" src="[InstallDir_ChannelDir]{$UploadDir}/200909/20090904084259196.jpg">
有关如何使用“自定义”对话框的更多信息,你可以单击“帮助”菜单上的“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
注意:您只能重置内置菜单栏,不能重置自定义菜单栏。