excel自定义函数:Excel 2007 自定义菜单技术(2)

  在Excel 97至Excel 2003等版本中可以利用“自定义”对话框来创建新菜单并建立菜单项但很难创建子菜单因此特定工作簿菜单必须编写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, _
          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



Tags:  excel自定义排序 excel自定义序列 excel自定义格式 excel自定义函数

延伸阅读

最新评论

发表评论