首页 > 单独文章 > 正文

使用VBA自定义Excel2007快捷菜单

时间:2008-06-02 23:55:08 作者:officeba 【认证】

本文将展示一些操作Excel2007快捷菜单的VBA代码实例,您可以修改这些例子以满足您的需要。本文中的大部分内容也适用于Excel以前的版本。
重置快捷菜单
Reset方法恢复某快捷菜单到其默认状态,例如,下面的过程恢复单元格(Cell)快捷菜单到其标准状态:
Sub ResetCellMenu()
    CommandBars("Cell").Reset
End Sub

Excel2007有两个名为Cell的快捷菜单,上面的代码仅恢复第一个(即索引值为38)的Cell快捷菜单。为恢复第二个Cell快捷菜单,使用索引值(41)代替其名称。
下面的过程恢复所有的内置工具栏到其初始状态:
Sub ResetAll()
    Dim cbar As CommandBar
    For Each cbar In Application.CommandBars
        If cbar.Type = msoBarTypePopup Then
            cbar.Reset
            cbar.Enabled = True
        End If
    Next cbar
End Sub

注意,如果在您的应用程序中添加项目到某快捷菜单中,最好在关闭应用程序时分别移除这些项目。如果简单地恢复快捷菜单,将会删除由其它应用程序所定制的快捷菜单。
禁用快捷菜单
Enabled属性可以让您禁用整个快捷菜单。例如,可以设置该属性后,在右键单击某单元格时不再显示正常的快捷菜单,下面的语句禁用Cell快捷菜单:

PLAIN TEXT
Visual Basic:
Application.CommandBars("Cell").Enabled = False
要重新启用该快捷菜单,简单地设置其Enabled属性为True。
如果想要禁用所有的快捷菜单,使用下面的过程:
Sub DisableAllShortcutMenus()
    Dim cb As CommandBar
    For Each cb In CommandBars
        If cb.Type = msoBarTypePopup Then _
          cb.Enabled = False
    Next cb
End Sub
注意,禁用的快捷菜单将会在所有会话中起作用,因此,在关闭Excel之前可能想要恢复快捷菜单。要恢复快捷菜单,将前面过程中的Enabled属性设置为True。
禁用快捷菜单项
您可能想在应用程序运行时,禁用某快捷菜单中的一个或多个快捷菜单项。当禁用某菜单项时,其文本显示为亮灰色,单击它时不会有任何效果。下面的过程从行或列快捷菜单中禁用“隐藏”菜单项:
Sub DisableHideMenuItems()
    CommandBars("Column").Controls("隐藏(H)").Enabled = False
    CommandBars("Row").Controls("隐藏(H)").Enabled = False
End Sub
添加一个新项到单元格快捷菜单中
下面的AddToShortcut过程添加一个新菜单项到单元格快捷菜单中:Toggle Word Wrap。Excel有两个单元格快捷菜单,下面的过程修改正常的右击菜单,但不修改显示在分页预览模式下的右击菜单。
Sub AddToShortCut()
    '添加一个菜单项到单元格快捷菜单中
    Dim Bar As CommandBar
    Dim NewControl As CommandBarButton
    DeleteFromShortcut
    Set Bar = CommandBars("Cell")
    Set NewControl = Bar.Controls.Add _
      (Type:=msoControlButton, _
      temporary:=True)
    With NewControl
        .Caption = "Toggle &Word Wrap"
        .OnAction = "ToggleWordWrap"
        .Picture = Application.CommandBars.GetImageMso _
          ("WrapText", 16, 16)
        .Style = msoButtonIconAndCaption
    End With
End Sub

图1展示了在右击单元格后显示的新菜单项。

图1:带有自定义菜单项的单元格快捷菜单
上面的过程中,在声明了一组变量后调用DeleteFromShortcut过程(参见下面)。这条语句确保在单元格快捷菜单中仅显示一次Toggle Word Wrap菜单项,注意该菜单项带下划线的热键是W,不是T,那是因为已准备在Cut菜单项中使用T。
设置Picture属性为Wrap Text命令来引用使用在功能区中的图像,参见“”中关于在功能区命令中使用图像的更多信息。
下面的宏通过OnAction属性指定,在选择该菜单项时执行。这里,宏的名称为ToggleWordWrap:
Sub ToggleWordWrap()
    CommandBars.ExecuteMso ("WrapText")
End Sub
这个过程简单地执行功能区中的“自动换行”命令。
注意,在修改快捷菜单后,所作的修改将一直保留。换句话说,所修改的快捷菜单在关闭包含该VBA代码的工作簿时不会自已恢复。因此,如果编写代码来修改某快捷菜单,几乎总要编写代码来恢复修改所产生的影响。
DeleteFromShortcut过程从单元格快捷菜单中删除新的菜单项。
Sub DeleteFromShortcut()
    On Error Resume Next
    CommandBars("Cell").Controls _
      ("Toggle &Word Wrap").Delete
End Sub

在一些情况下,想要自动地添加和删除增加的快捷菜单:当打开工作簿时添加快捷菜单项,在关闭工作簿时删除该菜单项。只需要将这两个事件过程添加到ThisWorkbook代码模块:
Private Sub Workbook_Open()
    Call AddToShortCut
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call DeleteFromShortcut
End Sub
Workbook_Open过程在打开工作簿时执行,Workbook_BeforeClose过程在关闭工作簿之前执行。
注意,添加到快捷菜单中的菜单项不只是在创建菜单项的工作簿可用,在所有工作簿中都是可用的。
添加子菜单到快捷菜单中
本节中的示例将添加带有三个选项的子菜单到快捷菜单中。事实上,添加了子菜单到6个快捷菜单中。图2展示右击一行之后的工作表,子菜单项中的每一个都执行一个宏,来改变所选单元格中的文本。

图2:这个快捷菜单有一个带有三个子菜单项的子菜单
--------------------------------------------
查找FaceID图像
显示在快捷菜单项中的图标由两个属性设置之一来确定:

Picture:该选项可以使用功能区中的imageMso。
FaceID:这是最容易的选项,因为FaceID属性只是一个数字值,代表几百个图像中的一个。
但是,如何查找与特定FaceID图像一致的数值呢?Excel没有提供方法,John Walkenbach创建了一个工具工作簿,可以单击此处下载,并参见“如何在Excel2007中创建自定义菜单”。您只需输入开始和结束的FaceID数字,单击按钮后,将会在工作表中显示图像。每个图像有一个与其FaceID值相一致的名称。

--------------------------------------------
下面的代码创建了子菜单及其菜单项:
Sub AddSubmenu()
'   添加一个子菜单到6个快捷菜单中
    Dim Bar As CommandBar
    Dim NewMenu As CommandBarControl
    Dim NewSubmenu As CommandBarButton
    Dim cbIndex As Long     DeleteSubMenu
    For cbIndex = 36 To 41
        Set Bar = CommandBars(cbIndex)
'       添加子菜单
        Set NewMenu = Bar.Controls.Add _
            (Type:=msoControlPopup, _
             temporary:=True)
        NewMenu.Caption = "Ch&ange Case"
        NewMenu.BeginGroup = True
'       添加第一个子菜单项
        Set NewSubmenu = NewMenu.Controls.Add _
          (Type:=msoControlButton)
        With NewSubmenu
            .FaceId = 38
            .Caption = "&Upper Case"
            .OnAction = "MakeUpperCase"
        End With
'       添加第二个子菜单项
        Set NewSubmenu = NewMenu.Controls.Add _
          (Type:=msoControlButton)
        With NewSubmenu
            .FaceId = 40
            .Caption = "&Lower Case"
            .OnAction = "MakeLowerCase"
        End With
'       添加第三个子菜单项
        Set NewSubmenu = NewMenu.Controls.Add _
          (Type:=msoControlButton)
        With NewSubmenu
            .FaceId = 476
            .Caption = "&Proper Case"
            .OnAction = "MakeProperCase"
        End With
    Next cbIndex
End Sub

AddSubmenu过程使用了一个循环来修改索引值在36和41之间的6个CommandBar对象。所添加的子菜单,其Type属性是msoControlPopup,然后添加了三个子菜单项,每一个子菜单项都有一个不同的OnAction属性。
所调用的DeleteSubMenu过程为:
Sub DeleteSubMenu()
    On Error Resume Next
    Dim Bar As CommandBar
    Dim NewMenu As CommandBarControl
    Dim cbIndex As Long    For cbIndex = 36 To 41
        Set Bar = CommandBars(cbIndex)
'       删除子菜单
      Bar.Controls _
        ("Ch&ange Case").Delete
    Next cbIndex
End Sub


相关文章

同类最新