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

将上面的代码复制到一个标准模块中,保存文件,然后重新打开,将生成如下工作表菜单栏:

图表菜单栏在选择图表时显示,如下图:

示例文件下载:Box.Net | SkyDrive

posted @   多见多闻  阅读(1417)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示