菜单自己做
一.手工方式来自定义菜单的方法
各位E友在制作各种小程序时,一定考虑到在EXCEL里用自己的菜单来代替原有的菜单来修饰程序,论坛里也有不少这样的例子,恰巧我也在学习这方面的知识,就把它整理一下,算是和大家共同学习了。
说到菜单的制作,大家一定要知道菜单实际上使用了三个对象:包容器、菜单和菜单项。包容器跟工具栏中的一样,叫做命令栏,也叫做菜单栏,位于命令栏中的就是菜单。菜单有“文件”、“编辑”、“帮助”菜单等等,每个菜单中内容的就是菜单项,比如,“文件”菜单包含了像“打开”、“保存”和“打印”之类的菜单项(或者叫做菜单命令),理解了以上内容就好办了。
但在制作真正的自己的菜单前,大家最好要熟悉用手工方式来自定义菜单的方法。这样的好处是我们可以自己录制宏,取得我们需要的各种方法属性。那么现在就开始用手工方式来自定义菜单吧。打开一个新的工作薄,进行以下步骤:
1)打开一个新工作簿。
2)用鼠标右键单击菜单栏,从弹出的菜单中选择“自定义”,“自定义”对话框显示出来。
3)选择“命令”选项卡,就显示了可以使用的菜单类别和命令的列表。
4)在“类别”列表框中,找到并选择“新菜单”,在“命令”列表框中,就将看到“新菜单”。
5)从“命令”列表框中拖拉“新菜单”。我们准备把“新菜单”放置在“数据”和“窗口”菜单之间,当定位合适时,就能够看到这两个菜单之间将出现黑色的竖条。
6)释放鼠标键,把菜单放置到新位置上。
7)添加了这个菜单以后,下一步是重新给新菜单命名。用鼠标右键单击“新菜单”,选择“名称”,输入计划作为该菜单的名称。
8)下一步是添加一个新的菜单项到计划菜单中。再次从“命令”列表框中选择“新菜单”,把它拖到计划菜单。当拖到该菜单上时,计划菜单下面就显示出一个灰色框,把新菜单拖到这个框中。当定位合适时,这个框中将显示一条竖直方向的黑线,
9)用鼠标右键单击“新菜单”,选择“重新命名”。
10)输入& 执行作为名称。
11)现在可以准备给执行菜单项指定宏了。用鼠标右键单击执行,从弹出的菜单中选择“指定宏”,“指定宏”对话框显示出来。
12)选择任意的宏,然后单击“确定”按钮。
13)单击“关闭”按钮来关闭“自定义”对话框。
关闭“自定义”对话框以后,就可以准备使用新菜单了。
以上就是手工方式来自定义菜单的方法,但手工方式的菜单会一直留在菜单栏里,对不熟悉EXCEL的人来说,容易造成误操作,所以下面我们就开始通过编程方式来添加使用菜单。
二.V B A代码来自定义菜单的方法
我们先熟悉一些理论的东西,因为理论指导实践吗!呵呵
使用V B A代码来添加菜单跟添加工具栏非常相似。实际上是把菜单项添加到跟工具栏共用的集合,也就是叫做Command Bars的集合中。添加菜单栏的基本语法如下:
CommandBars.Add ( Name, Position, MenuBar, Temporary )
Name参数指定了命令栏的名称。令人惊奇的是, Name参数居然是可选的。如果没有给这个参数提供值的话,系统就会给这个命令栏分配一个默认的名称,比如Custom1。
Position(位置)是另外一个可选的参数,这个参数允许选择新命令栏的位置或者类型。
因为下面要创建的是菜单栏,所以需要把MenuBar参数设置为True。把这个参数设置为True就用新命令栏取代了当前活动的菜单栏。该参数的默认值是False。
Temporary(临时的),它也是可选的。把这个参数设置为True就使得新命令栏成为临时的。临时命令栏在包容器应用程序关闭时被删除。这个参数的默认值是Fals e。在你的应用程序中,也许想要把这个参数设置为True,这样就不会把新增加的临时菜单栏遗留在Excel环境中。
现在开始学习菜单:我们即将创建新菜单,并显示新菜单来取代工作表菜单。要创建自定义菜单的话,关闭所有打开的工作簿,然后打开一个新工作簿,按下A l t + F 11切换到Vi s u a lB a s i c编辑器,在这个新工作簿中插入一个模块,接下来请执行下面的步骤:
1)创建一个新过程,命名为My First Menubar。
2)在这个新过程中输入下面的代码:
Dim mybar As CommandBar
Set mybar = CommandBars.Add(Name: ="计划", _
Position: = msoBarTop, MenuBar:=True, temporary:=True )
mybar.Visible = True
Command Bars ( " Worksheet Menu Bar").Visible = False
3)另外创建一个过程,命名为UndoMyMenu。
4)在这个过程中输入下面的代码:CommandBars ( "计划" ). Delete
5)切换回工作簿,在Sheet1上创建一个命令按钮,把宏过程My First Menubar分配给这个命令按钮,并把按钮的标题设置为“计划菜单”。
6)另外创建一个命令按钮,把宏过程Uodo My Menu分配给它,并把它的标题设置为“删除菜单”。
7)单击计划菜单按钮,就显示出一个空菜单来取代默认的工作表菜单。
8)单击删除菜单按钮,工作表菜单又恢复了。
完成了上面介绍的这些步骤以后,你已经知道怎样显示自定义的和内置的菜单了。刚才使用VBA代码不但显示了一个自定义菜单,也创建了该自定义菜单。
下面将上面的代码做一下详细的解释:
代码解释:
在这个过程中所做的第一件事情是创建了一个对象变量,这个对象变量在用来创建菜单栏的A d d方法时进行赋值:
Dim mybar As CommandBar
Set mybar = CommandBars.Add(Name: ="计划", _
Position: = msoBarTop, MenuBar:=True, temporary:=True )
菜单栏创建以后,通过把Visible属性设置为True来显示它,同时也把工作表菜单栏的这个属性设置为False,以便不显示工作表的菜单栏。
mybar. Visible = True
CommandBars ( " Worksheet Menu Bar "). Visible = False
今天就到这里,如果大家有兴趣的话我将继续和大家学习探讨如何添加菜单和菜单项
三.添加菜单和菜单项
创建菜单的下一步是添加菜单和菜单栏。要实现这一点的话,将使用Controls集合的Add方法:
Name Of Menu.Controls. Add( Type, Id, Parameter, Before, Temporary )
你很可能已经猜测到, Name Of Menu需要用要添加的菜单名称来替换,而Type参数对于菜单而言,取值应该是msoControl Popup。参数I d的取值取决于要添加的菜单类型。如果添加的是自定义菜单,那么Id取值应该为1。如果是内置菜单,那么Id取值应该是一个整数,这个整数指定了所希望的菜单。那么,怎样去找到哪个菜单对应哪个整数呢?实际上,最简单的方式是开始录制一个宏,把需要向菜单栏添加的菜单添加进去,记录的菜单就拥有了所需要的那个整数值。
Parameter参数可选,它的取值取决于要使用的菜单类型。如果是内置菜单,那么很可能就不需要提供该参数的值。如果是自定义菜单,就可以使用这个参数来把信息发送到Visua lB asic过程中。还可以利用这个参数来存储控件的有关信息。
Before参数也可选,它的取值是一个代表菜单栏上新控件位置的数字。菜单(或者菜单项)将插入到位于所提供位置上的那个控件的前面。如果没有给该参数提供值的话,菜单或者菜单项就添加到最后。
如果想要菜单或者菜单项成为临时的,那么就应该把可选参数Temporary的值设置为True。该参数的默认值是False。
有时候,可能想要自定义自己的菜单,以便能够启动简单的过程,下面的练习将介绍怎样实现这一点,将添加“文件”菜单和一个自定义菜单到计划菜单栏上。首先,需要修改My FirstMenu过程以添加菜单到菜单栏上,然后将添加菜单项到菜单中。现在修改
My FirstMenu:
Dim mybar As CommandBar
Dim mymenu As Object
Dim mymenuitem As Object
Set mybar = CommandBars.Add(Name: ="计划", _
Position: = msoBarTop, MenuBar:=True, temporary:=True )
mybar.Controls.Add Type:=msoControlPopup, ID:=30002,Before:=1
Set mymenu = mybar. Controls. Add ( Type:=msoControlPopup, _
Temporary : = True )
mymenu.Caption = "计划"
Set mymenuitem = mymenu.Controls.Add(Type : = msoControlButton , ID : = 1 )
mymenuitem.Caption = "执行"
mymenuitem.Style = msoButtonCaption
mymenuitem.OnAction = "ShowMe"
mybar.Visible = True
Command Bars ( " Worksheet Menu Bar").Visible = False
我们需要创建一个新过程,在这个例子中,把它命名为ShowMe。在这个新过程中输入下面的代码:
MsgBox " 我成功了! "
现在让我们来试验我们做的菜单。
现在,我们花一些时间来分析对My FirstMenu过程所做出的修改。可以看到代码首先创建了两个新的对象变量:
Dim mymenu As Object
Dim mymenuitem As Object
过程中下一行新修改的代码添加了“文件”菜单。“文件”菜单是这个菜单栏上的第一个菜单,所以Before参数的取值是1:
mybar. Controls. Add Type := msoControlPopup, ID := 30002, Before :=1
下一个添加的菜单是自定义类型的:
Set mymenu = mybar. Controls. Add ( Type := msoControlPopup,_Temporary := Tr u e )
mymenu.Caption = "计划"
添加了自定义菜单以后,又添加了一个自定义菜单项:
Set mymenuitem = mymenu. Controls. Add ( Type := msoControlButton, ID :=1)
自定义菜单项需要设置它的几个属性,
Caption属性的取值就是显示的菜单项文本Style(样式)设置为msoButtonCaption是因为这个菜单项只有显示的文本。菜单项是没有与之相关联的图标的。OnAction属性设置了当菜单项选中时需要运行的那个过程:
mymenuitem. Caption = " 执行"
mymenuitem. Style = msoButtonCaption
mymenuitem. OnAction = " ShowMe"
现在,你已经知道怎样向菜单栏上添加菜单和菜单项了,不管是添加菜单还是菜单项,都要使用Controls集合,关键是要明白把控件添加到哪种类型的对象中去。添加菜单时,是把控件添加到菜单栏上。而添加菜单项时,是把控件添加到菜单中。
那么如果我们不想自己创建菜单栏,而是想把菜单项直接添加到EXCEL自带的菜单栏中呢?先让我们录制一个宏来得到我们想要的参数。
开始录制一个宏,把需要向菜单栏添加的菜单添加进去要添加内置菜单到菜单栏的话,用鼠标右键单击菜单栏,从弹出的菜单中选择“自定义”,切换到“命令”选项卡页。在“类别”列表框中,找到并选择“新菜单”,在“命令”列表框中,就将看到“新菜单”,从“命令”列表框中拖拉“新菜单”。我们准备把“新菜单”放置在菜单最后,释放鼠标键,把菜单放置到新位置上。再次从“命令”列表框中拖拉“新菜单”并放到刚才放的新菜单中形成菜单项,然后关闭宏录制。打开刚才录制的宏得到以下代码:
Application.CommandBars("Worksheet Menu Bar").Controls.Add Type:= _
msoControlPopup, Before:=11
Application.CommandBars("Custom Popup 5074997").Controls.Add Type:= _
msoControlPopup, Before:=1
结合上面的代码修改如下:
Public Sub MyFirstMenubar2()
Dim mybar As CommandBar
Dim mymenu As Object
Dim mymenuitem As Object
Set mymenu = CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlPopup, ID:=1,
Before:=11, Temporary:=True)
mymenu.Caption = "切料计划"
Set mymenuitem = mymenu.Controls.Add(Type:=msoControlButton, ID:=1)
mymenuitem.Caption = "执行"
mymenuitem.Style = msoButtonCaption
mymenuitem.OnAction = " ShowMe "
End Sub
再切换回工作簿,在Sheet1上创建一个命令按钮,把宏过程MyFirstMenubar2分配给这个命令按钮,并把按钮的标题设置为“计划菜单2”。执行“计划菜单2”就得到了我们想要的结果!
四.添加二级下拉菜单
看大家的学习热情这么高,我就将菜单制作在更新一次,添加如下内容:
1、添加二级下拉菜单
2、二级下拉菜单内添加系统程序“保存”和自定义程序
3、添加图标和间隔线美化程序
相信有了上面的讲解大家应该对菜单的制作有了初步的认识,下面我们就来加强和美化菜单。在计划菜单程序的下面添加如下代码:
Set mymenuitem = mymenu.Controls.Add(Type:=msoControlPopup) '定义子菜单
mymenuitem.Caption = "文件(&F)" '确定菜单名称
With mymenuitem
Set BER = .Controls.Add(Type:=msoControlButton) '定义二级子菜单
With BER
.Caption = "保存" '确定二级子菜单名称
.BeginGroup = True '填加间隔线
.OnAction = "保存" '确定运行程序
.FaceId = 3 '确定图标
End With
Set BER = .Controls.Add(Type:=msoControlButton)
With BER
.Caption = "工票查询" '确定二级子菜单名称
.BeginGroup = True '填加间隔线
.OnAction = "ShowMe '确定运行程序"
.FaceId = 65 '确定图标
End With
Set mybar = Nothing '释放内存
Set mymenu = Nothing
Set mymenuitem = Nothing
Set BER = Nothing
End With
五.例:自定义菜单===================================================
命令栏:工具栏、菜单栏和快捷(用鼠标右键单击)菜单合并为一种功能,这就是用户界面中的“工具栏”和 VBA 中的“命令栏”。命令栏为下列三种类型之一:菜单栏、工具栏或弹出菜单。
命令栏控件:菜单栏、工具栏、菜单、子菜单或快捷菜单上的内置或自定义控件。可添加到命令栏中的自定义控件包括按钮、编辑框、下拉列表框和显示菜单或子菜单的弹出控件。
Option Explicit
Sub 添加菜单()
Dim 主菜单 As CommandBar '声明一个对象(代表容器应用程序中的一个命令栏)变量
Dim BER As CommandBarControl '声明一个对象(代表一个命令栏控件)变量
On Error Resume Next
Application.CommandBars("主菜单").Delete '从集合中删除指定菜单对象
Set 主菜单 = Application.CommandBars.Add(temporary:=True) '新建一个命令栏并添加到集合
With 主菜单
.Visible = True '指定菜单对象可见
.Name = "主菜单" '指定菜单对象的名称
.Position = msoBarTop '指定菜单对象的位置-顶部
'开始添加文件子菜单===================================================
Set BER = .Controls.Add(Type:=msoControlButton) '新建一个命令栏控件并添加到集合
With BER
.Caption = "返回系统界面" '设置标题
.BeginGroup = True '设置显示在命令栏控件组的最前面
.OnAction = " " '设置子过程名
.FaceId = 1640 '设置一个按钮图符的 ID 号
.Style = msoButtonIconAndCaptionBelow '设置命令栏按钮控件的显示方式
End With
Set BER = .Controls.Add(Type:=msoControlButton) '新建一个命令栏控件并添加到集合
With BER
.Caption = "保存" '设置标题
.BeginGroup = True '设置显示在命令栏控件组的最前面
.OnAction = " " '设置子过程名
.FaceId = 3 '设置一个按钮图符的 ID 号
.Style = msoButtonIconAndCaptionBelow '设置命令栏按钮控件的显示方式
End With
Set BER = .Controls.Add(Type:=msoControlButton) '新建一个命令栏控件并添加到集合
With BER
.Caption = "打印预览" '设置标题
.BeginGroup = True '设置显示在命令栏控件组的最前面
.OnAction = " " '设置子过程名
.FaceId = 109 '设置一个按钮图符的 ID 号
.Style = msoButtonIconAndCaptionBelow '设置命令栏按钮控件的显示方式
End With
Set BER = .Controls.Add(Type:=msoControlButton) '新建一个命令栏控件并添加到集合
With BER
.Caption = "打印" '设置标题
.FaceId = 4 '设置一个按钮图符的 ID 号
.OnAction = " " '设置子过程名
.Style = msoButtonIconAndCaptionBelow '设置命令栏按钮控件的显示方式
End With
Set BER = .Controls.Add(Type:=msoControlButton) '新建一个命令栏控件并添加到集合
With BER
.Caption = "退出系统" '设置标题
.BeginGroup = True '设置显示在命令栏控件组的最前面
.OnAction = " " '设置子过程名
.FaceId = 1640 '设置一个按钮图符的 ID 号
.Style = msoButtonIconAndCaptionBelow '设置命令栏按钮控件的显示方式
End With
End With
'添加文件子菜单结束===========================================
Set 主菜单 = Nothing
Set BER = Nothing
End Sub


档案
日志
相册
视频



评论
想第一时间抢沙发么?