ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > 综合应用 > 细品RibbonX(51):如何共享Ribbon定制之跨文件共享Ribbon项目

细品RibbonX(51):如何共享Ribbon定制之跨文件共享Ribbon项目

作者:绿色风 分类: 时间:2022-08-17 浏览:121
楼主
apolloh
下面主要介绍创建包含共享选项卡和组的宿主文件,以及添加自已的命令到宿主文件的选项卡中的单独的附属文件。所演示的技术主要用于创建加载项时,操作如下:
  • 在宿主UI文件中为共享选项卡创建功能区定制。
  • 在此文件中添加所期望的全局的组或命令。
  • 另外的上下文定制或命令被包含在其它文件或加载项格式中。
  • 在需要时装载其他文件,附加其命令到宿主文件的定制中。要创建共享的选项卡和组,必须先看看如何在XML代码中创建共享的命名空间。
    创建共享的命名空间
    每个UI定制都需要与一个命名空间相联系。先看看标准的customUI标记:


    1. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
    已经给customUI元素提供了xmlns属性,其值为一个URL。URL是希望使用的XML命名空间的名称。这个特殊的URL只是Microsoft决定使用的文本值,没有对应的网页页面,意味着功能区定制不需要Internet访问。
    Microsoft原先为预定义的命名空间使用名称“CustomRibbon”或任何其他单词,但是他们最终选择使用URL。对于我们来说,重要的是如果希望处理Microsoft的选项卡、组和控件,那么必须指向这个命名空间,包含所有内置的RibbonX元素。
    Microsoft也为我们提供了创建自已的命名空间的能力,能够使我们以同样的方式共享选项卡和组。此时,需要在customUI标记中添加另一个xmlns属性:


    1. <customUI
    2.     xmlns="http://schemas.microsoft.com/office/2006/01/customui"
    3.     xmlns:Q="Custom Namespace">
    注意到,Microsoft的默认命名空间仍保留在customUI标记中。同时,这确保仍然能够访问所有Microsoft的默认选项卡、组和其他控件。除了默认的命名空间外,我们也添加了xmlns:Q属性。
    在上述代码中,Q是为命名空间声明的本地名称,当然可以使用其他你喜欢的名称,建议在本地名称前加上前缀“ns”,以符合命名规范。同时,建议命名应该易识别和简短,以方便使用。
    假设决定使用本地名称“Custom”,那么自定义xmlns:Q应该如下:
    xmlns:nsCustom="Custom Namespace"

    双引号之间的部分用于跨文件引用定制,完全是纯文本。例如,如果希望定制看起来像官方的一样,那么可以放置一个指向自已站点的URL。这是一个文本引用,而不管该引用页是否存在。
    关键是在每个文件开始的引用应附加到自定义的命名空间。创建xmlns:Q属性是跨多个文件共享选项卡和组的基础。
    在Excel**享选项卡和组
    本示例被分成两部分:宿主Excel加载项文件的创建,附加到宿主的自定义选项卡的文件的创建。
    首先,打开Excel并以加载项(xlam)文件格式保存新工作簿,将其命名为UIHost.xlam并保存在默认的加载项目录。创建完毕后,关闭Excel。
    在CustomUI Editor中打开UIHost.xlam文件,输入下列代码:


    1. <customUI
    2.     xmlns="http://schemas.microsoft.com/office/2006/01/customui"
    3.     xmlns:nsHost="My Shared Ribbon">
    4.     <ribbon startFromScratch="false">
    5.         <tabs>
    6.             <tab idQ="nsHost:rxTabUI"
    7.               label="UI Test"
    8.               insertBeforeMso="TabHome">
    9.               <group idQ="nsHost:rxGrpUI"
    10.                  label="UI Host">
    11.                  <button id="rxHost_Btn1"
    12.                     label="Host UI Button"
    13.                     onAction="rxHost_Buttons"
    14.                     imageMso="HappyFace"/>
    15.               </group>
    16.             </tab>
    17.         </tabs>
    18.     </ribbon>
    19. </customUI>
    注意到,我们为共享的功能区控件创建了一个名为nsHost的自定义命名空间。再看看tab元素,使用idQ属性代替id属性,确保选项卡被创建在共享的命名空间中,并允许其他文件在其中放置组。
    idQ属性总是采用下面的形式:
    idQ="localname:id"

    对于本示例来说,本地名为nsHost。本地名后面是“:”表示名称结束,然后是控件的唯一标识符。
    接下来的代码中,group元素也使用idQ属性声明,允许组被共享,因此能够使开发人员在其中添加单独的控件。
    最后代码创建了一个按钮,注意到没有使用idQ属性声明,而是使用了标准的id属性,因为:
  • 该按钮被存储在加载项中,因此它将总是可见的。
  • 任何期望的动态功能都能够通过与该按钮元素相关的回调来设置。
  • 没有在按钮中嵌套控件的方法,因此不需要共享。验证代码并保存后,生成回调签名并复制,关闭CustomUI Editor,然后重新打开Excel。按照前面文章所介绍的方法安装加载项,打开VBE,导航到UIHost.xlam工程,添加一个新标准模块,粘贴回调签名,并输入代码:


    1. Private Sub rxHost_Buttons(Control As IRibbonControl)
    2.     '管理按钮事件
    3.     Select Case Control.ID
    4.         Case Is = "rxHost_Btn1"
    5.             MsgBox "调用至" & ThisWorkbook.Name
    6.         Case Else
    7.             '放置其它宏
    8.     End Select
    9. End Sub
    该过程的目的是反馈调用它的工作簿的名称。
    回到Excel界面,测试按钮,如下图所示。

     
    下一步需要创建一个新文件,附加该文件自已的自定义组到UIHost的共享选项卡。
    打开Excel,创建一个新工作簿,将其保存为启用宏的文件,并命名为Leech.xlsm。在CustomUI Editor中打开该文件,输入下列XML代码:


    1. <customUI
    2.     xmlns="http://schemas.microsoft.com/office/2006/01/customui"
    3.     xmlns:nsLeech="My Shared Ribbon">
    4.     <ribbon startFromScratch="false">
    5.         <tabs>
    6.             <!-- Shared tab in UI Host file -->
    7.             <tab idQ="nsLeech:rxTabUI">
    8.                 <!-- Shared group in UI Host file -->
    9.                 <group idQ="nsLeech:rxGrpLeech"
    10.                    label="Leech"
    11.                    insertBeforeQ="nsLeech:rxGrpUI">
    12.                        <!-- Controls built using a shared namespace in current file -->
    13.                        <labelControl idQ="nsLeech:rxLbl01"
    14.                          label="Defined Namespace"/>
    15.                        <button idQ="nsLeech:rxButton01"
    16.                          label="Button 1"
    17.                          onAction="rxSharedCallControl_Click"
    18.                          imageMso="HappyFace"/>
    19.                        <button idQ="nsLeech:rxButton02"
    20.                          label="Button 2"
    21.                          onAction="rxSharedCallControl_Click"
    22.                          imageMso="HappyFace"/>
    23.                        <!--Controls build without using shared namespace(alse in current file) -->
    24.                        <separator id="rxSeparator01"/>
    25.                        <labelControl id="rxLbl_02"
    26.                          label="No Namespace"/>
    27.                        <button id="rxButton03"
    28.                          label="Button 3"
    29.                          onAction="rxSharedCallControl_Click"
    30.                          imageMso="HappyFace"/>
    31.                        <button id="rxButton04"
    32.                          label="Button 4"
    33.                          onAction="rxSharedCallControl_Click"
    34.                          imageMso="HappyFace"/>
    35.                 </group>
    36.             </tab>
    37.         </tabs>
    38.     </ribbon>
    39. </customUI>
    你应该注意到上述代码中,定义共享的命名空间与在UIHost.xlam文件中一样。只是将命名空间的名字修改为nsLeech,而文本标识符仍然是“My Shared Ribbon”。当然,命名空间的名称可以是任意的,修改的目的只是为了更清晰。相反,自定义命名空间“My Shared Ribbon”必须与UIHost.xlam文件中指定的相同,这是允许我们将文件链接在一起的工具。
    完成代码输入并验证后,保存代码,复制回调签名,关闭CustomUI Editor。
    在Excel中重新打开Leech.xlsm文件,打开VBE,插入一个新的标准模块,粘贴回调签名,并修改代码如下:


    1. Sub rxSharedCallControl_Click(control As IRibbonControl)
    2.     '响应按钮单击并通知用户在哪里调用的过程
    3.     MsgBox "单击的 " & control.ID & " 来自 " & ThisWorkbook.Name
    4. End Sub
    现在,打开Leech.xlsm文件后的界面如下图所示。

     
    在“UI Test”选项卡中添加了Leech组,以及我们创建的所有控件。
    现在,创建一个新工作簿,UI将会更新,如下图所示。

     
    我们创建的带有id属性的控件消失了,仅剩下带有idQ声明的控件。
    然而,当单击按钮Button1和Button2时,什么也没有发生,为什么呢?
    使用idQ属性声明的控件,不会触发任何回调,其原因与存在和不存在命名空间之间的差别相关,没有办法允许对创建在不存在的命名空间中带有idQ属性的控件触发回调。这限制了共享的选项卡和组的使用。
  • 2楼
    い卋玑┾宝珼
    黄版版好棒
    3楼
    水吉果果
    哇塞

    免责声明

    有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
    ------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

    评论列表
    sitemap