|
楼主 |
发表于 2009-3-17 10:39
|
显示全部楼层
第7部分菜单和工具栏
技巧79 在菜单中添加菜单项
在Excel工作表的菜单中可以添加新的菜单项和子菜单,如下面的代码所示。- #001 Sub myTools()
- #002 Dim myTools As CommandBarPopup
- #003 Dim myCap As Variant
- #004 Dim myid As Variant
- #005 Dim i As Byte
- #006 myCap = Array("基础应用", "VBA程序开发", "函数与公式", "图表与图形", "数据透视表")
- #007 myid = Array(281, 283, 285, 287, 292)
- #008 With Application.CommandBars("Worksheet menu bar")
- #009 .Reset
- #010 Set myTools = .Controls("帮助(&H)").Controls.Add(Type:=msoControlPopup, Before:=1)
- #011 With myTools
- #012 .Caption = "Excel Home 技术论坛"
- #013 .BeginGroup = True
- #014 For i = 1 To 5
- #015 With .Controls.Add(Type:=msoControlButton)
- #016 .Caption = myCap(i - 1)
- #017 .FaceId = myid(i - 1)
- #018 .OnAction = "myC"
- #019 End With
- #020 Next
- #021 End With
- #022 End With
- #023 Set myTools = Nothing
- #024 End Sub
复制代码 代码解析:
myTools过程使用Add方法在Excel工作表菜单栏中的“帮助”菜单中添加一个标题为“Excel Home 技术论坛”的菜单项和5个子菜单。
第2行到第5行代码声明变量类型。
第6、7行代码使用Array函数创建两个数组用于保存子菜单的名称和图标ID。
第9行代码,在添加菜单项前先使用Reset方法重置菜单栏以免重复添加菜单项。Reset方法重置一个内置控件,恢复该控件原来对应的动作,并将各属性恢复成初始状态,语法如下:
expression.Reset
参数expression 是必需的,返回一个命令栏或命令栏控件对象。
第10行代码,使用Add方法在Excel工作表菜单栏中的“帮助”菜单中添加菜单项。Add方法应用于CommandBarControls对象时,新建一个CommandBarControl对象并添加到指定命令栏上的控件集合,语法如下:
expression.Add(Type, Id, Parameter, Before, Temporary)
参数expression 是必需的,返回一个CommandBarControls对象,代表命令栏中的所有控件。
参数Type是可选的,添加到指定命令栏的控件类型,可以为表格所列的MsoControlType常数之一。
因为在本例中将添加的是带有子菜单的菜单项,所以将参数Type设置为弹出式控件。
参数Id是可选的,标识整数。如果将该参数设置为 1或者忽略,将在命令栏中添加一个空的指定类型的自定义控件。
参数Parameter是可选的,对于内置控件,该参数用于容器应用程序运行命令。对于自定义控件,可以使用该参数向Visual Basic过程传递信息,或用其存储控件信息。
参数Before是可选的,表示新控件在命令栏上位置的数字。新控件将插入到该位置控件之前。如果忽略该参数,控件将添加到指定命令栏的末端。
在本例中将Before参数设置为1,菜单项添加到“帮助”菜单的顶端。
参数Temporary是可选的。设置为True将使添加的菜单项为临时的,在关闭应用程序时删除。默认值为False。
第12行代码,设定新添加菜单项的Caption属性为“Excel Home 技术论坛”。Caption属性返回或设置命令栏控件的标题。
第13行代码,设置新添加菜单项的BeginGroup属性为True,分组显示。
第14行到第19行代码,在“Excel Home 技术论坛”菜单项上添加五个子菜单并设置其Caption属性、FaceId属性和OnAction属性。
FaceId属性设置出现在菜单标题左侧的图标,以数字表示,一个数字代表一个内置的图标。
OnAction属性设置一个VBA的过程名,该过程在用户单击子菜单时运行,本例中设置为下面的过程。- #001 Public Sub myC()
- #002 MsgBox "您选择了: " & Application.CommandBars.ActionControl.Caption
- #003 End Sub
复制代码 代码解析:
myC过程是单击新添加子菜单所运行过程,为了演示方便在这里只使用MsgBox函数显示所其Caption属性。
删除新添加的菜单项及子菜单的代码如下所示。- #001 Sub DelmyTools()
- #002 Application.CommandBars("Worksheet menu bar").Reset
- #003 End Sub
复制代码 代码解析:
DelmyTools过程使用Reset方法重置菜单栏,删除添加的菜单项及子菜单。
为了在打开工作簿时自动添加菜单项,需要在工作簿的Activate事件中调用myTools过程,如下面的代码所示。- #001 Private Sub Workbook_Activate()
- #002 Call myTools
- #003 End Sub
复制代码 为了在关闭工作簿时删除新添加的菜单项,还需要在工作簿的Deactivate事件中调用DelmyTools过程,如下面的代码所示。- #001 Private Sub Workbook_Deactivate()
- #002 Call DelmyTools
- #003 End Sub
复制代码 如果希望这个菜单为所有工作簿使用,那么就应该在工作簿的Open事件中调用myTools过程,在BeforeClose事件中调用DelmyTools过程。
运行myTools过程,将在Excel工作表菜单栏中的“帮助”菜单中添加一个名为“Excel Home 技术论坛”的菜单项及五个子菜单,如图所示。
|
|