Excel VBA自定义菜单和菜单栏.docx
- 文档编号:7036821
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:19
- 大小:46.10KB
Excel VBA自定义菜单和菜单栏.docx
《Excel VBA自定义菜单和菜单栏.docx》由会员分享,可在线阅读,更多相关《Excel VBA自定义菜单和菜单栏.docx(19页珍藏版)》请在冰豆网上搜索。
ExcelVBA自定义菜单和菜单栏
ExcelVBA自定义菜单和菜单栏
(江羽收集整理)
【目录】
前言
在EXCEL中,我们的操作都是通过“工具栏、菜单栏、快捷菜”单实现。
EXCEL通过菜单给我们提供基本操作功能之外,也为我们提供了扩展自定义功能的接口,即自定义自己的工具栏、菜单栏。
本文着重介绍如何在Excel2003版本中通过编程方式自定义菜单和菜单栏方法。
其中包含Excel中管理和自定义菜单栏、菜单、命令、子菜单和快捷菜单,我将通过代码实例分步说明。
与大家分享关于VBA实现菜单栏管理与自定义菜单栏功能的实现。
一、简介
在MicrosoftExcel2000以上版本中实现许与自定义菜单栏和菜单相关的常见任务,可以使用“自定义”对话框(见图1.1)。
但如果要实现较高级任务或为自定义程序定制菜单栏和菜单,就需要创建MicrosoftVisualBasicforApplications(VBA)代码。
图1.1
有关如何使用“自定义”对话框的更多信息,你可以单击“帮助”菜单上的“MicrosoftExcel帮助”,在“Office助手”或“搜索向导”中键入自定义菜单栏,然后单击“搜索”查看主题。
二、命令栏
在MicrosoftOffice中,所有工具栏、菜单栏和快捷菜单都是被作为“命令栏”这样一种对象以编程方式控制的。
下列所有项目在VBA中皆用CommandBar对象表示:
●菜单栏、工具栏和快捷菜单。
●菜单栏和工具栏上的菜单。
●菜单、子菜单和快捷菜单上的子菜单。
您可以修改任何内置的菜单栏和工具栏,还可以创建和修改用您自己的VBA代码交付的自定义工具栏、菜单栏和快捷菜单。
您可以将程序功能以单个按钮的形式放在工具栏上,或以命令名称组的形式放在菜单上。
因为工具栏和菜单都是命令栏,所以可以使用同一类型的控件。
在VBA和MicrosoftVisualBasic中,按钮和菜单项用CommandBarButton对象表示。
显示菜单和子菜单的弹出控件用CommandBarPopup对象表示。
在以下示例中,名为“Menu”的控件和名为“Submenu”的控件都是用于显示菜单和子菜单的弹出控件,并且这两个控件是各自的控件集中唯一的CommandBar对象。
在MicrosoftExcel中,菜单栏和工具栏被视为是同一种可编程对象,即CommandBar对象。
可以使用CommandBar对象中的控件来指代菜单、菜单项、子菜单和快捷菜单。
可以在Type参数中使用一个常量为每个控件指定要用于菜单、子菜单或命令的控件类型。
三、控件常量
下面是Excel2003中的各种控件常量的列表,这些常量指定用于特定菜单栏控件的图形控件类型:
•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**
*表示MicrosoftExcel2000中的新增项
**表示MicrosoftExcel2002中的新增项
***表示MicrosoftOfficeExcel2003中的新增项
四、菜单栏
菜单栏是一种命令栏。
它是一种可在其中添加菜单、菜单项和子菜单的对象。
有关如何在Excel中管理菜单栏和菜单项的更多信息,请按照下列步骤操作:
1.启动MicrosoftVisualBasic编辑器。
2.在“帮助”菜单上,单击“MicrosoftVisualBasic帮助”。
3.在“Office助手”框或“应答向导”框中,键入菜单栏,然后单击“搜索”。
4.在Excel2003和Excel2002中,单击“添加和管理菜单栏和菜单项”。
在Excel2000中,单击“关于菜单和工具栏”。
可以在运行时修改菜单栏及该菜单栏上的控件。
对菜单栏所做的更改可能会影响菜单栏的外观或位置。
可对控件进行的更改取决于控件类型。
下表列出了最常见的属性和常用于更改控件的状态、操作或内容的方法:
属性或方法
用途
Add
添加菜单栏,方法是使用CommandBars对象集合的Add方法,然后为Menubar参数指定TRUE值。
Enabled
如果Enabled属性的值为TRUE,那么用户可以使用VisualBasic代码使指定的菜单栏可见。
如果Enabled属性的值为FALSE,用户就无法让菜单栏可见。
不过,菜单栏将出现在可用命令栏列表中。
Protection
使您可以通过特定用户操作来保护菜单栏。
Position
指定新菜单栏相对于程序窗口的位置。
菜单栏相对于程序窗口的位置可以是以下MsoBarPosition常量属性之一:
msoBarLeft、msoBarTop、msoBarRight、msoBarBottom、msoBarFloating、msoBarPopup(用于创建快捷菜单)或msoBarMenuBar(仅用于AppleMacintosh)。
Visible
定控件是可见的指,还是隐藏的。
4.1Add方法应用于CommandBars对象
新建一个命令栏并添加到命令栏集合。
返回CommandBar对象。
expression.Add(Name,Position,MenuBar,Temporary)
●expression必需。
该表达式返回一个CommandBars对象。
●Name(Variant类型)可选。
新命令栏的名称。
如果忽略该参数,则为命令栏指定默认名称(例如:
Custom1)。
●Position(Variant类型)可选。
新命令栏的位置或类型。
可以为下表所列的MsoBarPosition常量之一。
常量
说明
msoBarLeft、msoBarTop、msoBarRight和msoBarBottom
指定新命令栏的左侧、顶部、右侧和底部坐标
msoBarFloating
指定新命令栏不固定
msoBarPopup
指定新命令栏为快捷菜单
msoBarMenuBar
仅适用于Macintosh机
●MenuBar(Variant类型)可选。
设置为True将以新命令栏替换活动菜单栏。
默认值为False。
●Temporary(Variant类型)可选。
设置为True将使新命令栏为临时命令栏。
临时命令栏在关闭容器应用程序时删除。
默认值为False。
4.2返回命令栏控件的ID
以下代码示例返回活动菜单栏的ID:
SubId_Control()
DimmyIdasObject
SetmyId=CommandBars("WorksheetMenuBar").Controls("工具(&T)")
MsgBoxmyId.Caption&Chr(13)&MyId.Id
EndSub
4.3确定活动菜单栏的名称
以下代码示例返回活动菜单栏的名称:
SubMenuBars_GetName()
MsgBoxCommandBars.ActiveMenuBar.Name
EndSub
4.4保存(内置或自定义菜单栏的)活动状态
您可能需要将OriginalMenuBar变量声明为公共变量,这样,子例程就可以在其他子例程(如Auto_Close子例程)中使用该变量。
以这种方式声明和使用该变量会将用户的上一个菜单栏重置为初始状态。
以下示例宏重置菜单栏:
PublicOriginalMenuBarasObject
SubMenuBars_Capture()
SetOriginalMenuBar=CommandBars.ActiveMenuBar
EndSub
4.5创建自定义命令栏
以下代码示例创建名为MyCommandBar的自定义命令栏:
SubMenuBar_Create()
Application.CommandBars.AddName:
="Mycommandbar"
EndSub
您还可以通过使用Temporary:
=True参数来创建自定义命令栏。
Temporary:
=True参数允许命令栏在您退出Excel时自动重置。
以下代码使用Temporary:
=True参数创建自定义命令栏:
SubMenuBar_Create()
Application.CommandBars.AddName:
="Mycommandbar",Temporary:
=True
EndSub
4.6显示自定义命令栏
以下示例创建并显示自定义的“MyCustomBar”菜单栏,然后用它替换内置的菜单栏:
SubMenuBar_Show()
DimmyNewBarAsObject
SetmyNewBar=CommandBars.Add(Name:
="Custom1",Position:
=msoBarFloating)
'您必须先启用您的自定义菜单栏,然后看见它。
'使菜单栏添加到自定义对话框列表中的可用菜单栏上。
'设置菜单属性设置为True取代内置的菜单栏。
myNewBar.Enabled=True
myNewBar.Visible=True
EndSub
4.7删除自定义命令栏
以下代码示例删除名为“Custom1”的自定义菜单栏:
SubMenuBar_Delete()
CommandBars("Custom1").Delete
EndSub
4.8隐藏命令栏
以下代码示例从可用菜单栏列表中删除内置“图表”菜单栏:
SubMenuBar_Display()
CommandBars("Chart").Enabled=False
EndSub
4.9显示命令栏
以下代码示例从可用菜单栏中添加内置“图表”菜单栏:
SubMenuBar_Display()
CommandBars("Chart").Enabled=True
EndSub
4.10还原内置命令栏
还原菜单栏会重置(菜单和菜单项的)默认控件。
示例代码还原内置“图表”菜单栏:
SubMenuBar_Restore()
CommandBars("Chart").Reset
EndSub
注意:
您只能重置内置菜单栏,不能重置自定义菜单栏。
五、菜单
5.1Add方法用于CommandBarControls对象
新建一个CommandBarControl对象并添加到指定命令栏上的控件集合。
Expression.Add(Type,Id,Parameter,Before,Temporary)
●expression必需。
该表达式返回一个CommandBarControls对象。
●Type(Variant类型)可选。
添加到指定命令栏的控件类型。
可以为下列MsoControlType常量之一:
常量
说明
msoControlButton
命令按钮
msoControlEdit
文本框
msoControlDropdown
下拉列表
msoControlComboBox
组合框
msoControlPopup
弹出菜单
●Id(Variant类型)可选。
指定内置控件的整数。
如果该参数为1,或者忽略该参数,将在命令栏中添加一个空的指定类型的自定义控件。
●Parameter(Variant类型)可选。
对于内置控件,该参数用于容器应用程序运行命令。
对于自定义控件,可以使用该参数向VisualBasic过程传递信息,或用其存储控件信息(类似于第二个Tag属性值)。
●Before(Variant类型)可选。
表示新控件在命令栏上位置的数字。
新控件将插入到该位置控件之前。
如果忽略该参数,控件将添加到指定命令栏的末端。
●Temporary(Variant类型)可选。
设置为True将使新命令栏为临时命令栏。
临时命令栏在关闭容器应用程序时删除。
默认值为False。
5.2向命令栏添加自定义菜单控件
以下代码示例将您通过编程方式添加的菜单名称添加到“工作表”菜单栏中。
例如,此代码会将菜单名称“NewMenu”添加到“工作表”菜单栏中。
注意:
您可以根据需要为该菜单指定任何名称。
SubMenu_Create()
DimmyMnuAsObject
SetmyMnu=CommandBars("Worksheetmenubar").Controls._
Add(Type:
=msoControlPopup,before:
=3)
WithmyMnu
'"&"用以指定快捷键字符(相当于Alt+M).
.Caption="New&Menu"
EndWith
EndSub
5.3禁用命令栏上的菜单控件
禁用的菜单控件在命令栏中显示为灰色,并且不可用。
以下示例禁用“NewMenu”菜单:
SubMenu_Disable()
CommandBars("Worksheetmenubar").Controls("New&Menu").Enabled=False
EndSub
5.4启用命令栏上的菜单控件
以下代码示例启用您在“禁用命令栏上的菜单控件”一节中禁用的NewMenu菜单:
SubMenu_Disable()
CommandBars("Worksheetmenubar").Controls("New&Menu").Enabled=True
EndSub
5.5删除命令栏上的菜单控件
以下代码示例从“工作表”菜单栏中删除您在“向命令栏添加自定义菜单控件”一节中创建的“NewMenu”菜单:
SubMenu_Delete()
CommandBars("Worksheetmenubar").Controls("New&Menu").Delete
EndSub
5.6还原命令栏上的菜单控件
以下代码示例还原“工作表”菜单栏上的内置“图表”菜单栏:
SubMenu_Restore()
DimmyMnuAsObject
SetmyMnu=CommandBars("Chart")
myMnu.Reset
EndSub
六、命令
可以对命令进行的修改与控件的类型有关。
一般来说,按钮要么被启用,要么被隐藏。
而编辑框、下拉列表框和组合框较为灵活一些,因为您可以在列表中添加或删除项目。
另外,还可以通过查看在列表中选中的项目的值来确定执行的操作。
您可以将任何控件的操作更改为内置函数或自定义函数。
下表列出了最常见的控件属性和更改控件的状态、操作或内容的方法:
属性或方法
用途
Add
向命令栏添加命令。
AddItem
向下拉列表框或组合框的下拉列表部分添加项目。
Style
指定按钮上是显示图标还是显示标题。
OnAction
指定用户更改控件值时所运行的过程。
Visible
指定控件是可见的,还是隐藏的。
要了解有关Excel2003和Excel2002中菜单的更多信息,请按照下列步骤操作:
1.启动VisualBasic脚本编辑器。
2.在“帮助”菜单上,单击“MicrosoftVisualBasic帮助”。
3.在“搜索帮助”框中,键入菜单,然后按Enter。
4.单击“添加和管理菜单栏和菜单项(Office)”。
6.1向菜单控件添加分隔条
以下代码示例在“插入”菜单上的工作表命令之前添加分隔条:
SubmenuItem_AddSeparator()
CommandBars("Worksheetmenubar").Controls("插入(&I)")_
.Controls("工作表(&W)").BeginGroup=True
EndSub
注意:
要删除分隔条,请将BeginGroup属性设置为False。
6.2在菜单上创建自定义命令控件
以下代码示例在“工作表”菜单栏的“工具”菜单上创建名为Custom1的新命令,然后,当您单击“Custom1”时,它将运行Code_Custom1宏:
SubmenuItem_Create()
WithCommandBars("Worksheetmenubar").Controls("工具(&T)")
.Controls.Add(Type:
=msoControlButton,Before:
=1).Caption="Custom1"
.Controls("Custom1").OnAction="Code_Custom1"
EndWith
EndSub
6.3在命令控件旁放置选中标记
以下代码示例在Custom1命令未选中的情况下在其旁边放置一个选中标记;如果Custom1命令已选中,则将删除该选中标记:
SubmenuItem_checkMark()
DimmyPopupasObject
SetmyPopup=CommandBars("Worksheetmenubar").Controls("工具(&T)")
IfmyPopup.Controls("Custom1").State=msoButtonDownThen
'删除选中标记旁边的菜单项。
myPopup.Controls("Custom1").State=msoButtonUp
MsgBox"Custom1isnowunchecked"
Else
'添加复选标记旁边的菜单项。
myPopup.Controls("Custom1").State=msoButtonDown
MsgBox"Custom1isnowchecked"
EndIf
EndSub
6.4禁用命令栏上的命令控件
以下代码示例禁用您在“在菜单上创建自定义命令控件”一节中在“工具”菜单上创建的Custom1命令:
SubMenuItem_Disable()
DimmyCmdasObject
SetmyCmd=CommandBars("Worksheetmenubar").Controls("工具(&T)")
myCmd.Controls("Custom1").Enabled=False
EndSub
6.5启用命令栏上的命令控件
以下代码示例启用您在“禁用命令栏上的命令控件”一节中禁用的Custom1命令:
SubMenuItem_Enable()
DimmyCmdasObject
SetmyCmd=CommandBars("Worksheetmenubar").Controls("工具(&T)")
myCmd.Controls("Custom1").Enabled=True
EndSub
6.6删除菜单上的命令控件
以下代码示例删除“文件”菜单上的“保存”命令:
SubmenuItem_Delete()
DimmyCmdAsObject
SetmyCmd=CommandBars("Worksheetmenubar").Controls("文件(&F)")
myCmd.Controls("保存(&S)").Delete
EndSub
6.7还原菜单上的内置命令控件
要还原菜单上的命令控件,必须知道该控件的标识(ID)号。
要确定ID号,请参见“返回命令栏控件的ID”一节。
以下示例先删除您在“删除菜单上的命令控件”一节中删除的“保存”命令,然后又将其还原:
SubmenuItem_Restore()
DimmyCmdAsObject
SetmyCmd=CommandBars("Worksheetmenubar").Controls("文件(&F)")
'Id3为保存子菜单项ID号.
myCmd.Controls.AddType:
=msoControlButton,ID:
=3,Before:
=5
EndSub
七、子菜单
当您单击某个命令时,父菜单的一侧会出现子菜单。
作为子菜单控件的命令在其名称右边有一个黑色小箭头。
7.1添加子菜单
以下代码示例向“工作表”菜单栏上的“工具”菜单添加名为“NewSub”的新子菜单:
SubSubMenu_Create()
DimnewSubasObject
SetnewSub=CommandBars("Worksheetmenubar").Controls("工具(&T)")
WithnewSub
.Controls.Add(Type:
=msoControlPopup,Before:
=1).Caption="NewSub"
EndWith
EndSub
7.2向子菜单添加命令
以下代码示例向“NewSub”子菜单添加名为“SubItem1”的新命令,然后,当您单击“SubItem1”时,它将运行Code_SubItem1宏:
SubSubMenu_AddItem()
DimnewSubItemasObject
SetnewSubItem=CommandBars("Worksheetmenubar")_
.Controls("工具(&T)").Controls("NewSub")
WithnewSubItem
.Controls.Add(Type:
=msoControlButton,Before
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Excel VBA自定义菜单和菜单栏 VBA 自定义 菜单 菜单栏
![提示](https://static.bdocx.com/images/bang_tan.gif)