CommandBar对象介绍

CommandBar对象代表三个Excel用户界面元素:

  • 自定义工具栏
  • 自定义菜单
  • 自定义(右键)快捷菜单

在Excel 2007中,CommandBar对象出现在一个相当奇怪的位置。如果编写定制菜单或工具栏的VBA代码,Excel会拦截代码并忽略一些命令,定制的菜单和工具栏将出现在加载项选项卡中的菜单命令或自定义工具栏组中。为便于应用,Excel 2007中的CommandBar对象仅限制在快捷菜单操作中。
本文将提供一些关于CommandBars的背景信息。
CommandBar类型
Excel支持三种类型的CommandBars,通过其Type属性来区分。而Type属性是下面的三个值之一:

  • msoBarTypeNormal:工具栏(Type = 0)
  • msoBarTypeMenuBar: 菜单栏(Type = 1)
  • msoBarTypePopUp: 快捷菜单(Type = 2)

虽然在Excel 2007中没有使用工具栏和菜单栏,但它们仍然被包含于对象模型中,以便于与老版本的Excel相兼容。但是,试图在Excel 2007中显示类型为0或1的命令栏是无效的。例如,在Excel 2003中,下面的语句显示标准工具栏:

CommandBars("Standard").Visible = True

但在Excel 2007中,该语句将被忽略。下面专门介绍类型为2的命令栏(快捷菜单)。
列出快捷菜单
Excel 2007有65个快捷菜单,您可以运行下面的ShowShortcutMenuNames过程,遍历命令栏,如果Type属性为msoBarTypePopUp(内置的常量值为2),则在工作表中显示命令栏的索引值和名称。
Sub ShowShortcutMenuNames()
    Dim Row As Long
    Dim cbar As CommandBar
    Row = 1
    For Each cbar In CommandBars
        If cbar.Type = msoBarTypePopup Then
            Cells(Row, 1) = cbar.Index
            Cells(Row, 2) = cbar.Name
            Row = Row + 1
        End If
    Next cbar
End Sub

图1显示了该过程输出结果的一部分。
ListShortcutMenu
图1:一个简单的宏来生成所有快捷菜单的列表
引用命令栏
可以通过Index属性或Name属性引用一个特定的CommandBar对象,例如,下面的两个语句都引用在Excel桌面(Excel中没有打开任何文档时)中单击右键时的快捷菜单:

Application.CommandBars (47)

Application.CommandBars("Desktop")

CommandBars集合是Application对象的一个成员,在标准VBA模块或工作表模块中引用这个集合时,可以忽略对Application对象的引用。例如,下面的语句显示CommandBars集合中索引值为47的对象的名称:

MsgBox CommandBars(47).Name

在ThisWorkbook对象代码模块中引用CommandBars集合时,必须在其前面加上Application对象,如:

MsgBox Application.CommandBars(47).Name

注意,在不同的Excel版本中,Index值不总是保持不变。
引用命令栏中的控件
一个CommandBar对象包含Control对象,该对象是按钮或菜单。可以通过其Index属性或Caption属性来引用某控件。下面是一个简单的示例过程,显示单元格快捷菜单中第一个菜单项的标题:
Sub ShowCaption()
    MsgBox Application.CommandBars("Cell"). _
       Controls(1).Caption
End Sub

下面的过程显示在工作表选项卡中单击右键时出现的快捷菜单中每个控件的Caption属性(该快捷菜单名为Ply):
Sub ShowCaptions()
    Dim txt As String
    Dim ctl As CommandBarControl
    For Each ctl In CommandBars("Ply").Controls
        txt = txt & ctl.Caption & vbNewLine
    Next ctl
    MsgBox txt
End Sub

执行该过程后的结果如图2所示。
CellShortcutMenuCaption
图2:显示控件的Caption属性
在一些情况下,某快捷菜单中的Control对象包含其它的Control对象。例如,单元格右键菜单中的“筛选”控件包含其它控件,“筛选”控件是一个子菜单,而另外的项目是菜单项。
-----------------------
查找控件
如果所编写的代码将在不同的语言版本的Excel中使用,则应避免使用Caption属性来访问某特定的快捷菜单项。Caption属性随语言的不同而不同,因此在英文版本的Excel中编写的代码可能在其它语言的Excel版本中运行失败。
取而代之的是,应该与控件的ID一起使用FindControl方法(它们将独立于Excel的语言版本)。例如,假设想禁用工作表选项卡快捷菜单中的“重命名”菜单,如果该工作簿仅由Excel英文版本的用户使用,则下面的语句将正常运行:

CommandBars("Ply").Controls("Rename").Enabled = False

为了确保该命令在非英语版本的Excel中也能工作,需要知道该控件的ID,上面的语句将告诉您其ID是889:

MsgBox CommandBars("Ply").Controls("重命名(R)").ID

然后,来禁用该控件,使用下面的语句:

CommandBars.FindControl(ID:=889).Enabled = False

命令栏的名称在各语言版本的Excel中都是一致的,因此,对CommandBars("Desktop")的引用将总会正常运行。
-----------------------
下面的语句显示“筛选”子菜单中的第一个子菜单项:

MsgBox CommandBars("Cell").Controls("筛选(E)").Controls(1).Caption

命令栏控件的属性
命令栏控件有一些属性,来确定控件的外观和状态。下面包含了命令栏控件的一些最常用的属性:

  • Caption: 控件中显示的文本。如果该控年仅显示一个图像,则为鼠标悬浮在该控件上时的标题文字。
  • ID: 用来识别控件的一个独立的数字。
  • FaceID: 代表显示在控件文本旁边的图形图像的数字。
  • Type: 一个值,用来确定控件是按钮(msoControlButton)还是子菜单 (msoControlPopup)。
  • Picture: 显示在控件文本旁边的图形图像。
  • BeginGroup: 值为True时将在控件前面显示一个分隔条。
  • OnAction: 用户单击控件时执行的VBA宏名称。
  • BuiltIn: 如果该控件是Excel内置控件则为True。
  • Enabled: 如果可以单击控件则为True。
  • Visible: 如果控件可见则为True。一些快捷菜单包含了隐藏的控件。
  • ToolTipText: 用户移动鼠标指针到控件之上时出现的文本(对快捷菜单是不可用的)

显示所有的快捷菜单项
下面的ShowShortcutMenuItems过程创建一个表,列出了每个快捷菜单中的所有第一层次控件。对每个控件,该表包括了快捷菜单的Index和Name以及ID、Caption、Type、Enabled和Visible属性值。
Sub ShowShortcutMenuItems()
    Dim Row As Long
    Dim Cbar As CommandBar
    Dim ctl As CommandBarControl
    Range("A1:G1") = Array("Index", "Name", "ID", "Caption", _
      "Type", "Enabled", "Visible")
    Row = 2
    Application.ScreenUpdating = False
    For Each Cbar In Application.CommandBars
      If Cbar.Type = 2 Then
        For Each ctl In Cbar.Controls
            Cells(Row, 1) = Cbar.Index
            Cells(Row, 2) = Cbar.Name
            Cells(Row, 3) = ctl.ID
            Cells(Row, 4) = ctl.Caption
            If ctl.Type = 1 Then
                Cells(Row, 5) = "Button"
            Else
                Cells(Row, 5) = "Submenu"
            End If
            Cells(Row, 6) = ctl.Enabled
            Cells(Row, 7) = ctl.Visible
           Row = Row + 1
       Next ctl
     End If
    Next Cbar
End Sub

图3显示了过程运行后的一部分结果:
ListAllShortcutMenu
图3:列出所有快捷菜单项
如果运行ShowShortcutMenuItems宏,则会看到有一些快捷菜单包含隐藏或禁用的控件,它们代表在当前上下文环境中不可用的项目。
示例工作簿参见:show shortcut menu items.xlsm


提示:您可以在评论中使用HTML标签,且任何与HTML标签相同的符号都会被理解为HTML标签并以相应的格式显示.如果您的评论中有代码,可以使用相应的标签,例如,如果有VB或VBA代码,则可以使用[vb]标签,即[vb]放置的代码[/vb],这样会很清晰地显示代码.

发表评论