分享

CommandBar介绍-菜单栏

 yuxinrong 2010-01-12

 

在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在选择图表时显示。
下面的代码分别创建工作表菜单和图表菜单。

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则取消选择;
可以通过下面的代码来处理菜单栏的选择和取消:

Sub CheckMenu()
With CommandBars.ActionControl
If .State = msoButtonDown Then
.State = msoButtonUp
Else
.State = msoButtonDown
End If
End With
End Sub

Faceid:菜单栏控件图标;
另外还可以使用Picture和Mask属性来制作自定义的图标。

.Picture = LoadPicture(ThisWorkbook.Path & "\menufore.bmp")
.Mask = LoadPicture(ThisWorkbook.Path & "\menumask.bmp")

图表菜单栏的创建方法和工作表菜单栏类似。

在关闭文件时,一般需要清除自定义菜单。可以直接使用CommandBarControl对象的Delete方法。

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

Related posts:

  1. CommandBar介绍-工具栏
  2. CommandBar介绍-右键菜单
  3. Excel中的窗体控件和ActiveX控件
  4. Excel 2007 Range对象开发指南 - 下
  5. Excel2003和Excel2007中的Sparkline

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多