先来看看个举例该举例演示了这项技术点此下载这个举例(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, _
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所示)只需按自已需要简单地修改表中数据就可创建自已菜单图2:存放菜单项表格
该表格包含5列:
(1) 级别:指定菜单项级别有效值是1、2、3第1级别是菜单第2级别是菜单项第3级别是子菜单项正常情况下有个第1级别菜单下面包含有第2级别菜单项个第2级别菜单项可能包含或不包含有第3级别菜单项(子菜单项)
(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
最新评论