打造个性化的Excel的工具栏(Ribbon)界面
本节从最基本的Ribbon开始进入xlam(xlsm)文件的工具栏配置,因为xlsx文件没有宏,配置了工具栏效果不大,不纳入。
什么是工具栏呢?如下图:
image.pngOffice中已经有非常多的各种甚至有点花哨的玩法了,可以说微软在做这些工具栏的时候那是相当有心得的。那么,咱们自己也能做嘛?答案必然是可以,而且还十分好用。
不过在此先打个前提哈,因为俺也不专门研究这类东西,本着将就着能用,差不多就行的想法,所以也没多少心得,也并不打算对这个做深入的探索,所以花哨的事情可要请大家多多查阅资料。
要生成工具栏,先要下载一个好用的工具:
(这是源码下载)
(这是安装文件下载)
拉到第一条的最底部,便是安装文件的下载链接,下载适合自己的并安装即可。
image.png当前为1.8.0版本(time:20210913),用过很多版本了,基本界面和逻辑一致。
安装后图标长成这个样子:
image.png打开之后界面长这个样子:
Office RibbonX Editor界面.png好,我们可以正式干活了。
第1步:用Office RibbonX Editor打开xlam文件(本例为test.xlsm文件):
image.png第2步:插入office 2010+ 定制UI
image.png第3步:打开customUI14.xml
image.png image.png第4步,插入XML示例-->Custom Tab
image.png<图9</figcaption>
image.png<图10</figcaption>
第5步,保存打开test.xlsm文件。看看有什么情况出现。
image.png第6步,学习分析和照着写。
xml撰写规则
- 所有的代码可以写在xml文件中tabs中,不同的tab代表了不同的工具栏大类。tab的id不能与系统默认的一致,也不能重复。
- 所有的group都写在tab中,不同的group代表了不同的工具栏小类。group的id不能与系统默认的一致,所有的group的id都不能重复。为了实现紧缩后的group还有个图标,可加image="xxx"实现,如图12(基础序列设置 为 绿色人头)。
- 所有的控件,包括button,textbox等都写在group中,不同的控件代表了要执行不同的功能,当然功能一样也行,不过就是有点儿浪费罢了。所有控件的id不能与系统默认的一致,所有的控件的id都不能重复。
- 以button为例:有如下几个关键属性
- id="customButton" id是这个button的身份,id自己定义且必须唯一,这样解析文件才能找得到
- label="Custom Button" label是显示给别人看的文字,自定义且要简明扼要,一看就能明白是干啥的
- imageMso="HappyFace" imageMso是显示的图标,最好与功能相匹配,好辨认
- size="large" size是控件在工具栏显示的大小,有多种形式,我常常比较懒,就不用别的。。。
-
onAction="Callback" onAction是要执行的功能,也就是俗称的“回调”,大白话就是:往回去VBA中调用哪个功能(Sub块),比如本例的Callback,就应该在VBA代码中有唯一对应的一个 名为 CallBack 的 SUB 代码块去执行。 如前,则建议在VBA中写为:Private Sub **CallBack **(Optional Control As IRibbonControl) 这种形式,若为新手的就照这种来写就行。
-
button中的 imageMso="" 是代表的系统自带的图标(微软提供的图标,海量,有几千个),如果是自己定义的图标则使用 image="" 属性。为了不侵权,建议所有的image自制。除了button这种,还有很多种类型的,想搞懂的直接装个VS2022,安装VSTO,各种控件都看得到,怎么用怎么搭配上手很快的。
-
为了提醒使用者某个按钮的使用方法或者注意事项,可以在 screentip="" 这个属性中添加内容,不建议太长。因为说不定你哪天完善了功能而忘了改这个就不好了。
第7步,补充VBA代码
'此代码适用于VBA,请勿在VB.net中使用
Private Sub ShowSuperVlookup(Optional Control As IRibbonControl)
'如果是以tag为区分的话,可以使用select case Control.tag 再在 case 中逐个调用对应的功能即可。
APPA16_QuickFindData.Show 0
End Sub
Show的就是用VBA写一个好的宏工具
说明:
- 括号中的 Optional Control As IRibbonControl 一定要带上
- Sub可以是全局Private的,而且Sub 名最好不重复
- 另外可以将所有的 Control 全部集中到一起
另外,可以在专门的模块中实现RibbonOnLoad功能,即加载即运行某些特定的代码等。
'此代码适用于VBA,请勿在VB.net中使用
Private MyRibbon As Office.IRibbonUI ''''模块级变量
Private Sub RibbonOnload(Optional Ribbon As IRibbonUI)
Callback for customUI.onLoad,加载XML文件时
Set MyRibbon = Ribbon ''''指向ribbon对象
'实现授权等功能
Dim 网络授权 As New 授权
网络授权.Test
End Sub
一个简单的xml实例:
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="RibbonOnload">
<ribbon>
<tabs>
<tab id="tabBiaoGeGongJu" label="表格工具" >
<group id="groupKeShiHua" label="可视" image="ToolsAboutMe">
<button id="btnHuiZongBiaoMing" label="汇总 表名 " size="large" screentip="X" onAction="Y" image="HuiZongBiaoMingIco1" />
<button id="btnHuiHuiZongBiao" label="回汇 总表 " size="large" screentip="X" onAction="Y" image="HuiHuiZongBiaoIco2" />
<button id="btnSheZhiYinCang" label="设置 隐藏 " size="large" screentip="X" onAction="Y" image="SheZhiYinCangIco1" />
</group>
<group id="groupZhuanZhi" label="转值" image="ToolsAboutMe">
<button id="btnGongShiZhuanZhi" label="公式 转值 " size="large" screentip="X" onAction="Y" image="FunctionToValIco" />
<button id="btnAreaQuChong" label="区域 去重 " size="large" screentip="X" onAction="Y" image="GongAreaQuChongIco1" />
</group>
<group id="groupTiSu" label="提速" image="ToolsAboutMe">
<button id="btnOpenTiSu" label="开启 提速 " size="large" screentip="X" onAction="Y" image="RunFastIco" />
<button id="btnCloseTiSu" label="关闭 提速 " size="large" screentip="X" onAction="Y" image="StopFastIco" />
</group>
<group id="groupPaiXu" label="自定义排序" image="ToolsAboutMe">
<button id="btnTSBPX1" label="文字 排序 " size="large" screentip="X" onAction="Y" image="ToushiPaixuIcoStr" />
<button id="btnTSBPX1Set" label="文字 设置 " size="large" screentip="X" onAction="Y" image="ToushiPaixuSetIco" />
<button id="btnQuickRank" label="数据 排名 " size="large" screentip="X" onAction="Y" image="ToushiPaixuIcoNUM" />
</group>
<group id="groupKuaiSuPiPei" label="快匹配" image="ToolsAboutMe">
<button id="KuaiSuPiPeiButton" label="快速 匹配 " size="large" screentip="X" onAction="Y" image="QuickMatchIco" />
<button id="RangeSuperLinkButton" label="单元格 超链接 " size="large" screentip="X" onAction="Y" image="quickLINK" />
<button id="KuaiSuCountifsButton" label="快速 计数 " size="large" screentip="X" onAction="Y" image="QuickSumIco" />
<button id="KuaiSuChaiDanBiao" label="表格 速拆 " size="large" screentip="X" onAction="Y" image="QuickSplit" />
<button id="ListSigSheetsSaveButton" label="分表 保存 " size="large" screentip="X" onAction="Y" image="SaveSplitSheet" />
</group>
<group id="groupFormula" label="提取" image="ToolsAboutMe">
<button id="GotTheFormulaButton" label="提取 公式 " size="large" screentip="X" onAction="Y" image="GetFunctionIco" />
<button id="ListDataGetoutButton" label="提取序 列结果 " size="large" screentip="X" onAction="Y" image="Get_MList" />
<button id="SupplementHeaderButton" label="补全 表头 " size="large" screentip="X" onAction="Y" image="GetHeader" />
</group>
<group id="groupXlsToXlsx" label="文件" image="ToolsAboutMe">
<button id="ButtonXlsToXlsx" label="批转 XLSX " size="large" screentip="X" onAction="Y" image="arrow_circular" />
</group>
<group id="groupReplaceZeroAndError" label="单格处理" image="ToolsAboutMe">
<button id="Button_ReplaceZeroAndError" label="去0和 错误项 " size="large" screentip="X" onAction="Y" image="cancel" />
<button id="Button_SpaceRangeGetSpaceFormula" label="空格加 空公式 " size="large" screentip="X" onAction="Y" image="SpaceEqual" />
<button id="Button_RandData" label="随机化 数字 " size="large" screentip="X" onAction="Y" image="NumRnd" />
<button id="Button_AutoFilterShowAllData" label="取消全 表筛选 " size="large" screentip="X" onAction="Y" image="ShowAllData" />
</group>
<group id="groupQuickSetBase" label="基础序列设置" image="ToolsAboutMe">
<button id="Button_QuickSetCityRibbon" label="序列 V1 " size="large" screentip="X" onAction="Y" image="list1" />
<button id="Button_QuickSetCityAndOperatorsRibbon" label="序列 V2 " size="large" screentip="X" onAction="Y" image="list2" />
<button id="Button_QuickSetCityAndAscriptionRibbon" label="序列 V3 " size="large" screentip="X" onAction="Y" image="list3" />
<button id="Button_QuickSetFullRibbon" label="序列 V4 " size="large" screentip="X" onAction="Y" image="list4" />
<button id="Button_QuickSetSupperRibbonSet" label="预览 序列 " size="large" screentip="X" onAction="Y" image="listSee" />
<button id="Button_QuickSetRibbonSet" label="定义 序列 " size="large" screentip="X" onAction="Y" image="listSetting" />
</group>
<group id="groupToolsAboutMe" label="关于" image="ToolsAboutMe2">
<button id="Button_ToolsAboutMe" label="关于 工具 " size="large" screentip="关于工具" onAction="ToolsAboutMe" image="ToolsAboutMe2" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
xml中的 screentip="X"onAction="Y" 需要自己补充哦。各位聪明的知sir肯定没有任何技术难度的啦。
生成工具栏示例
image.png当然了,以上的所有知识,通用可以用于WORD和PPT的VBA二次开发过程,没有什么特别要改的,就是WORD的往往不能持续,经常要改,或者程序要做的特别灵活,又不如干脆使用Word提供的功能了,PPT的转PPAM改起来特别麻烦,都不建议。还是Excel二次开发比较人性化。另外讲两个点:
1、PPT做二次开发,不如使用VSTO方式
2、VS2022的Ribbon有如下一些控件(图14),很丰富哦:
坚持分享VBA实战代码,您会发现每个项目都是真实需求,每一段文字都是亲手研磨,并且十分荣幸与简Sir们在此共同进步。
网友评论