相同FaceID下弹出菜单图标样式差异及Excel 365样式获取方法
如何在Excel 365弹出菜单中获取Modern风格图标
问题背景
相同FaceID在Excel 365与旧版本(如2003)的弹出菜单中显示的图标不仅样式差异大,甚至图标本身都不同。目前使用传统CommandBar创建弹出菜单时,无法获取Excel 365的Modern风格图标:
With Application.CommandBars.Add(Name:=gsMENUNOTES, _ Position:=msoBarPopup, MenuBar:=False, Temporary:=True) With .Controls.Add(Type:=msoControlButton) .Caption = "New note" .OnAction = "NewNote" .FaceId = 4385 End With End With
核心原因
传统CommandBar属于Office旧版命令栏体系,默认加载兼容旧版本的图标库。而Excel 365的Ribbon使用Modern UI图标集,两者的FaceID映射并不完全一致,直接用FaceId无法在CommandBar中调用Modern图标。
解决方案
方案1:改用Ribbon XML创建弹出菜单(推荐)
这是原生支持Excel 365 Modern图标的方式,通过自定义Ribbon的popup控件实现右键弹出菜单,直接指定Ribbon内置图标:
- 添加Ribbon XML代码
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> <contextMenus> <!-- 自定义右键弹出菜单,可指定触发位置,比如工作表单元格 --> <contextMenu idMso="ContextMenuCell"> <menu id="customPopupMenu" label="我的菜单" insertBeforeMso="Cut"> <button id="btnNewNote" label="New note" imageMso="NoteCreate" onAction="NewNote"/> </menu> </contextMenu> </contextMenus> </customUI>
imageMso指定Ribbon内置Modern图标ID,NoteCreate对应新建笔记的Modern图标,可通过Office官方图标文档查询对应ID。
- VBA回调代码
Sub NewNote(control As IRibbonControl) ' 这里编写你的新建笔记逻辑 MsgBox "新建笔记" End Sub
方案2:提取Ribbon图标并赋值给CommandBar按钮
如果必须使用CommandBar,可以先从Ribbon风格的命令栏中提取Modern图标,再将其设置为CommandBarButton的自定义图片:
Sub CreatePopupWithModernIcon() Dim tempBar As CommandBar Dim tempBtn As CommandBarButton Dim popupBar As CommandBar Dim popupBtn As CommandBarButton ' 临时创建命令栏提取Modern图标 Set tempBar = Application.CommandBars.Add(Name:="TempBar", Temporary:=True) Set tempBtn = tempBar.Controls.Add(Type:=msoControlButton) tempBtn.FaceId = 4385 ' 指定目标FaceID tempBtn.Style = msoButtonIconAndCaption ' 确保图标加载完成 ' 创建目标弹出菜单 Set popupBar = Application.CommandBars.Add(Name:=gsMENUNOTES, Position:=msoBarPopup, Temporary:=True) Set popupBtn = popupBar.Controls.Add(Type:=msoControlButton) ' 复制临时按钮的图标到弹出菜单按钮 tempBtn.CopyFace popupBtn.PasteFace ' 设置按钮其他属性 popupBtn.Caption = "New note" popupBtn.OnAction = "NewNote" ' 清理临时命令栏 tempBar.Delete End Sub Sub NewNote() ' 你的业务逻辑 MsgBox "新建笔记" End Sub
- 此方法通过临时创建默认加载Modern图标的命令栏,提取图标后应用到目标弹出菜单按钮上。
补充说明
- Ribbon内置图标ID可通过Office官方文档查询,确保使用Excel 365支持的Modern图标ID。
- 若需批量处理图标,可参考你提供的Ribbon图标浏览器代码,遍历并提取所需图标。
内容的提问来源于stack exchange,提问作者Malamare
相关产品推荐
相关产品推荐

