本帖最后由 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)
未完待续
|