在Excel 97至Excel 2003等版本中,可以利用“自定义”对话框来创建新菜单,并建立菜单项,但很难创建子菜单,
Excel 2007 自定义菜单技术(2)EXCEL 2007
。因此,特定的工作簿菜单必须编写VBA代码来创建。下面的技术介绍了使用一种相当简单的方法在工作表菜单栏中创建自定义菜单,当工作簿打开时则显示自定义的菜单,该工作簿关闭时则删除自定义的菜单。先来看看一个示例,该示例演示了这项技术。点此下载这个示例(menumakr)。
示例文件包含了所有需要创建自定义菜单的VBA代码,在大多数情况下,不需要改变这些代码,只需按自已的意图简单地自定义MenuSheet工作表即可。VBA代码清单如下:
Sub CreateMenu() ' 当工作簿打开时本过程自动执行.
' 注:在这个子过程中没有错误处理语句.
Dim MenuSheet As Worksheet
Dim MenuObject As CommandBarPopup
Dim MenuItem As Object
Dim SubMenuItem As CommandBarButton
Dim Row As Integer
Dim MenuLevel, NextLevel, PositionOrMacro, Caption, Divider, FaceId
''''''''''''''''''''''''''''''''''''''''''''''''''''
' 获取菜单数据的位置
Set MenuSheet = ThisWorkbook.Sheets("MenuSheet")
''''''''''''''''''''''''''''''''''''''''''''''''''''
' 确保菜单不重复
Call DeleteMenu
' 行初始值
Row = 2
' 使用MenuSheet工作表中的数据添加菜单,菜单项和子菜单项
Do Until IsEmpty(MenuSheet.Cells(Row, 1))
With MenuSheet
MenuLevel = .Cells(Row, 1)
Caption = .Cells(Row, 2)
PositionOrMacro = .Cells(Row, 3)
Divider = .Cells(Row, 4)
FaceId = .Cells(Row, 5)
NextLevel = .Cells(Row + 1, 1)
End With
Select Case MenuLevel
Case 1 '代表菜单
' 添加顶级菜单到工作表菜单栏中
Set MenuObject = Application.CommandBars(1). _
Controls.Add(Type:=msoControlPopup, _
Before:=PositionOrMacro, _
关 键 字:office
相关文章:
在Excel 2007中快速删除重复记录
Excel 2003命令在Excel 2007中的位置
Excel 2007筛选唯一值或删除重复值
多个Excel 2007表中的数据合并计算
Excel 2007轻松进行多条件求和
Temporary:=True)
MenuObject.Caption = Caption
Case 2' 代表菜单项
If NextLevel = 3 Then
Set MenuItem = MenuObject.Controls.Add(Type:=msoControlPopup)
Else
Set MenuItem = MenuObject.Controls.Add(Type:=msoControlButton)
MenuItem.OnAction = PositionOrMacro
End If
MenuItem.Caption = Caption
If FaceId <> "" Then MenuItem.FaceId = FaceId
If Divider Then MenuItem.BeginGroup = True
Case 3 ' 代表子菜单项
Set SubMenuItem = MenuItem.Controls.Add(Type:=msoControlButton)
SubMenuItem.Caption = Caption
SubMenuItem.OnAction = PositionOrMacro
If FaceId <> "" Then SubMenuItem.FaceId = FaceId
If Divider Then SubMenuItem.BeginGroup = True
End Select
Row = Row + 1
Loop
End Sub
Sub DeleteMenu()
' 这个子过程在工作簿关闭时执行
' 删除自定义菜单
Dim MenuSheet As Worksheet
Dim Row As Integer
Dim Caption As String
On Error Resume Next
Set MenuSheet = ThisWorkbook.Sheets("MenuSheet")
Row = 2
Do Until IsEmpty(MenuSheet.Cells(Row, 1))
If MenuSheet.Cells(Row, 1) = 1 Then
Caption = MenuSheet.Cells(Row, 2)
Application.CommandBars(1).Controls(Caption).Delete
End If
Row = Row + 1
Loop
On Error GoTo 0
End Sub
Sub DummyMacro()
MsgBox "您可以在本过程中添加相应的操作代码."
End Sub
换句话说,该技术使用了一个存放在MenuSheet工作表中的表格(如下图2所示),只需按自已的需要简单地修改表中的数据,就可创建自已的菜单,
电脑资料
《Excel 2007 自定义菜单技术(2)EXCEL 2007》(https://www.unjs.com)。
图2:存放菜单项的表格
该表格包含5列:
(1) 级别:指定的菜单项的级别,有效值是1、2、3。第1级别是菜单,第2级别是菜单项,第3级别是子菜单项。正常情况下,有一个第1级别的菜单,下面包含有第2级别的菜单项。一个第2级别的菜单项可能包含或不包含有第3级别的菜单项(子菜单项)。
关 键 字:office
相关文章:
在Excel 2007中快速删除重复记录
Excel 2003命令在Excel 2007中的位置
Excel 2007筛选唯一值或删除重复值
多个Excel 2007表中的数据合并计算
Excel 2007轻松进行多条件求和
(2) 标题:显示在菜单、菜单项和子菜单项中的文字。使用连接符(&)指定一个带下划线的字符。
(3) 位置/宏:对于第1级菜单,应该是一个整数,代表菜单在菜单栏中的位置。对于第2级或第3级菜单项,应该是一个宏,当该菜单项被选择时执行相应的宏。如果第2级菜单项有一个或多个第3级菜单项,第2级菜单项可能没有一个宏与它相关联。
(4) 分隔线:如果设置为真,将在菜单项或子菜单项前放置一个分隔线。
(5) FaceID(图标号):可选的。一个代码数字,代表显示在菜单项前内置的图形图像。获取代码数字可见上文所介绍的识别工具栏图像的内容。
下图3显示了使用上面的表格所创建的自定义菜单。
图3:一个自定义菜单的例子
要在工作簿或者加载宏中使用这项技术,可以按照下面的步骤进行:
(1) 打开前面下载的工作簿文件。该工作簿包含有VBA代码和一个名为MenuSheet的工作表。
(2) 将该工作簿中的所有代码复制到自已的VBA工程的模块中。
(3) 将下面的子过程添加到ThisWorkbook对象模块中:
Private Sub Workbook_Open() Call CreateMenu
End SubPrivate Sub Workbook_BeforeClose(Cancel As Boolean)
Call DeleteMenu
End Sub
(4) 当工作簿打开时,执行Workbook_Open子过程,当工作簿关闭时,执行Workbook_BeforeClose子过程。
(5) 插入一个新工作表并命名为MenuSheet。然后直接复制menumakr.xls文件中的表格到MenuSheet工作表中。
(6) 按自已的需要修改MenuSheet工作表中的表格。
相关文章:Excel 2007 自定义菜单技术(1)
注:本教程为fanjy原创,豆豆学园整理,首发于http://blog.excelhome.net
关 键 字:office
相关文章:
在Excel 2007中快速删除重复记录
Excel 2003命令在Excel 2007中的位置
Excel 2007筛选唯一值或删除重复值
多个Excel 2007表中的数据合并计算
Excel 2007轻松进行多条件求和