ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 11379|回复: 4

通过XML自定义EXCEL 2010/2013 弹出菜单的方法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-6-29 17:25 | 显示全部楼层 |阅读模式
本帖最后由 dingboy_VBA 于 2013-6-29 17:45 编辑

在Office 2003的年代,自定义EXCEL 2003的弹出菜单是比较容易的事,但自Office 2007开始,自定义菜单变得困难了很多.office 2007起采用了Ribbon风格的控件,已经不能通过工具栏上弹出菜单的”自定义-快捷菜单”来调出自定义界面来解决,它没有提供这一方式.
怎么办? Office并没有完全关上这扇门,至少通过VBA代码来操作Office的菜单还是可以的,不过一般对于不太熟悉VBA的朋友来讲,这一技术还是过于复杂了.
到了Office 2010和Office 2013之后, Office提供了一种新的自定义方式,即通过XML文件来定义菜单,但需要把文件保存为新格式如XLSX或XLSM文件,它们内部是以XML格式来保存内容的,而一般的XLS文件是二进制格式的,不支持XML自定义菜单. 以下便XLSX文件为例讲述.
简单来讲,XLSX(或XLSM)文件整体上是一种压缩文件,只不过后缀是XLSX.
首先,我们需要安装一个软件,名叫custom UI Editor for Microsoft Office. 从这个地方下载地址:
http://openxmldeveloper.org/cfs-file.ashx/__key/communityserver-components-postattachments/00-00-00-72-93/OfficeCustomUIEditorSetup.zip
下载之后,打开压缩包,安装即可. 这个软件有个不太好的毛病,就是不支持中文字符,输入中文时会显示乱码,原因在于customUI14.xml文件在首次生成时,采用的不是Unicode编码,不过我们可以把XLSX文件当成压缩文件,解压之后转换为Unicode编码的文件,增加中文内容, 再替换回去.这是后话,目前示例1中用不上.

第一步,需要用EXCEL2010或EXCEL2013建立一个新XLSX文件,保存,这里演示用test.xlsx这个文件名. 如果修改当前的某个已有文件,也行.
默认生成的文件中,是没有customUI目录以及该目录以下的customUI14.xml,需要用到以上的custom UI Editor for Microsoft Office软件, 用它打开要修改的文件.
点选菜单Insert—Office 2010 custom UI part,它会增加customUI14.xml文件到左侧节点下面,不过可以看出,右边的内容是空的.选择这个节点,在右侧的窗口中(即在custom UI Editor for Microsoft Office打开的文件test.xlsx节点下customUI14.xml文件),插入一段如下的代码(可以复制到那里再粘贴).
<customUIxmlns="http://schemas.microsoft.com/office/2009/07/customui">
   <contextMenus>
      <contextMenuidMso="ContextMenuCell">
      <button idMso="FileSave”insertBeforeMso="Cut" />
    <button idMso="AutoSum"insertBeforeMso="Cut" />
<menuSeparatorid="MySeparator1" insertBeforeMso="Cut" />
         </contextMenu>
   </contextMenus>
</customUI>


然后点击保存.

接下来,解释一下以上代码的意见,你就明白它的作用是什么了—-无非增加几个菜单项
第一行内容是固定的,不要修改.主要是告诉EXCEL 这里的XML使用了什么规范.与代码最末尾的</customUI>对应,形成一个完整的定义块.

第二行,说明这里自定义的是上下文菜单.内容也不要修改.它与第8行的</contextMenus>对应,缺一不可,形成一个完整的有头有尾的定义.它们之间的就是包含的定义内容.

第三行,详细说明这里自定义的是内部名称(idMSO)是”ContextMenuCell”,也就是单元格(Cell)的上下文菜单,即它的弹出菜单.注意这个与7行的</contextMenu>对应,形成完整的定义.

第四行, FileSave 表明自定义到这里的控件是”文件保存”按钮, 按钮要实现的功能是EXCEL的内部定义好的功能,  插入的位置在”Cut”这个菜单项之前. Cut 对应的菜单项即中文显示的”剪切”. 注意行末的 />,这个表示对按钮的定义已经结束了.
注意大小写,XML里面是区别大小写的,特别是引用控件的内部名字和控件的类型,写错了就看不到它了.
如果你要用到其它的按钮,替换相应的idMso即可.如VisualBasic,  PasteValuesAndSourceFormatting(注意大小写不能错) 分别对应调用VBA编辑器, 粘贴为值和源格式.

第5行,类似如上的解释,插入一个内部名称为”AutoSum”的内部功能(即自动求和),插入的位置是在”剪切”之前.

第6行指定插入一个分隔条 ,这个比较简单,只要给id起一个没有重复的名字即可(注意这里是id而不是idMSO.


顺便指出,idMSO中id就是标识符identifier的缩写,MSO代表Microsoft Office,也就微软Office的定义的标识符的意思.
顺便说下,由于第四行在前,执行的时候, FileSave按钮(菜单项)已经插到”剪切”项之前, 再执行第5行时,又指定AutoSum插入到”剪切”之前,AutoSum按钮(即自动求和)按钮就插到剪切之前,即”FileSave” 与”Cut” 之间, 其结果是, 文字表述的先后顺序与实际菜单上下关系是一样的,即前面定义的在前面.(如果插入的位置定义不是指定同一已有项,结果不会如此)
现在保存文件之后, 软件会把新增加的XML文件及内容都更新到 文件中. 关闭此软件之后,再双击打开EXCEL文件,可以看到菜单菜单的变化.


细心的朋友们可能会问,以上内部名称我怎么知道呢? EXCEL的菜单上又没有告诉你,它的内部名称是什么. 没错,EXCEL是没有讲,但MS的网站上讲过,到以下地址下载一个文件,他里面列出了所有控件的内部名字.
以上压缩包下载之后,打开ExcelControls.xlsx这个文件,里面的内容十分丰富.注意两个内部,A列为内部名称,也即上面定义的idMSO后面指定的名字. B列为控件的类型, 如button, menu之类. 根据idMSO指定对应的内部功能. 但是,说句实在话,对于英语不好的人,找到中文名对应的英文idMso,困难比较大.

示例1结束.

test.rar (5.79 KB, 下载次数: 733)


未完待续







TA的精华主题

TA的得分主题

发表于 2013-8-13 22:55 | 显示全部楼层
呵呵,不错,就这样做的,支持

TA的精华主题

TA的得分主题

发表于 2016-4-21 19:52 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-10-13 17:30 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-8-2 15:12 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-25 16:07 , Processed in 0.042469 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表