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>
如果需要自定义功能区,需要做三件事:
- 创建一个 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 下面是控件。
- 在 .res 文件中关联 mycustomui.xml 文件的内容。
直接向压缩文件写入这些内容并不方便,可以从压缩文件中拷贝出来,在外面修改后再拷贝进去。拷贝的文件包括 .res 文件和 mycustomui.xml 文件。操作完成后 winrar 显示的文件结构如下:
去掉文件名的 zip 后缀,用 Excel 打开文件,刚才设置的界面已经生效。
- 定义这些按钮的处理代码,处理代码被称作回调函数。回调函数固定以 IRibbonControl 类型的对象作为参数。下面是三个按钮的处理代码:
Public Sub RefreshData(ctrl As IRibbonControl)MsgBox "刷新数据"
End SubPublic Sub InsertData(ctrl As IRibbonControl)MsgBox "新增记录"
End SubPublic 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
Excel VBA自定义功能区相关推荐
- Excel·VBA自定义函数筛选单元格区域重复值
贴吧提问<哪位大神知道要怎么实现?>,Excel内置函数使用比较麻烦,VBA字典实现比较直观 自定义函数UNIQUE_IF筛选单元格区域中的值,可以选择返回其中的唯一值或重复值,并用分隔符 ...
- Excel VBA自定义序列排序
图1 待排序数据集 在图1中所示的数据集中,如果希望按单元格区域E2:E6所列序列进行排序,需要先使用AddCustomList方法为应用程序添加自定义序列,示例代码如下. Sub SortByLis ...
- 一个可以使用多个正则表达式进行多次尝试匹配、替换或提取的Excel VBA自定义函数(UFD)...
该自定义函数可使用多个正则表达式对目标单元格进行多次匹配尝试,如匹配成功,将停止尝试匹配其他正则表达式,并且使用该正则表达式相对应的替换表达式进行替换,返回替换结果. 您可以直接下载包含该函数代码的X ...
- EXCEL VBA 自定义函数 招标代理费计算
依据<国家发展计划委员会文件计价格[2002]1980号>计算招标代理费的自定义函数 Option ExplicitFunction 招标代理费(服务类型 As String, 中标金额 ...
- Excel·VBA自定义正则表达式函数、使用
目录 正则表达式替换函数 应用1,提取1个字母+10个数字 应用2,中英文分割 应用3,提取11位手机号 应用4,指定文字替换 应用5,提取最后一个括号的内容 应用6,提取所有括号的内容 应用7,提取 ...
- Excel·VBA自定义函数获取单元格多数或少数值
<excel吧提问-单元格多数值>,返回多个单元格中出现最多次数的单元格的值 适用多个单元格和单元格区域,可查找多数.少数的单元格值 Function majority(mode, Par ...
- WPS 自定义功能区添加宏(VBA)设定的功能
MicroOffice Excel可以在"自定义功能区"菜单中,可以直接添加"宏".但是WPS Excel的"自定义功能区"设置菜单不支持& ...
- Excel VBA 实现Ribbon自定义功能区
Excel VBA 实现Ribbon自定义功能区 2022.12.3修改 目录 自定义功能区的实现 1.编写执行代码生成.xlam文件,拷贝到%APPDATA%\Microsoft\AddIns\ 2 ...
- vba 自定义function返回值_用vba解决excel如何求前面连续为0的个数
领导布置了任务,要求每天统计当月的发展量,并且统计有多少业务员最多连续多少天发展为0的情况,统计的表格是这样的. 用几行简单的VBA语言就能解决这个问题 首先打开vba编辑窗口,点击开发工具--vis ...
最新文章
- 弹窗页面PHP代码不执行,PHP代码没有被执行,而是代码显示在页面上
- (转) Linux 内核运行参数修改——sysctl命令
- bower overrides 配置
- 低功耗广域网:关键特性
- 创建表空间时ora-01119和ora-27040的处理
- 重写Android系统自带Dialog
- 如何删除所有已合并的Git分支?
- css样式:文字led效果(走马灯、轮播)
- JQuery实战图片特效-遁地龙卷风
- 《寄生虫》横扫奥斯卡,Python告诉你这部电影到底好在哪儿?
- 初测ONES项目管理工具,寻求与众不同
- 局域网ip冲突检测工具_只需一台Android设备就能打通局域网内部通讯:文字聊天与文件传输...
- 小甲鱼 P61 IO缓冲区
- 【点击复制 并自动打开微信添加好友】h5点击复制微信号并自动打开微信添加好友
- 利用Smart3D(CC)进行物体建模
- windows录屏html文件,win7系统自带的屏幕录制工具如何打开使用
- 区块链超级记帐本架构概览
- 23-【kubernetes】二进制方式安装k8s集群遇到的问题
- 科研工具|Ubuntu 装机那些事(更新中)☺️
- Linux 常见命令四大类
热门文章
- oracle remap语句格式,oracle通过expdp的remap_data实现简单的数据脱敏
- 手机做证件照的方法是什么
- 【MySQL篇】第三篇——表的操作
- [域] 大量日志错误,事件ID:1058 事件ID:1030
- 制作Android程序的应用图标并应用
- Brainfuck语言入门
- 在Python中以foo.bar.baz的方式访问嵌套dict中的内容
- Kubernetes核心原理(二)之Controller Manager
- 2、yum和epel是什么
- 介绍中国传统节日的网页html,介绍中国传统节日