大家好,我们今日继续讲解VBA代码解决方案的第121讲内容:如何在Excel工作表的菜单中自定义添加新的菜单项和子菜单
在我之前的文章中讲到,我最初VBA是学习前辈的代码,前辈的文件响应代码就是通过菜单的自定义来实现的,今日我们也来谈谈自定义菜单的问题。添加菜单可以用Add方法。
Add方法应用于CommandBarControls对象时,新建一个CommandBarControl对象并添加到指定命令栏上的控件集合,语法如下:
expression.Add(Type, Id, Parameter, Before, Temporary)
参数expression 是必须的,返回一个CommandBarControls对象,代表命令栏中的所有控件。
参数Type是可选的,添加到指定命令栏的控件类型,可以为下面所列的常数之一。
msoControlButton 1 命令按钮
msoControlEdit 2 文本框
msoControlDropdown 3 下拉列表控制框
msoControlComboBox 4 下拉组合控制框
msoControlPopup 10 弹出式控件
参数Id是可选的,标识整数。如果将该参数设置为 1或者忽略,将在命令栏中添加一个空的指定类型的自定义控件。
参数Parameter是可选的,对于内置控件,该参数用于容器应用程序运行命令。对于自定义控件,可以使用该参数向Visual Basic过程传递信息,或用其存储控件信息。
参数Before是可选的,表示新控件在命令栏上位置的数字。新控件将插入到该位置控件之前。如果忽略该参数,控件将添加到指定命令栏的末端。
参数Temporary是可选的。设置为True将使添加的菜单项为临时的,在关闭应用程序时删除。默认值为False。
下面我们就一个实例来讲解如何添加菜单。如下面的代码所示。
Sub MynzTools()
Dim myTools As CommandBarPopup
Dim myCap, myAct As Variant
Dim myid As Variant
Dim i As Byte
myCap = Array("VBA代码解决方案1", "VBA代码解决方案2", "VBA代码解决方案3")
myAct = Array("myNz1", "myNz2", "myNz3")
With Application.CommandBars("Worksheet menu bar")
.Reset
Set myTools = .Controls.Add(Type:=msoControlPopup)
With myTools
.Caption = "VBA学习"
.BeginGroup = True
For i = 1 To 3
With .Controls.Add(Type:=msoControlButton)
.Caption = myCap(i - 1)
.OnAction = myAct(i - 1)
End With
Next
End With
End With
Set myTools = Nothing
End Sub
Sub MynzDelmyTools()
Application.CommandBars("Worksheet menu bar").Reset
End Sub
Sub myNz1()
MsgBox "欢迎学习VBA代码解决方案第一册"
End Sub
Sub myNz2()
MsgBox "欢迎学习VBA代码解决方案第二册"
End Sub
Sub myNz3()
MsgBox "欢迎学习VBA代码解决方案第三册"
End Sub
代码解析:myTools过程使用Add方法在Excel工作表菜单栏中加一个标题为"VBA学习"的菜单项和3个子菜单。
第2行到第5行代码声明变量类型。
第6,7行代码使用Array函数创建数组用于保存子菜单的名称,和菜单的动作
第9行代码,在添加菜单项前先使用Reset方法重置菜单栏以免重复添加菜单项。Reset方法重置一个内置控件,恢复该控件原来对应的动作,并将各属性恢复成初始状态,
语法如下:expression.Reset
参数expression 是必须的,返回一个命令栏或命令栏控件对象。
第10行代码,使用Add方法在Excel工作表菜单栏中添加菜单项。因为在本例中将添加的是带有子菜单的菜单项,所以将参数Type设置为弹出式控件。
第12行代码,设定新添加菜单项的Caption属性为"VBA学习"。Caption属性返回或设置命令栏控件的标题。
第13行代码,设置新添加菜单项的BeginGroup属性为True,分组显示。
第14行到第18行代码,在"VBA学习"菜单项上添加3个子菜单并设置其Caption属性。和相应的动作。
好了,我们看我们的运行效果:
运行前界面:
点击添加菜单:
点击"VBA代码解决方案1":弹出对话框效果。
上述代码中:
Sub MynzDelmyTools()
Application.CommandBars("Worksheet menu bar").Reset
End Sub
是重置菜单,也就是说在退出前要重置一下菜单。
关于菜单内容还有一些内容,或许充实到结集后的文章中。本篇的文章太长了。
今日内容回向:
1. 如何设置菜单?
2 如何让菜单响应不同的动作?