Excel实战技巧60: 自定义功能区
- 2019 年 11 月 12 日
- 笔记
自Office 2007版本开始,Microsoft对Office界面进行了彻底的改造,将原来的菜单和工具栏改成了功能区,文件格式也进行了改变。现在的Office文件,实际上是一个压缩文件,其中包括了创建文档的XML文件。这样,我们能够通过修改其XML文件结构,从而创建自已的功能区。
将文件修改为压缩文件
首先,需要修改Excel文件的扩展名为.zip,例如将文件MyCustomRibbon.xlsm修改为MyCustomRibbon.zip或者MyCustomRibbon.xlsm.zip,此时,会弹出一个如下图1所示的警告信息框,单击“是”。

图1
双击打开这个压缩文件,可以看到如下图2所示的文件夹和文件,我们需要在其中添加一些文件夹和文件,以及修改一些文件来自定义功能区。

图2
创建自定义功能区
在压缩文件外,创建一个新文件夹,我们将其命名为customUI。在该文件夹中,创建一个新的名为my_customUI.xml的文件。我们将在这个文件中创建XML,控制自定义功能区的界面外观。
打开my_customUI.xml,在第一行输入:
(对于Excel 2007和Excel 2010)
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
或者:
(对于Excel 2013及以后版本)
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
当然,第一条语句也适用于Excel 2010以后的版本,但在功能上有许多局限性。
在这个标签中,xmlns代表XML名称空间,“URL”不是指向实际的在线资源,而是指向Office内部代码中列出的架构,为诸如<ribbon>和<button>之类的标记赋予了含义,它们是框架的一部分。而在2013和更高版本中提供了其他功能,这些功能在早期版本的Excel中是不可用的。
接下来,添加选项卡,并在选项卡中添加带有按钮的组:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon> <tabs> <tab id="mytab"label="我的选项卡"> <group id="group1" label="第一组"> <button id="button1" label="按钮1" /> <button id="button2" label="按钮2" /> </group> <group id="group2" label="第二组"> <button id="button3" label="按钮3" /> <button id="button4" label="按钮4" /> </group> </tab> </tabs> </ribbon></customUI>
上面的XML代码为我们的自定义功能区搭建了一个基本的框架。注意,每个控件的id名必须唯一且没有空格。
保存并关闭my_customUI.xml,将文件夹customUI拖拉到上文创建的压缩文件夹中。
添加关联关系
将压缩文件中的_rels文件夹拖至压缩文件外,使用记事本打开该文件夹里面的.rels文件,在</Relationships>前添加:
(对于Excel 2007和Excel 2010)
<Relationship Id="my123" Type=http://schemas.microsoft.com/office/2006/relationships/ui/extensibility Target="/customUI/my_customUI.xml"/>
或者:(对于Excel 2013及以后版本)
<Relationship Id="my123" Type="http://schemas.microsoft.com/office/2007/relationships/ui/extensibility" Target="/customUI/my_customUI.xml"/>
其中,Target的值应该与自定义的xml文件的路径相匹配。
保存并关闭这个.rels文件,删除压缩文件中的_rels文件夹,将修改后的_rels文件夹拖回到压缩文件中。
将压缩文件的扩展名修改回Excel文件的扩展名,打开Excel文件,可以看到添加了一个新的名为“我的选项卡”的选项卡,有两个组,每组有两个按钮,如下图3所示。

图3
下面,为自定义功能区添加响应功能。
修改按钮
主要介绍如何为按钮添加图像并链接到宏。
再次修改Excel文件的扩展名为压缩文件,将my_customUI.xml文件拖出压缩文件并进行修改。
将:
<button id="button1" label="按钮1" />
修改为:
<button id="button1" label="按钮1" imageMso="HappyFace" size="large"/>
此时的自定义功能区效果如下图4所示。

图4
我们给按钮指定了内置的图像并设置其大小。
也可以给按钮添加自定义图像,此时应使用:
image="imageID"
但需要添加关联关系并在Excel文件中包括图像。需要在customUI文件夹中创建两个新文件夹:
1.文件夹images:用于包含自定义图像。
2.文件夹_rels:用于关联。在此文件夹中添加一个文件,文件名为XML文件的名字(示例中是my_customUI.xml),后缀为.rels,因此其名字为:my_customUI.xml.rels。该文件告诉Excel怎样识别想要放置在功能区中的图像,其代码类似如下:
<?xml version="1.0" encoding="utf-8"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="images/my_pic_filename.png" Id="my_icon_1" /><Relationship Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="images/my_2nd_pic_filename.png" Id="my_icon_2"/></Relationships>
示例中,在images文件夹中,放置了名为my_pic_filename.png和my_2nd_pic_filename.png的图像文件,如果想在按钮中使用,则需要通过指定其ID来调用,例如my_icon_1:
<button id = "button4" label = "按钮4" image = "my_icon_1" onAction = "sayGoodbye"/>
下面,我们为按钮关联宏,以便用户单击按钮时响应相关功能。
将:
<button id="button1" label="按钮1" imageMso="HappyFace" size="large"/>
修改为:
<button id="button1" label="按钮1" imageMso="HappyFace" size="large" onAction="MyHello" />
使用更新后的文件替换掉压缩文件中的相应文件后,恢复Excel扩展名,打开Excel文件,开启VBE,在标准模块中输入代码:
Sub MyHello(control As IRibbonControl) Dim yourName As String yourName = InputBox("请输入你的名字:") MsgBox yourName & ", 欢迎你!"End Sub
此时,当你按下按钮1时,会弹出一个输入框要求输入名字,在输入完成后,会给出一句问候信息。
小结
不借助任何特定工具创建自定义功能区的步骤:
1.创建一个名为customUI的文件夹并在其中添加一个名为my_customUI.xml的文件。
2.在my_customUI.xml文件中输入自定义功能区的XML代码。
3.修改Excel文件的扩展名为压缩文件。
4.将压缩文件中的_rels文件夹复制并粘贴到压缩文件外。
5.修改_rels文件夹中的.rels文件建立关联关系并保存。
6.删除压缩文件中的_rels文件夹。
7.将修改后的_rels文件夹和新建的文件夹customUI拖至压缩文件中。
8.将压缩文件扩展名恢复成Excel文件扩展名。
9.在VBE中编写相关控件的回调代码,注意过程名后带有相应的回调参数。
本文虽然以Excel为示例来讲解,但同样的原理也可以运用到Word和PowerPoint中。此外,你也可以借助于特殊的工具(例如CustomUIEditor)更方便来自定义功能区。