美文网首页VBA
打造个性化的Excel的工具栏(Ribbon)界面

打造个性化的Excel的工具栏(Ribbon)界面

作者: 极客Geek | 来源:发表于2023-09-09 19:13 被阅读0次

打造个性化的Excel的工具栏(Ribbon)界面

本节从最基本的Ribbon开始进入xlam(xlsm)文件的工具栏配置,因为xlsx文件没有宏,配置了工具栏效果不大,不纳入。

什么是工具栏呢?如下图:

image.png

Office中已经有非常多的各种甚至有点花哨的玩法了,可以说微软在做这些工具栏的时候那是相当有心得的。那么,咱们自己也能做嘛?答案必然是可以,而且还十分好用。

不过在此先打个前提哈,因为俺也不专门研究这类东西,本着将就着能用,差不多就行的想法,所以也没多少心得,也并不打算对这个做深入的探索,所以花哨的事情可要请大家多多查阅资料。

要生成工具栏,先要下载一个好用的工具:

(这是源码下载)

office ribbonx editor源码

(这是安装文件下载)

下载安装文件

拉到第一条的最底部,便是安装文件的下载链接,下载适合自己的并安装即可。

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撰写规则

  1. 所有的代码可以写在xml文件中tabs中,不同的tab代表了不同的工具栏大类。tab的id不能与系统默认的一致,也不能重复。
  2. 所有的group都写在tab中,不同的group代表了不同的工具栏小类。group的id不能与系统默认的一致,所有的group的id都不能重复。为了实现紧缩后的group还有个图标,可加image="xxx"实现,如图12(基础序列设置 为 绿色人头)。
  3. 所有的控件,包括button,textbox等都写在group中,不同的控件代表了要执行不同的功能,当然功能一样也行,不过就是有点儿浪费罢了。所有控件的id不能与系统默认的一致,所有的控件的id都不能重复。
  4. 以button为例:有如下几个关键属性
  1. id="customButton" id是这个button的身份,id自己定义且必须唯一,这样解析文件才能找得到
  2. label="Custom Button" label是显示给别人看的文字,自定义且要简明扼要,一看就能明白是干啥的
  3. imageMso="HappyFace" imageMso是显示的图标,最好与功能相匹配,好辨认
  4. size="large" size是控件在工具栏显示的大小,有多种形式,我常常比较懒,就不用别的。。。
  1. onAction="Callback" onAction是要执行的功能,也就是俗称的“回调”,大白话就是:往回去VBA中调用哪个功能(Sub块),比如本例的Callback,就应该在VBA代码中有唯一对应的一个 名为 CallBack 的 SUB 代码块去执行。 如前,则建议在VBA中写为:Private Sub **CallBack **(Optional Control As IRibbonControl) 这种形式,若为新手的就照这种来写就行。

  2. button中的 imageMso="" 是代表的系统自带的图标(微软提供的图标,海量,有几千个),如果是自己定义的图标则使用 image="" 属性。为了不侵权,建议所有的image自制。除了button这种,还有很多种类型的,想搞懂的直接装个VS2022,安装VSTO,各种控件都看得到,怎么用怎么搭配上手很快的。

  3. 为了提醒使用者某个按钮的使用方法或者注意事项,可以在 screentip="" 这个属性中添加内容,不建议太长。因为说不定你哪天完善了功能而忘了改这个就不好了。

image.png

第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写一个好的宏工具

说明:

  1. 括号中的 Optional Control As IRibbonControl 一定要带上
  2. Sub可以是全局Private的,而且Sub 名最好不重复
  3. 另外可以将所有的 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="汇总&#13;表名&#13;" size="large"  screentip="X"  onAction="Y" image="HuiZongBiaoMingIco1" />
          <button  id="btnHuiHuiZongBiao" label="回汇&#13;总表&#13;" size="large"  screentip="X"  onAction="Y"  image="HuiHuiZongBiaoIco2" />
          <button  id="btnSheZhiYinCang" label="设置&#13;隐藏&#13;" size="large"  screentip="X"   onAction="Y" image="SheZhiYinCangIco1" />
        </group>
        <group id="groupZhuanZhi"  label="转值" image="ToolsAboutMe">
          <button  id="btnGongShiZhuanZhi" label="公式&#13;转值&#13;" size="large"  screentip="X"  onAction="Y" image="FunctionToValIco" />
          <button  id="btnAreaQuChong" label="区域&#13;去重&#13;" size="large"  screentip="X"  onAction="Y" image="GongAreaQuChongIco1" />
        </group>
        <group id="groupTiSu"  label="提速" image="ToolsAboutMe">
          <button  id="btnOpenTiSu" label="开启&#13;提速&#13;" size="large"  screentip="X"  onAction="Y" image="RunFastIco" />
          <button  id="btnCloseTiSu" label="关闭&#13;提速&#13;" size="large"  screentip="X"  onAction="Y" image="StopFastIco" />
        </group>
        <group id="groupPaiXu"  label="自定义排序" image="ToolsAboutMe">
          <button  id="btnTSBPX1" label="文字&#13;排序&#13;" size="large"  screentip="X"  onAction="Y" image="ToushiPaixuIcoStr" />
          <button  id="btnTSBPX1Set" label="文字&#13;设置&#13;" size="large"  screentip="X"  onAction="Y" image="ToushiPaixuSetIco" />
          <button  id="btnQuickRank" label="数据&#13;排名&#13;" size="large"  screentip="X"  onAction="Y" image="ToushiPaixuIcoNUM" />
        </group>
        <group id="groupKuaiSuPiPei"  label="快匹配" image="ToolsAboutMe">
          <button  id="KuaiSuPiPeiButton" label="快速&#13;匹配&#13;" size="large"  screentip="X"  onAction="Y" image="QuickMatchIco" />
          <button  id="RangeSuperLinkButton" label="单元格&#13;超链接&#13;" size="large"  screentip="X"  onAction="Y" image="quickLINK" />
          <button  id="KuaiSuCountifsButton" label="快速&#13;计数&#13;" size="large"  screentip="X"  onAction="Y" image="QuickSumIco" />
          <button  id="KuaiSuChaiDanBiao" label="表格&#13;速拆&#13;" size="large"  screentip="X"  onAction="Y" image="QuickSplit" />
          <button  id="ListSigSheetsSaveButton" label="分表&#13;保存&#13;" size="large"  screentip="X"  onAction="Y" image="SaveSplitSheet" />
        </group>
        <group id="groupFormula"  label="提取" image="ToolsAboutMe">
          <button  id="GotTheFormulaButton" label="提取&#13;公式&#13;" size="large"  screentip="X"  onAction="Y" image="GetFunctionIco" />
          <button  id="ListDataGetoutButton" label="提取序&#13;列结果&#13;" size="large"  screentip="X"  onAction="Y" image="Get_MList" />
          <button  id="SupplementHeaderButton" label="补全&#13;表头&#13;" size="large"  screentip="X"  onAction="Y" image="GetHeader" />
        </group>
        <group id="groupXlsToXlsx"  label="文件" image="ToolsAboutMe">
          <button  id="ButtonXlsToXlsx" label="批转&#13;XLSX&#13;" size="large"  screentip="X"  onAction="Y" image="arrow_circular" />
        </group>
        <group id="groupReplaceZeroAndError"  label="单格处理"  image="ToolsAboutMe">
          <button  id="Button_ReplaceZeroAndError" label="去0和&#13;错误项&#13;" size="large"  screentip="X"  onAction="Y" image="cancel" />
          <button  id="Button_SpaceRangeGetSpaceFormula" label="空格加&#13;空公式&#13;" size="large"  screentip="X"  onAction="Y" image="SpaceEqual" />
          <button  id="Button_RandData" label="随机化&#13;数字&#13;" size="large"  screentip="X"  onAction="Y" image="NumRnd" />
          <button  id="Button_AutoFilterShowAllData" label="取消全&#13;表筛选&#13;" size="large"  screentip="X"  onAction="Y" image="ShowAllData" />
        </group>
        <group id="groupQuickSetBase"  label="基础序列设置"  image="ToolsAboutMe">
          <button  id="Button_QuickSetCityRibbon" label="序列&#13;V1&#13;" size="large"  screentip="X"  onAction="Y" image="list1" />
          <button  id="Button_QuickSetCityAndOperatorsRibbon" label="序列&#13;V2&#13;" size="large"  screentip="X"  onAction="Y" image="list2" />
          <button  id="Button_QuickSetCityAndAscriptionRibbon" label="序列&#13;V3&#13;" size="large"  screentip="X"  onAction="Y" image="list3" />
          <button  id="Button_QuickSetFullRibbon" label="序列&#13;V4&#13;" size="large"  screentip="X"  onAction="Y" image="list4" />
          <button  id="Button_QuickSetSupperRibbonSet" label="预览&#13;序列&#13;" size="large"  screentip="X"  onAction="Y" image="listSee" />
          <button  id="Button_QuickSetRibbonSet" label="定义&#13;序列&#13;" size="large"  screentip="X"  onAction="Y" image="listSetting" />
        </group>
        <group id="groupToolsAboutMe"  label="关于"  image="ToolsAboutMe2">
          <button  id="Button_ToolsAboutMe" label="关于&#13;工具&#13;" 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),很丰富哦:

图14.png

坚持分享VBA实战代码,您会发现每个项目都是真实需求,每一段文字都是亲手研磨,并且十分荣幸与简Sir们在此共同进步。

相关文章

网友评论

    本文标题:打造个性化的Excel的工具栏(Ribbon)界面

    本文链接:https://www.haomeiwen.com/subject/egmrvdtx.html