CommandBar介绍-菜单栏
在Excel5和Excel95时,菜单和工具栏分别使用不同的对象。从Excel97开始,所有的菜单和工具栏都使用同一种对象CommandBar来表示。
一般来说包括三种常用的CommandBar类型。通过CommandBar对象的Type属性可以判断该对象是下列三种类型的其中之一。Type属性返回一个msoBarType常量(包括msoBarNormal, msoBarMenu, msoBarPopup)。
第一种是菜单栏,msoBarMenu,可以自定义菜单以及子菜单添加在工作表的菜单上。如下图:
第二种是工具栏,msoBarNormal,可以在Excel的各个位置创建自定义工具栏。如下图:
第三种是右键菜单,msoBarPopup,可以自定义右键菜单,或在默认右键菜单上添加菜单项。如下图:
CommandBar对象包含的项目叫做Control。Excel2003包括大约124个内置CommandBar和上千个Control。
接着的三篇文章将介绍怎样使用VBA代码创建自定义菜单和工具栏。
自定义菜单
Excel有两种常用的菜单,一个叫做工作表菜单栏(Worksheet Menu Bar),另外一个叫做图表菜单栏(Chart Menu Bar)。Chart Menu Bar在选择图表时显示。
下面的代码分别创建工作表菜单和图表菜单。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | Sub DeleteMenu() On Error Resume Next '关闭文件前删除自定义菜单 CommandBars( "Worksheet Menu Bar" ).Controls( "MyMenu" ).Delete CommandBars( "Chart Menu Bar" ).Controls( "MyMenu" ).Delete End Sub Sub CloseMe() DeleteMenu ThisWorkbook.Close False End Sub Sub Auto_Close() Call CloseMe End Sub Sub Auto_Open() Dim newMenu As CommandBarControl Dim i As Integer '如发现有相同菜单,关闭该菜单后再打开本文件 On Error Resume Next CommandBars( "Worksheet Menu Bar" ).Controls( "MyMenu" ).Delete On Error GoTo 0 '在帮助菜单后添加自定义菜单 Set newMenu = CommandBars( "Worksheet Menu Bar" ).Controls.Add(Type:=msoControlPopup, _ Temporary:=True, Before:=CommandBars( "Worksheet Menu Bar" ).Controls.Count) With newMenu .Caption = "MyMenu" ' 第一级菜单 With .CommandBar.Controls.Add(Type:=msoControlButton) .Caption = "Menu 01" .State = msoButtonDown .Style = msoButtonCaption .OnAction = "CheckMenu" End With '添加弹出菜单 With .CommandBar.Controls.Add(Type:=msoControlPopup) .Caption = "Menu 02" '第二级菜单 With .Controls.Add(Type:=msoControlButton) .Caption = "SubMenu 01" '.Style = msoButtonCaption ' 设置Face ID,Style属性不能设置为msoButtonCaption .FaceId = 16 .OnAction = "MenuProc" End With With .Controls.Add(Type:=msoControlButton) .Caption = "SubMenu 02" .Style = msoButtonCaption .OnAction = "MenuProc" End With End With ' 退出菜单 With .CommandBar.Controls.Add(Type:=msoControlButton) .Caption = "退出" .BeginGroup = True .Picture = LoadPicture(ThisWorkbook.Path & "\menufore.bmp" ) .Mask = LoadPicture(ThisWorkbook.Path & "\menumask.bmp" ) .OnAction = "CloseMe" End With End With ' 如果已经存在菜单,删除 On Error Resume Next CommandBars( "Chart Menu Bar" ).Controls( "MyMenu" ).Delete On Error GoTo 0 '在帮助菜单后添加自定义图表菜单 With CommandBars( "Chart Menu Bar" ).Controls.Add(Type:=msoControlPopup, _ Temporary:=True, Before:=CommandBars( "Chart Menu Bar" ).Controls.Count) .Caption = "MyMenu" With .CommandBar.Controls.Add(Type:=msoControlButton) .Caption = "ChartMenu" .Style = msoButtonCaption .OnAction = "MenuProc" End With End With End Sub Sub CheckMenu() With CommandBars.ActionControl If .State = msoButtonDown Then .State = msoButtonUp Else .State = msoButtonDown End If End With End Sub Sub MenuProc() Dim sCall As String sCall = CommandBars.ActionControl.Caption MsgBox "你点击了: " & sCall, vbInformation End Sub |
Auto_Open和Auto_Close过程分别在打开和关闭工作簿时执行。CommandBars(”Worksheet Menu Bar”)表示工作表菜单,使用该对象的Controls属性的Add方法可以添加自定义菜单。
CommandBarControl对象的Add方法语法如下:
expression.Add(Type, Id, Parameter, Before, Temporary)
expression 必需。该表达式返回一个 CommandBarControls 对象。
Type Variant 类型,可选。添加到指定命令栏的控件类型。可以为下列 MsoControlType 常量之一:msoControlButton、msoControlEdit、msoControlDropdown、msoControlComboBox 或 msoControlPopup。
Id Variant 类型,可选。指定内置控件的整数。如果该参数为 1,或者忽略该参数,将在命令栏中添加一个空的指定类型的自定义控件。
Parameter Variant 类型,可选。对于内置控件,该参数用于容器应用程序运行命令。对于自定义控件,可以使用该参数向 Visual Basic 过程传递信息,或用其存储控件信息(类似于第二个 Tag 属性值)。
Before Variant 类型,可选。表示新控件在命令栏上位置的数字。新控件将插入到该位置控件之前。如果忽略该参数,控件将添加到指定命令栏的末端。
Temporary Variant 类型,可选。设置为 True 将使新命令栏为临时命令栏。临时命令栏在关闭容器应用程序时删除。默认值为 False。
对于主菜单的命令栏,Type属性一般使用msoControlPopup。如果第一级菜单不是弹出菜单,Type属性一般使用msoControlButton。如果需要第二级菜单,则需要设置第一级菜单的Type属性为msoControlPopup。
菜单命令栏控件的几个常用属性包括:
Caption:命令栏控件的题注;
OnAction:一个Visual Basic的过程名,该过程在用户单击或更改某命令栏控件的值时运行;
BeginGroup:表示控件是否现在的命令栏控件组的最前面;
State:这个属性没有在帮助文件中显示。这个属性可以为两个常数之一:msoButtonDown和msoButtonUp。msoButtonDown表示在菜单左侧显示一个检查符号。msoButtonUP则取消选择;
可以通过下面的代码来处理菜单栏的选择和取消:
1 2 3 4 5 6 7 8 9 | Sub CheckMenu() With CommandBars.ActionControl If .State = msoButtonDown Then .State = msoButtonUp Else .State = msoButtonDown End If End With End Sub |
Faceid:菜单栏控件图标;
另外还可以使用Picture和Mask属性来制作自定义的图标。
1 2 | .Picture = LoadPicture(ThisWorkbook.Path & "\menufore.bmp" ) .Mask = LoadPicture(ThisWorkbook.Path & "\menumask.bmp" ) |
图表菜单栏的创建方法和工作表菜单栏类似。
在关闭文件时,一般需要清除自定义菜单。可以直接使用CommandBarControl对象的Delete方法。
1 2 3 4 5 6 | Sub DeleteMenu() On Error Resume Next ' 关闭文件前删除自定义菜单 CommandBars( "Worksheet Menu Bar" ).Controls( "MyMenu" ).Delete CommandBars( "Chart Menu Bar" ).Controls( "MyMenu" ).Delete End Sub |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!