Excel VBA自定义功能区

在 Excel 编写代码,离不开界面的导航。之前为了简单,经常将控件放置在工作表上。但这种方法显得不专业。Office 其实允许通过代码或者使用 XML 文件的方式来定义功能区。本篇介绍自定义功能区的要点。

xlsx 文档可以视为一种经过压缩的文档格式。我们新建一个 Excel 文档,另存为启用宏的工作簿 (xlsm) 格式(文件名:工作簿1.xlsm),将文件名更名为:工作簿1.xlsm,zip。忽略警告。用 winrar 软件打开可以看到 xlsm 的内部文件结构如下:


在 _rels 文件夹下面的 .res 文件,结构为 xml,打开后可以看到其内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml" />
    <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml" />
    <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml" />
</Relationships>

如果需要自定义功能区,需要做三件事:

  1. 创建一个 xml 文件,在其中编写 ribbon 的内容,ribbon 有固定的 schema,可以用模板来编写,或者借助 Visual Studio 这样的工具来编写。假设我们希望定义一个包含三个按钮的功能区,xml 文件的内容应该如下所示:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
    <ribbon>
        <tabs>
            <tab id="MyTab" label="我的功能区">
                <group id="group1" label="数据CRUD">
                    <button id="button1" label="刷新" imageMso="DataRefreshAll" size="large" onAction="RefreshData" />
                    <button id="button2" label="新增记录" imageMso="InsertRowBelowAccess" size="large" onAction="InsertData" />
                    <button id="button3" label="修改记录" imageMso="QueryUpdate" size="large" onAction="UpdateData" />
                </group>               
            </tab>
        </tabs>
    </ribbon>
</customUI>

这里的 imgIso 是 Office 为每一个命令项所定义的图标,在自定义功能区界面将鼠标悬停,就会显示命令所对应的 id,这个也是 imgIso 的 id。

xml 文件标签的层次显示了功能区的层次:tab 下面是 group,group 下面是控件。

  1. 在 .res 文件中关联 mycustomui.xml 文件的内容。

    直接向压缩文件写入这些内容并不方便,可以从压缩文件中拷贝出来,在外面修改后再拷贝进去。拷贝的文件包括 .res 文件和 mycustomui.xml 文件。操作完成后 winrar 显示的文件结构如下:


去掉文件名的 zip 后缀,用 Excel 打开文件,刚才设置的界面已经生效。

  1. 定义这些按钮的处理代码,处理代码被称作回调函数。回调函数固定以 IRibbonControl 类型的对象作为参数。下面是三个按钮的处理代码:
Public Sub RefreshData(ctrl As IRibbonControl)
    MsgBox "刷新数据"
End Sub

Public Sub InsertData(ctrl As IRibbonControl)
    MsgBox "新增记录"
End Sub

Public Sub UpdateData(ctrl As IRibbonControl)
    MsgBox "修改记录"
End Sub

为了方便修改 xlsm 文件的功能区,可以使用两个开源的工具,一个是微软的 OfficeDev/office-custom-ui-editor,在 Github 上开源,已经有几年没有更新。另外一个工具是 office-ribbonx-editor。用法都类似,在文件关闭的情况下打开,对 xml 文件编辑后进行保存即可。以下是 office ribbonx editor 的界面:

示例数据

Excel Custom UI Ribbon

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值