VBA向Excel菜单栏添加新菜单的通用方法
问题需求:
1、菜单栏属于CommandBars集合,可以通过菜单栏名称或索引值对其进行引用:CommandBars(“Worksheet Menu Bar”)或CommandBars(1)
2、新添加的菜单是一个弹出式控件,其类型为msoControlPopup。
3、通过Add方法向Controls集合中添加新的控件。Add方法可以指定控件的类型、内置控件的ID号、位置及是否是一个临时控件。如果是一个临时控件,则在关闭Excel时会自动删除该菜单。
4、可以指定新菜单的位置。如果不指定,则会在菜单工具栏末尾添加新菜单。
5、使用Caption属性指定新菜单的名称,使用OnAction属性指定单击菜单后的行为。
6、为了避免指定的菜单不存在,可以使用FindControl方法查找要指定的菜单。若指定的菜单不存在,则在工作表菜单栏末尾添加新菜单。
以下是向Excel工作表菜单栏中添加菜单的VBA代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | Sub AddNewMenu() Dim HelpMenu As CommandBarControl Dim NewMenu As CommandBarPopup '利用ID属性查找帮助菜单 Set HelpMenu = CommandBars(1).FindControl(ID:=30010) If HelpMenu Is Nothing Then '如果该菜单不存在,则将新菜单添加到末尾 '设置新菜单为临时的 Set NewMenu = CommandBars(1).Controls _ .Add(Type:=msoControlPopup, Temporary:=True) Else '将新菜单添加到帮助菜单之前 Set NewMenu = CommandBars(1).Controls _ .Add(Type:=msoControlPopup, Before:=HelpMenu.Index, _ Temporary:=True) End If '添加标题并指定快捷键 NewMenu.Caption = "统计(&S)" End Sub |
运行该过程后,将在工作表菜单的“帮助”菜单左侧添加一个名为“统计”的新菜单。
注:要删除新添加的菜单,使用Delete方法即可,例如代码:
1 | CommandBars(1).Controls( "统计(&S)" ).Delete |
将删除刚创建的“统计”菜单。
添加菜单项
与添加新菜单一样,在添加菜单项及子菜单时,使用Add方法,且指定合适的控件类型,其代码清单如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | Sub AddNewMenu() Dim HelpMenu As CommandBarControl Dim NewMenu As CommandBarPopup Dim MenuItem As CommandBarControl Dim SubMenuItem As CommandBarButton On Error Resume Next '如果菜单已存在,则删除该菜单 CommandBars(1).Controls( "统计(&S)" ).Delete '利用ID属性查找帮助菜单 Set HelpMenu = CommandBars(1).FindControl(ID:=30010) If HelpMenu Is Nothing Then '如果该菜单不存在,则将新菜单添加到末尾 '设置新菜单为临时的 Set NewMenu = CommandBars(1).Controls _ .Add(Type:=msoControlPopup, Temporary:=True) Else '将新菜单添加到帮助菜单之前 Set NewMenu = CommandBars(1).Controls _ .Add(Type:=msoControlPopup, Before:=HelpMenu.Index, _ Temporary:=True) End If '添加菜单标题并指定热键 NewMenu.Caption = "统计(&S)" '添加第一个菜单项 Set MenuItem = NewMenu.Controls.Add _ (Type:=msoControlButton) With MenuItem .Caption = "输入数据(&D)..." .FaceId = 162 .OnAction = "Macro1" End With '添加第二个菜单项 Set MenuItem = NewMenu.Controls.Add _ (Type:=msoControlButton) With MenuItem .Caption = "汇总数据(&T)..." '添加快捷键 .ShortcutText = "Ctrl+Shift+T" .FaceId = 590 .OnAction = "Macro2" End With '添加第三个菜单项 '本菜单有子菜单项,因此其类型为msoControlPopup Set MenuItem = NewMenu.Controls.Add _ (Type:=msoControlPopup) With MenuItem .Caption = "数据报表(&R)..." '添加分隔线 .BeginGroup = True End With '添加子菜单 '添加第一个子菜单 Set SubMenuItem = MenuItem.Controls.Add (Type:=msoControlButton) With SubMenuItem .Caption = "月汇总(&M)" .FaceId = 110 .OnAction = "Macro3" End With '添加第二个子菜单 Set SubMenuItem = MenuItem.Controls.Add _ (Type:=msoControlButton) With SubMenuItem .Caption = "季度汇总(&Q)" .FaceId = 222 .OnAction = "Macro4" End With End Sub |
注意,菜单类型的不同,有二个菜单项(类型为msoControlButton)、有一个菜单项带有子菜单(其类型为msoControlPopup)FaceID属性确定出现在菜单文本旁边的图像,以数字表示,一个数字代表一个内置的图像。
在Caption属性中使用&号表示该菜单项的热键。
在第二个菜单项中,利用ShortcutText属性为该菜单项添加了一个快捷键,用户按此快捷键可以直接运行命令。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!