ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: jiulongpo

[分享] 细品RibbonX(1-59) (转)

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 15:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:UI界面定制
本帖最后由 jiulongpo 于 2012-8-6 20:19 编辑

接 细品RibbonX(9):层次分明的RibbonX代码结构


完整的代码
上述示例完整的XML代码如下:
  1. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  2.     <commands>
  3.         <command idMso="FileSave" enabled="false" />
  4.     </commands>
  5.     <ribbon startFromScratch="true">
  6.         <officeMenu>
  7.             <button id="rxOMBtn1" label="My Office Button1" />
  8.             <button id="rxOMBtn2" label="My Office Button2" />
  9.             <menu id="MyOfficeMenu" label="My Office Menu">
  10.                 <button id="rxSend1" label="My Menu1" />
  11.                 <button id="rxSend2" label="My Menu2" />
  12.                 <button id="rxSend3" label="My Menu3" />
  13.                 <button id="rxSend4" label="My Menu4" />
  14.                 <button id="rxSend5" label="My Menu5" />
  15.                 <button id="rxSend6" label="My Menu6" />
  16.                 <button id="rxSend7" label="My Menu7" />
  17.                 <button id="rxSend8" label="My Menu8" />
  18.                 <button id="rxSend9" label="My Menu9" />
  19.             </menu>
  20.         </officeMenu>
  21.         <qat>
  22.             <sharedControls>
  23.                 <control idMso="Font" />
  24.             </sharedControls>
  25.             <documentControls>
  26.                 <control idMso="BordersGallery" />
  27.             </documentControls>
  28.         </qat>
  29.         <tabs>
  30.             <tab id="rxExcelVBA" label="Menu">
  31.                 <group idMso="GroupInsertChartsExcel" />
  32.                 <group id="rxAuditMisc" label="My Sample">
  33.                     <box id="rxSortBox">
  34.                         <control idMso="SortAscendingExcel" showLabel="false" />
  35.                         <control idMso="SortDescendingExcel" showLabel="false" />
  36.                         <control idMso="SortDialog" showLabel="false" />
  37.                     </box>
  38.                     <control idMso="Copy" />
  39.                     <control idMso="PasteMenu" />
  40.                     <separator id="rxAuditMiscSeparator1" />
  41.                     <control idMso="NameManager" />
  42.                     <control idMso="ViewFreezePanesGallery" />
  43.                     <control idMso="WindowSwitchWindowsMenuExcel" />
  44.                 </group>
  45.                 <group id="rxDemo" label="My Menu">
  46.                     <menu id="rxMenu" label="Menu" imageMso="ReviewCompareMenu" size="large">
  47.                         <menu id="subMenu1" label="SubMenu1">
  48.                             <menu id="subMenu11" label="3-SubMenu1">
  49.                                 <button id="rxMenu11" label="Up" imageMso="OutlineMoveUp" />
  50.                                 <button id="rxMenu12" label="GoTo" imageMso="GoTo" />
  51.                                 <button id="rxMenu13" label="Down" imageMso="OutlineMoveDown" />
  52.                             </menu>
  53.                         </menu>
  54.                         <menu id="subMenu2" label="SubMenu2">
  55.                             <menu id="subMenu21" label="3-SubMenu2">
  56.                                 <button id="rxMenu21" label="Up" imageMso="OutlineMoveUp" />
  57.                                 <button id="rxMenu22" label="GoTo" imageMso="GoTo" />
  58.                                 <button id="rxMenu23" label="Down" imageMso="OutlineMoveDown" />
  59.                             </menu>
  60.                         </menu>
  61.                         <menuSeparator id="MySeparator" />
  62.                         <button id="rxMenuButton" label="Button" />
  63.                     </menu>
  64.                 </group>
  65.                 <group id="rxMyGroup" label="My Sample Group1">
  66.                     <button id="Button1" imageMso="HappyFace" size="large" label="BigButton" />
  67.                     <separator id="rxSeparator1" />
  68.                     <button id="b1" imageMso="HyperlinkInsert" size="large" label="Surf the Net" onAction="surf"/>
  69.                     <button id="b2" imageMso="HappyFace" label="Smile" onAction="smile"/>
  70.                     <button id="b3" imageMso="FormatPainter" label="Paint" onAction="paint"/>
  71.                     <button id="b4" imageMso="AutoFilterClassic" label="Filter" onAction="filter"/>
  72.                 </group>
  73.                 <group id="rxMyGroup1" label="My Sample Group2">
  74.                     <toggleButton imageMso="TranslationToolTip" id="MyToggleButton" size="large" label="Insert My Object"/>
  75.                     <separator id="rxSeparator2" />
  76.                     <checkBox id="AllowChanges" label="Allow Changes" />
  77.                     <dropDown id="ChooseDepartment" showLabel="true" label="Choose Department">
  78.                         <item id="Dept1" label="Shipping" />
  79.                         <item id="Dept2" label="Accounting" />
  80.                         <item id="Dept3" label="Engineering" />
  81.                     </dropDown>
  82.                     <comboBox id="ComboBox1" label="ComboBox">
  83.                         <item id="item1" label="one" imageMso="_1" />
  84.                         <item id="item2" label="two" imageMso="_2" />
  85.                         <item id="item3" label="three" imageMso="_3" />
  86.                     </comboBox>
  87.                 </group>
  88.             </tab>
  89.         </tabs>
  90.         <contextualTabs>
  91.             <tabSet idMso="TabSetChartTools" />
  92.         </contextualTabs>
  93.     </ribbon>
  94. </customUI>
复制代码

自定义Excel界面如图10所示:

图10:自定义的Excel界面
看起来代码较多,其实并不复杂,如果大家有疑问,先不要着急,有概念就行,后面我们将慢慢详细地讲解。
示例文档下载:



TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 15:03 | 显示全部楼层
本帖最后由 jiulongpo 于 2012-8-6 20:20 编辑

转自: http://www.excelperfect.com/index.php/2009/06/03/ribbonxstudy10/
细品RibbonX(10):使用记事本自定义功能区


本文主要介绍如何使用记事本自定义Office 2007功能区,仍然以Excel为例。
下面的示例创建一个非常简单的自定义功能区:在功能区中添加一个新的选项卡,并在该选项卡中放置两个内置的组。
步骤1 创建自定义功能区的文件,该文件中包含用于修改功能区的XML代码。
(1)创建一个名为customUI的文件夹。
(2)在该文件夹中,创建一个名为customUI.xml的文本文件。注意,文件的后缀名为xml,即该文件是一个XML文件。
(3)打开该文本文件,并输入下面的代码:

  1. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  2.     <ribbon startFromScratch="false">
  3.         <tabs>
  4.             <tab id="rxtabCustom"
  5.                 label="我的选项卡"
  6.                 insertBeforeMso="TabHome">
  7.                 <group idMso="GroupFont">
  8.                 </group>
  9.                 <group idMso="GroupZoom">
  10.                 </group>
  11.             </tab>
  12.         </tabs>
  13.     </ribbon>
  14. </customUI>
复制代码

注意,XML代码是区分大小写的,因此,应输入正确的大小写,否则将导致代码失败。
(4)保存该文件。
步骤2 创建希望使用自定义功能区的文件
(5)创建一个新的Excel 2007工作簿,或者打开一个现有的工作簿。这里,通过创建一个新工作簿来介绍。
(6)在某文件夹中以MyFirstUIModification.xlsx的文件名保存该工作簿,然后退出Excel。
步骤3 修改Excel压缩包中的文件,以引用自定义功能区的XML文件,从而实现自定义功能区。
(7)右击MyFirstUIModification.xlsx文件并选择“重命名”,保存完整的文件名,但是在其后面添加.zip扩展名。当出现警告框时,选择“是”。
现在,该文件修改为zip压缩文件,代替刚才标准的Office文档文件。
(8)双击该压缩文件,将其打开。
(9)拖动customUI文件夹并将其放置在压缩文件夹中。
(10)拖动压缩文件夹中的_rels文件夹到桌面,编辑.rels文件指定该文件和customUI文件夹之间的联系,从而链接功能区的修改。
(11)打开_rels文件夹并使用记事本编辑其.rels文件。在该文件末尾元素之前,插入新的联系语句。在输入语句时,应非常小心地使用标点符号、空格和大小写:

  1. <Relationship
  2.     Id="customUIRelID"
  3.     Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility"
  4.     Target="customUI/customUI.xml"/>
复制代码

(12)保存该.rels文件,关闭记事本。
(13)在压缩文件夹中,删除原来的_rels文件夹。
(14)将编辑过的_rels文件夹拖回到压缩文件夹中。
(15)关闭压缩文件夹。
(16)在压缩文件中单击右键并选择“重命名”,去掉名称后面的.zip扩展名,恢复为MyFirstUIModification.xlsx文件名。
(17)打开MyFirstUIModification.xlsx文件。
此时,如果出现错误消息,请重新检查.rels文件和customUI.xml文件,可能由于代码输入错误特别是大小写错误或拼写错误而导致错误。
如果一切正常,那么在“开始”选项卡左侧会出现一个名为“我的选项卡”的新选项卡,包含内置的“字体”组和“显示比例”组,即一个内置组的副本,如下图所示。

示例文档下载:
myFirstUIModification.rar





评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 15:08 | 显示全部楼层
本帖最后由 jiulongpo 于 2012-8-7 19:24 编辑

转自: http://www.excelperfect.com/index.php/2009/06/18/ribbonxstudy11/
细品RibbonX(11):使用Custom UI Editor自定义功能区


Custom UI Editor是一款用来编辑OpenXML文件的小型工具,更方便且实用。此外,还提供了一些验证和其它工具来减少开发量。
在下面的网站中可以免费下载该工具软件:
http://openxmldeveloper.org/articles/customuieditor.aspx
配置并安装CustomUI Editor
步骤1 对于Windows XP用户来说,首先应该安装Microsoft .NET Framework 2.0
通过“开始”─“控制面板”—“添加或删除程序”,在“添加或删除程序”对话框中检查是否有“Microsoft .NET Framework 2.0”项。如果没有,则可以到Microsoft的网站上下载。
对于Windows Vista用户来说,系统已安装Microsoft .NET Framework 2.0。
步骤2 安装Microsoft Office 2007 Custom UI Editor
下载CustomUI Editor并解压后,双击图标即可安装Microsoft Office 2007 Custom UI Editor。安装完成后,打开Custom UI Editor,然后在该编辑器中打开MyFirstUIModification.xlsx文件,此时如下图1所示。

图1:在Custom UI Editor中打开定制后的Excel 2007文件(注:乱码为中文,由于该编辑器不支持中文,因此显示乱码)
从图1中可以看到,在Custom UI编辑器中文件使用了颜色来区分不同的标记文本,并使用了缩排,版面清新自然。在该编辑器中,颜色能帮助阅读和理解代码;也能容易地嵌入图片、验证代码、存储代码片断,甚至生成响应的回调的代码框架。(回调,即当单击自定义的Ribbon控件时触发的VBA程序,后面将详细介绍。)
使用CustomUI Editor来定制功能区
下面,将使用CustomUI Editor来定制Excel功能区,使用与使用记事本自定义功能区相同的代码,从而演示CustomUI Editor和记事本处理功能区时的不同。
步骤1 打开Excel 2007,创建一个新的Excel文档,并将该文档命名为MySecondModification.xlsx。然后,关闭该文档。
步骤2 打开CustomUI Editor,在该编辑器中打开MySecondUIModification.xlsx文档,然后输入与之前在记事本中定制功能区时相同的代码。
  1. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  2.     <ribbon startFromScratch="false">
  3.         <tabs>
  4.             <tab id="rxtabCustom"
  5.                 label="My Tab"
  6.                 insertBeforeMso="TabHome">
  7.                 <group idMso="GroupFont">
  8.                 </group>
  9.                 <group idMso="GroupZoom">
  10.                 </group>
  11.             </tab>
  12.         </tabs>
  13.     </ribbon>
  14. </customUI>
复制代码

步骤3 验证代码
单击CustomUI编辑器工具栏右侧第二个按钮(Validate)。此时,如果没有错误,则会出现如下图2所示的消息框。

图2:在CustomUI Editor中验证代码,没有错误
如果有错误,那么将会指出存在的错误,如下图3所示的消息框。

图3:在CustomUI Editor中验证代码,有错误
在大多数情况下,错误消息都指出了错误发生的原因。
步骤4 一旦验证通过,保存并关闭CustomUI Editor。
步骤5 打开MySecondModification.xlsx文档,如下图4所示,已在该Excel文档中添加了新的选项卡。

图4:通过CustomUI Editor定制的Excel界面
在CustomUI Editor中存储定制模板
有时,您可能想引用以前曾经开发过的自定义界面,而CustomUI Editor提供了这样的功能,将代码存储为模板,方便以后再利用。
步骤1 打开记事本,输入下面的代码:
  1. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  2.     <ribbon startFromScratch="false">
  3.         <tabs>
  4.             <!-- Enter your first tab here -->
  5.         </tabs>
  6.     </ribbon>
  7. </customUI>
复制代码

步骤2 将该文本文件保存在Program Files\CustomUIEditor\Samples文件夹中,文件名为RibbonBase.xml。
(注意,Program Files\CustomUIEditor为Microsoft Office 2007 Custom UI Editor缺省的安装目录,如果安装在不同的路径下,只需更改为相应的路径即可)
步骤3 打开CustomUI Editor,选择菜单“Samples”,在列表中会看到“RibbonBase”条目,如图5所示。单击该条目,将出现模板中的代码,能使用该代码开始新的功能区定制。
[url=http://www.excelperfect.com/wordpress/wp-content/uploads/2009/06/ribbonx11-5.png]
图5:在CustomUI Editor中存储和使用模板
关于CustomUI Editor的使用
虽然使用CustomUI Editor能够使编辑XML代码更容易,但在使用前还是要对其进一步了解:



  • CustomUI Editor不会检查XML标记的形式,因此应确保只使用在XML架构中定义的属性。然而,CustomUI Editor能核查在引号内提供的属性的有效性。
  • 在编写和调试RibbonX代码时,不能够同时在应用程序和CustomUI Editor中打开要定制的文件。当文件已经在Office应用程序中打开时,试图在CustomUI Editor中保存该文件将导致错误。此外,即便关闭了正在编辑的Office应用程序文档,然后将其在CustomUI Editor中保存,CustomUI Editor仍将覆盖在应用程序中编辑文档所作的任何修改。在另外的工具中作出修改之前关闭应用程序将是更安全的。
  • CustomUI Editor没有查找/替换工具,因此,如果打算在XML代码中作大量的编辑,可以先将其复制到另一个应用程序,编辑后再复制回来。
  • 当处理充满屏幕的多行XML文件时,CustomUI Editor习惯刷新屏幕使光标总是在屏幕的最后一行,这使得经常需要移至后面想要编辑的行。因此,与前述方法一样,可以将代码复制到另一个应用程序中,编辑后再复制回来。
  • CustomUI Editor不支持中文,因此,如果想定制中文界面,必须在记事本中编写代码并将其以utf-8格式保存。含有中文的代码在CustomUI Editor中显示为乱码。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 15:10 | 显示全部楼层
本帖最后由 jiulongpo 于 2012-8-6 20:22 编辑

转自: http://www.excelperfect.com/index.php/2009/06/24/ribbonxstudy12/
细品RibbonX(12):使用XML Notepad自定义功能区


XML Notepad是另一款用来编辑或编写XML代码的工具,可以从Microsoft的站点免费下载。XML Notepad能够捕捉XML架构,从而验证代码。
安装XML Notepad
步骤1 从下列站点下载并安装XML Notepad
http://www.microsoft.com/downloads/details.aspx?familyid=72d6aa49-787d-4118-ba5f-4f30fe913628&displaylang=en
步骤2 从下列站点下载并提取Office 2007 XML架构
http://www.microsoft.com/downloads/details.aspx?familyid=15805380-F2C0-4B80-9AD1-2CB0C300AEF9&displaylang=en
步骤3 设置XML Notepad将架构链接到程序
首先打开XML Notepad,选择菜单“View”─“Schemas”,然后在“XML Schemas”屏幕中选择“File”─“Add schemas”,然后导航到需要提取的XML架构所在的文件夹,默认位置为C:\2007 Office System Developer Resources\Office2007XMLSchema\CustomUI.xsd。装载架构后,显示如下图1所示,单击“OK”。

图1:添加XML架构到XML Notepad
使用XML Notepad
使用XML Notepad最困难的部分是将文件装载并开始,这并不像在CustomUI Editor中打开Excel或Word文件那样简单,甚至不能从中创建新文件。相反,需要打开一个现有的XML文件。有两个主要的办法:


  • 与在记事本中一样,将文档重命名为zip文件,复制其中的CustomUI.xml文件进行处理。完成后,将更新的CustomUI.xml文件复制回zip容器,然后将文件改为原始的.xlsx扩展名。
  • 创建一个空的文本文件,从CustomUI Editor中复制现有的XML,然后保存为XML文件,接着在XML Notepad中打开该文件,在这里编辑代码,然后将代码复制回CustomUI Editor并保存。
虽然使用XML Notepad的很繁锁,但是它提供了几个功能,可以容易地创建有效的文件而不会有输入错误的危险。这对开发者来说是非常有利的。
下面来演示XML Notepad的使用。
步骤1 在CustomUI Editor中打开MySecondUIModification.xlsx文件。
步骤2 复制代码后关闭CustomUI Editor。
步骤3 在桌面上右击,创建一个新的文本文件并命名为temp.xml。
步骤4 右击该文件并选择编辑(此时不要选择XML Notepad)。
步骤5 粘贴刚才从CustomUI Editor中复制的代码。
步骤6 保存该文本文件并关闭。
步骤7 再在该文件上右击,此时选择“Edit with XML Notepad”。
单击其中的扩展符号(+),得到如下图2所示的屏幕,一个图形化的显示。

图2:XML Notepad
步骤8 右击“tab”元素,选择“Element”,然后选择“Child”,将在最后一个组的下面创建一个新元素,如下图3所示。

图3:添加元素
此时,XML Notepad将提供合适的项目列表,可以从中选择,这里是“group”元素,即设置该元素为组。
步骤9 接下来,在新添加的元素中右击,选择“Atrribute”,然后选择“Child”,此时将出现一个更长的项目列表,从中找到“idMso”后单击选中。
此时,光标将出现在右侧的屏幕中,与idMso一致,输入文本:GroupStyles,注意大小写。如下图4所示。

图4:添加属性
现在,已经修改了代码,于是想试验新代码。
此时,单击菜单“View”─“Source”,当提示是否保存代码时,选择“是”。将出现如下图5所示的屏幕,包含了新添加的标记。

图5:在XML Notepad中查看XML源代码
注意到代码与前面复制的代码稍微有点不同,出现了前面没有看到过的其它元素。
现在已经有了代码,那么继续进行下面的操作。
步骤10 复制整段代码并关闭该窗口。
步骤11 在CustomUI Editor中打开MySecondUIModification.xlsx文件。
步骤12 按Ctrl+A选择所有现有的代码。
步骤13 粘贴从XML Notepad程序中复制的代码。
步骤14 运行有效验证检查,然后保存并关闭文件。
最后,打开MySecondUIModification.xlsx文件以检查“My Tab”选项卡的外观,应该如下图6所示。

图6:Excel中更新后的My Tab选项卡
XML Notepad的优点
XML Notepad提供了许多CustomUI Editor或标准的记事本所没有的优点,包括:

  • XML Notepad能够使开发更容易。由于安装了相关的架构,因此能够从下拉列表中选择有效的元素和属性,类似于大多数Microsoft编码工具中的智能感知(IntelliSense)功能。
  • 与CustomUI Editor不同,XML Notepad有能力进行查找和替换样式搜索,这是其主要的优点。
  • XML Notepad包含一种称之为“Nudge”的功能,将一块代码作为一个单元向上或向下移动。
  • 在XML Notepad中显示的步进布局使得容易识别嵌套的元素。
  • 因为XML Notedpad被链接到XML架构,所以能够实时进行有效性检查并报告所找到的错误。
XML Notepad的缺点
除了不能将文件放入编辑器或者从编辑器中获得文件外,与CustomUI Editor相比,XML Notepad还有下面的缺点:

  • XML Notepad和CustomUI Editor的错误检查功能查找不同的情形。虽然能够从下拉列表中选择从而创建格式良好的XML,但是XML Notepad实际上不会验证代码。因此应该先后使用XML Notepad和CustomUI Editor,使得代码得到完美的验证。
  • CustomUI Editor能够生成回调标签,但XML Notepad没有这项功能。
  • CustomUI Editor能够使得创建自定义用户界面更容易。除了自动创建某些代码部分外,也提供了易于附加图片到文件中的接口。但XML Notepad缺乏这项功能。
  • 如果使用XML Notepad而不是使用CustomUI Editor创建customUI.xml文件来开始功能区修改,那么需要人工链接.rels文件。因此,建议使用CustomUI Editor创建初始的联接。仍然在XML Notepad中创建CustomUI代码的构造,然后将其复制到CustomUI Editor中,正如上面的示例所做的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 15:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 jiulongpo 于 2012-8-6 20:23 编辑

转自: http://www.excelperfect.com/index.php/2009/07/08/ribbonxstudy13/
细品RibbonX(13):初识XML


XML是扩展标记语言(Extensible Markup Language)的缩写,最初由W3C发布。XML不是真正的编程语言,因为它缺乏执行操作的某种机制,相反,XML是一组规则,其意图是简化跨平台的数据共享。
Office 2007文件以Microsoft的OpenXML格式发布,是包含几个XML文件的一个简单的压缩容器。使用XML格式的文件具有下列优点:
(1)XML文件能够明显地节省空间。
(2)通过XML结构化数据后,能够快速地被索引,因而能使其他程序通过索引搜索到特定的字符串或其他项目。
(3)对于开发者来说,能够链接某个应用程序里的XML架构来验证XML而确保代码像意料中的那样工作。例如前面介绍的CustomUI Editor和XML Notepad,如果没有这些架构,CustomUI Editor将不能验证代码,XML Notepad也不能提供智能感知功能。
当然,我们之所以关心XML,是因为XML是功能区的核心。要定制Office 2007用户界面,必须编写XML代码。虽然VBA在定制界面时也能起到关键的作用,但它不是必需的。而XML在定制中几乎总是必需的,但也有例外。例如弹出式菜单和一些出现在加载项选项卡中的VBA定制。
下面,我们来了解如何构成XML代码,以及如何编写XML。
标签(Tags
先看看下面的代码片断:
<group id=”rxgrpTest”>
<button idMso=”Bold”/>
<button idMso=”Italic”/>
<splitButton id=”rxsbtnTest”>
    <button idMso=”Underline”/>
</splitButton>
</group>
留意上面代码的结构,注意<、>和/号的使用,这些符号在XML中有特定的用途:指出了标签的开始和结束位置。例如,开始的<group>标签和结束的</group>标签之间的内容包含了在功能区中显示的组。
在组里面列出的splitButton标签使用与组相同的结构,以<splitButton>标签开始,接着包含了所有的项目直至由</splitButton>标签结束。本例中,仅仅下划线按钮出现在拆分按钮中。
现在,看看按钮本身的代码,注意到/号位于标签的结尾,这样就不需要单独的标签来关闭元素。
这里演示了用于开始和结束XML标签的两种方法。您需要理解和使用这两种方法来创建自定义UI的结构。如下所示:
开始和关闭标签分开:<element attribute(s)=”Value”></element>
开始和关闭标签未分开:<element attribute(s)=”Value”/>
通过上面的例子,应该了解到:
(1)在XML中,每个标签至少包含一个元素并且通常至少有一个属性。
(2)在处理代码时,涉及的每个项目都被称作对象(object)。例如,对象包括功能区中的组、按钮、复选框、甚至是菜单。许多对象都有子对象。当某控件有子控件时,该控件称作为父控件。注意,父对象通常(但不总是)有不同类型的子对象。选项卡有一个或多个组对象作为子对象,并且一个组可能有按钮、复选框和动态菜单子对象的组合。其中,dynamicMenu对象除了其他子对象类型外,还有dynamicMenu子对象。某些父对象甚至有完整的子对象群,称之为集合(collection)。
每个子对象同时也是它自已的子对象的父对象。每个子对象控件必须嵌套在其父对象的开始和结束标签中。并且,每个子对象仅可能有一个父对象。
(3)为了创建格式良好(有效的)XML,必须理解:①所有的标签,无论是元素还是属性,都区分大小写,即SPLITBUTTON元素与splitButton元素不相同。②属性值必须被放置在单引号或双引号内。③在父元素中的子元素的嵌套必须准确,每个开始标签必须与其结束标签相匹配,或者使用“/>”结束在相同的标签内,或者在后面使用单独的标签。
元素(Elements
当处理功能区的XML时,可以看到每个元素指定功能区控件(或结构)的特定部分。
对于初学者来说不容易弄清楚标签和元素的区别,然而很容易定义:group是一个元素,而<group>是一个标签。因此,标签实质上是通过<和>符号识别代码块的标志。
每个标签必须包括一个且唯一一个元素。此外,元素总是XML标签的第一部分,告诉编译器希望开始处理或者停止处理的特定项目。
属性(Attributes
标签告诉编译器要处理的对象,而属性告诉编译器该对象的特性,例如对象的名称、在屏幕中显示的标题以及是否对象可见。
与元素不同的是,在所给标签内可以为对象设置多个属性。例如,下面的代码片断显示了带有多个属性的标签示例:
<button id=”rxbtnProtectAll”
    size=”normal”
    label=”Protect All Sheets”
    imageMso=”ReviewProtectWorkbook”
onAction=”rxbtnProtectAll_click”/>
上面的代码提供给按钮一个唯一的id并指定了大小、标签文本和图像,还提供了一个onAction回调签名,当单击该按钮时启动相应的VBA过程。
1id属性
在创建额外的对象之前,需要探讨如何在代码中识别这些对象。而id属性用于识别在自定义XML代码内特定的对象,为其提供名称,使得后面能够使用该名称引用该对象。这是引用对象的唯一方法。在下列容器中每个对象都需要id属性:
n         contextualTabs
n         officeMenu
n         qat
n         tabs
id属性有几种不同的类型并且每一个都有不同的用途。下面列出了id属性的不同类型及其主要用途。
n         id属性用于唯一地标识控件。如果动态地装载项目,其属性将被赋值。
n         idMso属性用于唯一地标识内置控件、选项卡、命令,等等。使用该属性与内置对象交互。
n         idQ属性用于跨共享的命名空间引用对象。
为了识别某对象,只需简单地在开始标签中添加id属性,例如,要通过id引用某选项卡,使用下列XML:
<tab id=”rxtab”
    <!—放置其它的选项卡属性! –>
</tab>
同样地,如果试图引用内置的字体(Font)组,则使用下面的XML:
<group idMso=”Font”
    <!—放置其它的组属性! –>
</group>
注意,所有的id和idQ属性都是唯一的。如果使用已存在的id,或者由Microsoft保留的id,将会导致错误并阻止装载自定义用户界面。
为了避免与内置的控件相冲突,建议所有自定义控件使用标准的命名约定加上前缀。
2label属性
label属性指定用户能够在屏幕上读取的内容,它不必是唯一的,但应该合乎逻辑、简洁明了且一致。label属性为用户提供了清晰的向导。要为控件添加标签文本,使用下面所示的代码:
<tab id=”rxtab”
    label=”My Custom Tab”>
</tab>
XML代码的排版技巧
在编写代码时,建议使用硬回车或制表符将代码分成逻辑块,使代码更容易阅读和理解。看看下面的示例代码,非常清晰,更容易阅读:
<group
    id=”rxgrp”
    label=”My First Group”>

    <button
        id=”rxbtn1″
        imageMso=”Italic”
        label=”Large size button”
        size=”large”
        onAction=”rxbtn1_Click”/>

    <button
        id=”rxbtn2″
        imageMso=”Bold”
        label=”Normal size button”
        size=”normal”
        onAction=”rxbtn2_Click”/>

    <button
        id=”rxbtn3″
        imageMso=”WrapText”
        label=”Normal size button”
        size=”normal”
        onAction=”rxbtn3_Click”/>

    <button
        id=”rxbtn4″
        imageMso=”ConditionalFormatting”
        label=”Normal size button”
        size=”normal”
        onAction=”rxbtn4_Click”/>
</group>
XML代码中创建注释
注释能够使自已或他人清楚代码的作用。
放置注释的方法是:在开始处放置一个小于号(<),然后输入感叹号(!),随后是两个连字号(–),结束注释需要两个连字号加一个大于号(>),例如:
<!—这是一段注释 –>
如果注释很长,可能需要几行,那么可以按如下所示编写:
<!–
这是一段相当长的注释。因为您想使用长的注释解释这段代码有什么作用,各个符号代码什么意思,以帮助您以后好理解。
–>
在<!–和–>之间的内容被当作连续的注释。
此外,不能够将注释放置在一块开始的XML代码的中间。下面的示例来进行演示:
<!—这是我的按钮 –>
<button id=”rxbtn”
    label=”This is my button”
    imageMso=”HappyFace”
    size=”large”
    onAction=”rxbtn_Click”/>
或:
<button id=”rxbtn”
    label=”This is my button”
    imageMso=”HappyFace”
    size=”large”
onAction=”rxbtn_Click”>
<!—这是我的按钮 –>
</button>
上述两段代码都是正确的,但下面的代码会产生错误:
<button id=”rxbtn”
<!—这是我的按钮 –>
    label=”This is my button”
    imageMso=”HappyFace”
    size=”large”
    onAction=”rxbtn_Click”/>
上面的问题在于注释被插入到了未关闭的代码块中。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 15:24 | 显示全部楼层
本帖最后由 jiulongpo 于 2012-8-6 20:24 编辑

转自: http://www.excelperfect.com/index.php/2009/07/10/ribbonxstudy14/
细品RibbonX(14):核心的OpenXML架构元素

在编写自定义Office 2007界面的XML时,总是以customUI元素开始,紧接着是Ribbon元素。下面我们将详细介绍customUI元素、Ribbon元素,以及tabs、tab和group元素,在自定义界面时几乎总是要使用这些元素。
customUI元素
要创建格式良好的XML文档,必须包含一个且唯一一个“最外层的元素”,嵌套所有其他的元素。这个最外层的元素被称作“根元素”。对于功能区定制来说,该元素就是customUI元素。这意味着customUI标签里嵌套着所要使用的所有其它标签。
现在,打开CustomUI Editor,输入下面的代码:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
    <!– All other instructions go here –>
</customUI>
然后,单击“validate”按钮验证代码。注意,验证代码是一个好习惯。
1customUI元素必需的属性
每个customUI标签必须指定xmlns属性,如下表1所示。
表1:customUI元素必需的属性
静态属性

允许值

xmlns

http://schemas.microsoft.com/office/2006/01/customui

2、带有回调签名的可选的静态属性和动态属性
也可以在customUI标签中添加下表2列出的部分或全部属性。当然,这些属性不一定非得在XML中使用,随您的需要而定。
表2:customUI元素的可选属性
静态属性

动态属性

允许值

默认值

动态属性的VBA回调签名

xmlns:Q

(none)

1至1024个字符

(none)

(none)

(none)

onLoad

1至1024个字符

(none)

Sub onLoad(Ribbon as IRibbonUI)

(none)

loadImage

1至1024个字符

(none)

Sub loadImage(imageID as string,ByRef returnedVal)

例如,添加onLoad属性的代码如下:
<customUI
    xmlns=“http://schemas.microsoft.com/office/2006/01/customui“
    onLoad=“rxiRibbonUI_onLoad“>
    <!– All other instructions go here –>
</customUI>
注意,onLoad属性只是被嵌套在与customUI元素相同的<>括号内,对其他可选属性也是如此。并且,可以每行列出一个属性,无须包括连续或行中断的代码。
3customUI元素的子对象
customUI标签是一个容器,包含其他对象。实际上,customUI仅能包含下列元素:
n         commands
n         ribbon
ribbon元素
要修改功能区,则要在customUI标签内嵌套ribbon元素,如下所示:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
    <ribbon>
        <!– All other instructions go here –>
    </ribbon>
</customUI>
1ribbon元素必需的属性
ribbon元素没有任何必需的属性。
2、可选的静态属性
ribbon元素有一个非常特别的属性,如下表3所示。
表3:ribbon元素的可选属性
静态属性

动态属性

允许值

默认值

动态属性的VBA回调签名

startFromScratch

(none)

true,false,1,0

false

(none)

startFromScratch属性能够隐藏整个内置的功能区。因为该属性的默认值为false,所以前面的示例代码中都忽略了该属性。下面的XML能够得到相同的结果:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
    <ribbon startFromScratch=“false“>
        <!– All other instructions go here –>
    </ribbon>
</customUI>
3ribbon元素的子对象
ribbon对象可以包含下列元素:
n         contextualTabs
n         officeMenu
n         qat
n         tabs
tabs元素
这是除customUI和ribbon之外的另一个容器,必须嵌套在功能区(Ribbon)块中。示例代码如下:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
    <ribbon>
        <tabs>
            <!– All other instructions go here –>
        </tabs>
    </ribbon>
</customUI>
tabs标签的目的是集中要引用、创建或修改的每个元素和单个选项卡。
1tabs元素必需的属性
tabs元素是要使用的最容易的元素之一,没有单个的属性。
2tabs元素的子对象
tabs元素是一个容器元素,用于包含特定引用的(或创建的)选项卡控件。
tab元素
tab元素包含在tabs容器中,用于创建或引用功能区中单个的选项卡。理解tabs对象和tab对象之间的不同是非常重要的。tabs(复数形式)引用整个选项卡集合,而tab(单数形式)指定特定的选项卡。
1tab元素必需的属性
tab对象是层级中的第一个元素,需要id属性。必须从下表4中选择且只能选择其中一个:
表4:tab元素的id属性
属性

何时使用

id

当创建自已的选项卡时

idMso

当使用现有的Microsoft选项卡时

idQ

当创建在命名空间之间共享的选项卡时

为什么需要id属性的原因很简单:如果选项卡没有id属性,那么如何引用该选项卡呢?
2、带有回调签名的可选的静态属性和动态属性
tab元素提供了几个可选的静态属性。如果要设置某选项卡相对于任何其它现有的选项卡的位置,则使用下表5列出的insert属性之一。
表5:tab控件可选的insert属性
insert属性

允许值

默认值

何时使用

insertAfterMso

有效的Mso选项卡

在最近的选项卡之后插入

在Microsoft选项卡之后插入

insertBeforeMso

有效的Mso选项卡

在最近的选项卡之后插入

在Microsoft选项卡之前插入

insertAfterQ

有效的选项卡idQ

在最近的选项卡之后插入

在共享的命名空间选项卡之后插入

insertBeforeQ

有效的选项卡idQ

在最近的选项卡之后插入

在共享的命名空间选项卡之前插入

注意,如果没有指定insert属性,那么选项卡将被添加到最后一个选项卡之后,而不管是自定义选项卡还是内置选项卡。
tab控件也接受下表6列出的任一或全部属性:
表6:tab控件的可选属性和回调
静态属性

动态属性

允许值

默认值

动态属性的VBA回调签名

keytip

getKeytip

1至3个字符

(none)

Sub GetKeytip(control As IRibbonControl,ByRef returnedVal)

label

getLabel

1至1024个字符

(none)

Sub GetLabel(control As IRibbonControl,
ByRef returnedVal)

tag

(none)

1至1024个字符

(none)

n/a

visible

getVisible

true,false,1,0

true

Sub GetVisible(control As IRibbonControl,                                              ByRef returnedVal)

注意,动态回调用于在文件使用时动态修改功能区,使用了VBA代码来运行。
3tab元素的子对象
tab对象仅仅可以包含组元素,例如内置的剪贴板组或者自已创建的自定义组。


TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 15:28 | 显示全部楼层
本帖最后由 jiulongpo 于 2012-8-7 15:59 编辑

接 细品RibbonX(14):核心的OpenXML架构元素


4、内置的选项卡
当在功能区中处理选项卡时,有两种类型的选项卡:内置的和自定义的。内置选项卡由Microsoft提供,而自定义选项卡由自已创建。
1)引用内置选项卡
每个内置选项卡都有自已唯一的idMso属性,通过调用该属性引用这个选项卡,因此应该弄清楚idMso属性。
下表7列出了Excel、Access和Word的一些最通用的选项卡名称,注意大小写。
表7:最常用的内置选项卡名称
选项卡名称
idMsoExcel
idMsoWord
idMsoAccess
开始
TabHome
TabHome
TabHomeAccess
插入
TabInsert
TabInsert
(none)
页面布局
TabPageLayoutExcel
TabPageLayoutWord
(none)
公式
TabFormulas
(none)
(none)
数据
TabData
(none)
(none)
视图
TabReview
TabReviewWord
(none)
创建
(none)
(none)
TabCreate
外部数据
(none)
(none)
TabExternalData
数据库工具
(none)
(none)
TabDatabaseTools

2)修改内置选项卡
步骤1 打开Excel 2007创建一个新的工作簿。由于不需要任何动态回调,因此将该文件保存为Excel的默认工作簿格式(xlsx)。
步骤2 关闭Excel,然后在CustomUI Editor中打开该工作簿。
步骤3 输入下面的XML代码:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
    <ribbon startFromScratch=“false“>
        <tabs>
            <tab idMso=“TabHome“ visible=“false“>
            </tab>
        </tabs>
    </ribbon>
</customUI>
步骤4 验证代码并保存,关闭CustomUI Editor。
步骤5 在Excel中打开该工作簿文件,此时“开始”选项卡没有了。
此时,关闭该工作簿文件,将使“开始”选项卡重新出现。
5、自定义选项卡
1)创建自定义选项卡
创建自定义选项卡时,不需要引用idMso,而是为新选项卡指定一个唯一的id属性。
继续上面的练习,在Excel中关闭工作簿文件,在customUI Editor中重新打开该文件,输入下面的代码:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
    <ribbon startFromScratch=“false“>
        <tabs>
            <tab id=“rxtabDemo“ label=“Demo“>
            </tab>
        </tabs>
    </ribbon>
</customUI>
验证代码并关闭该文件,然后在Excel中重新打开该工作簿,此时在功能区中将增加一个新的自定义选项卡,如下图1所示。
图1:功能区中新增加的自定义选项卡
    <ribbon startFromScratch=“false“>
        <tabs>
            <tab id=“rxtabDemo“
               label=“Demo“
               insertAfterMso=“TabHome“>
            </tab>
        </tabs>
    </ribbon>
</customUI>
即为insert属性指定有效的idMso,将自定义选项卡放置在想要的位置。此时,工作簿如下图2所示。
图2:自定义选项卡放置在“开始”和“插入”选项卡之间
注意,当插入多个控件时,将按照它们在XML代码中的顺序插入。
group元素
group元素的作用是为实际的按钮、复选框、菜单和其他允许在功能区中配置的命令创建占位符。
1group元素必需的属性
与tab元素一样,每个组需要一个唯一的id属性,如下表8所示。
表8:group元素的id属性
属性
何时使用
id
当创建自已的组时
idMso
当使用现有的Microsoft组时
idQ
当创建在命名空间之间共享的组时
2、带有回调签名的可选的静态属性和动态属性
要设置某个组相对于任何其他现有的组的位置,需要指定下表9列出的insert属性之一。
表9:group控件可选的insert属性
insert属性
允许值
默认值
何时使用
insertAfterMso
有效的Mso组
最近的组之后插入
Microsoft组之后插入
insertBeforeMso
有效的Mso组
最近的组之后插入
Microsoft组之前插入
insertAfterQ
有效的组idQ
最近的组之后插入
共享的命名空间组之后插入
insertBeforeQ
有效的组idQ
最近的组之后插入
共享的命名空间组之前插入
group控件也接受下表10列出的任何或全部属性。
表10:group控件可选的属性和回调
静态属性
动态属性
允许值
默认值
动态属性的VBA回调签名
image
getImage
1至1024个字符
(none)
Sub GetImage(control As IRibbonControl,                                             ByRef returnedVal)
imageMso
getImage
1至1024个字符
(none)
同上
keytip
getKeytip
1至3个字符
(none)
Sub GetKeytip(control As IRibbonControl,                                             ByRef returnedVal)
label
getLabel
1至1024个字符
(none)
Sub GetLabel(control As IRibbonControl,                                              ByRef returnedVal)
screentip
getScreentip
1至1024个字符
(none)
Sub GetScreentip(control As IRibbonControl,                                           ByRef returnedVal)
supertip
getSupertip
1至1024个字符
(none)
Sub GetSupertip(control As IRibbonControl,                                           ByRef returnedVal)
tag
(none)
1至1024个字符
(none)
(none)
visible
getVisible
true,false,1,0
true
Sub GetVisible(control As IRibbonControl,                                           ByRef returnedVal)
3group元素的子对象
group元素能够包含下列对象的任意组合:
n         box
n         button
n         buttonGroup
n         checkBox
n         comboBox
n         control
n         dialogBoxLauncher
n         dropdown
n         editBox
n         gallery
n         labelControl
n         menu
n         separator
n         splitButton
n         toggleButton
下面是在自定义选项卡中创建一个自定义组的XML代码:
    <ribbon startFromScratch=“false“>
        <tabs>
            <tab id=“rxtabDemo“
               label=“Sample“
               insertBeforeMso=“TabHome“>
                <group id=“rxgrpDemo“
                       label=“Demo Group“
                       imageMso=“HappyFace“
                       keytip=“D“
                       screentip=“This is my screentip“
                       supertip=“This is my supertip“>
                </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>
结果如下图3所示:
[url=http://www.excelperfect.com/wordpress/wp-content/uploads/2009/07/ribbonx14-3.png]
图3:自定义选项卡中的自定义组
注意,在上面的XML中设置的属性,仅label属性的值出现在功能区中。大多数可选的属性例如imageMso,在组控件中将没有可见的效果。因此,经调试后,可以忽略一些可选的属性。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 15:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 jiulongpo 于 2012-8-7 19:38 编辑

接 细品RibbonX(14):核心的OpenXML架构元素



4、内置组
使用内置组,仍然能够提供内置功能。此外,能够将经常使用的控件组合在一起。
1)引用内置组
与选项卡相似,通过引用其id属性识别自定义组,通过引用其idMso属性识别内置组。下表11列出了Excel、Access和Word中的一些内置组。
表11:在Excel、Access和Word中通用的组
显示的名称
idMso名称
剪贴板
GroupClipboard
字体
GroupFont
形状
GroupShapes
例如,隐藏Excel中剪贴板组的XML如下:
  1. <customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
  2.     <ribbon startFromScratch=“false“>
  3.         <tabs>
  4.             <tab idMso=“TabHome“>
  5.                 <group idMso=“GroupClipboard“
  6.                        visible=“false“>
  7.                 </group>
  8.             </tab>
  9.         </tabs>
  10.     </ribbon>
  11. </customUI>
复制代码

结果如下图4所示:
图4:隐藏了“剪贴板”组的“开始”选项卡
2)在自定义选项卡中使用内置组
能够在自已的选项卡中使用内置组,这是Office 2007的一项关键功能。
Microsoft虽然花费了大量的人力和财力研究用户的使用习惯,但默认的控件顺序不会总是满足特定的需求。因此,利用重复使用Microsoft内置组的能力,可以容易地在单个选项卡中放置最常用的命令,这样更方便于使用且随时可见,避免在功能区选项卡之间来回切换。
在许多场合,创建一个自定义且经过整理的选项卡能够节省无数次的键击并极大地提高生产力。例如,假设要花时间审阅Excel工作簿的一致性,在默认的功能区中,需要经常在功能区选项卡之间来回切换以利用所需要的控件,下表12列出了在Excel中需要使用到的组。
表12:在Excel中常用的审核工具的位置
组名
默认的选项卡
名称
剪贴板
开始
GroupClipboard
字体
开始
GroupFont
公式审核
公式
GroupFormulaAuditing
批注
审阅
GroupComments
编辑
开始
GroupEditingExcel
现在,创建一个包含上述组的自定义选项卡,其XML代码如下:
  1. <customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
  2.     <ribbon startFromScratch=“false“>
  3.         <tabs>
  4.             <tab id=“rxtabMyTools“
  5.                  label=“My Tools“
  6.                  insertBeforeMso=“TabHome“>
  7.                  <group idMso=“GroupClipboard“/>
  8.                  <group idMso=“GroupFont“/>
  9.                  <group idMso=“GroupFormulaAuditing“/>
  10.                  <group idMso=“GroupComments“/>
  11.                  <group idMso=“GroupEditingExcel“/>
  12.             </tab>
  13.         </tabs>
  14.     </ribbon>
  15. </customUI>
复制代码

注意,在上面的代码中,group元素没有使用单独的结束标签,而是在行尾使用/>结束。这样的编写非常简洁。此时,结果如下图5所示。
图5:填充内置组的自定义选项卡
注意,在自定义组中引用的内置组只是原来组的副本,内置组仍然在原来的位置。
5、自定义组
1)创建自定义组
与tab元素一样,通过指定一个唯一的id属性来创建自定义组,而不是引用内置组的idMso。
继续上面的示例,关闭Excel文件,在CustomUI Editor中重新打开该文件,在最后一个group标签之后,添加下面的XML代码:
注意,上述代码并没有在同一行中开始和结束组代码。这样,方便在其中添加其他控件,例如按钮、复选框或动态菜单。
  1. <group id=“rxgrpMyGroup“
  2.         label=“My Group“>
  3. </group>
复制代码
验证代码后保存文件并关闭CustomUI Editor。再打开Excel,此时,在自定义选项卡中添加了一个空组,如下图6所示。
图6:自定义选项卡中的自定义组
2)放置自定义组
有时,可能想让自定义的组放置在指定的位置或按指定的顺序排列,可以采取两种方法来实现。
方法1:在XML代码中,按想要显示的顺序编写代码。
方法2:使用insertBeforeMso属性或insertAfterMso属性,在某个组之前或之后放置自定义的组。例如,上例中使用下面的代码将自定义组放置在“字体”组之前:
  1. <group id=“rxgrpMyGroup“
  2.         label=“My Group“
  3.        insertBeforeMso=“GroupFont“>
  4. </group>
复制代码

结果如下图7所示。
图7:将自定义选项卡放置在“剪贴板”组和“字体”组之间
3)在内置选项卡中的自定义组
在内置选项卡中插入自定义组也是很容易的,下面仍以Excel 2007为例来演示。
步骤1 创建一个新的Excel文档并保存,然后关闭该文档。
步骤2 在CustomUI Editor中打开该文档,并输入下面的代码:
  1. <customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
  2.     <ribbon startFromScratch=“false“>
  3.         <tabs>
  4.             <tab idMso=“TabHome“>
  5.                 <group id=“rxgrpMyGroup“
  6.                       label=“My Group“
  7.                       insertBeforeMso=“GroupFont“>
  8.                 </group>
  9.             </tab>
  10.         </tabs>
  11.     </ribbon>
  12. </customUI>
复制代码

步骤3 验证代码并保存代码,然后关闭CustomUI Editor。
步骤4 在Excel中重新打开该文件,现在看到在“开始”选项卡中有一个自定义组,如下图8所示。
图8:在“开始”选项卡中的自定义组
此时,在内置的“开始”选项卡中添加了自定义组“My Group”,并且将该组放置在第二位,即“字体”组之前。然后,您就可以在自定义组中添加想要的控件了!

TA的精华主题

TA的得分主题

发表于 2012-7-27 15:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
整理成一本书再传上来就更好啦{:soso_e100:}

点评

你让我传完了再回嘛,没看一楼提示呀.  发表于 2012-7-27 15:38

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 15:44 | 显示全部楼层
本帖最后由 jiulongpo 于 2012-8-6 20:26 编辑

转自: http://www.excelperfect.com/index.php/2009/07/18/ribbonxstudy15/
细品RibbonX(15):回调(CallBacks)

回调,即使自定义界面能够工作的代码。如果没有回调,那么自定义界面可能看起来漂亮,但只是一个漂亮的功能区。当然,除内置控件不需要自定义回调外。
下面的内容介绍如何使用回调来提供自定义控件所需的功能。在编写XML代码时,需要指定回调,然后在Excel中编写VBA代码来匹配和处理回调。
回调概要
回调是自定义的用户界面使用的子过程和函数,使自定义的用户界面能够工作。回调简单地表现为所提供的指令的动向。例如,当设置某按钮的onAction属性并装载用户界面时,一旦单击该按钮,就产生回调,即在属性中指定的操作。
如果没有找到指定的操作,那么回调将失败,因为代码中发生了例外,即在属性中指定的回调在VBA中不存在,因此失败了。
自定义用户界面一装载就会调用VBA工程,搜寻指定的函数或过程。如果找到,则将其值传回到用户界面。如果没有找到指定的函数或过程,那么将产生错误的结果。
有两种主要的方式来创建回调:
n         直接在VBE的标准模块中输入过程或函数
n         使用工具生成过程,例如Office 2007 CustomUI Editor
使用诸如Office 2007 CustomUI Editor这类工具的主要优势是能够扫视XML代码并返回回调签名,也称作subprocedure stub,XML代码中每个属性都有一个需要处理的回调。接受回调作为值的属性包括onAction、getVisible和getImage。
除了节省时间外,使用CustomUI Editor还能避免由于手工编写回调签名而导致的拼写错误。上述每个属性都会产生一个不同的回调签名,必须按顺序使用代码处理,使用户界面有合适的功能。
此外,当工程装载时需要访问某些回调并运行,这意味着如果回调处理(即响应回调的VBA代码)在该工程中不存在,将产生错误消息。当然,下面的内容也会介绍如何缓解这类错误,甚至如何避免错误。
为动态回调建立文件
为了使自定义控件工作,文件必须启用宏,否则不能够添加或运行VBA代码。
1、捕获IRibbonUI对象
IRibbonUI对象引用功能区用户界面,用于控制事物如何响应。
在VBA中使用的关键之一是使整个Ribbon对象无效(因而能够改变功能区的某项特征)或者使功能区中指定的控件无效(因而能够改变该控件的某项特征)。
(1)调整XML以包括onLoad
为了使用IRibbonUI对象,需要在VBA中对其设置。首先,需要对UI的onLoad属性指定值,这能通过为onLoad属性指定回调来实现:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“ onLoad=“rxIRibbonUI_onLoad“>
因为onLoad属性的值是一个回调,所以需要在VBA代码中对其进行处理。接着,能够在工程中使用IRibbonUI对象。
(2)创建VBA代码处理onLoad事件
可能会注意到,前面将onLoad称作为属性,但现在将其称为事件。这是因为在XML文件中,能为许多属性定义值,例如onAction、getLabel和onLoad。一旦为某属性赋值,如果能以某种方式触发,将导致事件发生。这就是属性和事件的区别。
因为IRibbonUI对象用于整个应用程序,所以需要在标准模块的全局声明部分对其声明,如下面的代码所示。
‘全局的ribbon对象
Dim grxIRibbonUI As IRibbonUI
这里使用标准的格式grxIRibbonUI引用IRibbonUI对象,接着添加回调来设置该对象:
Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
    Set grxIRibbonUI = ribbon
End Sub
设置为全局对象之后,该对象可用于整个工程。然而,Ribbon对象对于修改是非常敏感的。这意味着任何时候修改代码,该对象实例将丢失并且任何需要Ribbon对象的操作都将失败。因此,无论何时作出修改,都需要保存、关闭并重新打开工程。
生成第一个回调
知道需要获得回调签名后,还需要知道如何使用回调签名。例如,对于切换按钮(toggleButton)有下列签名:
Sub rxtgl_click(control as IRibbonControl,pressed as boolean)
一个普通按钮的签名如下:
Sub rxbtn_click(control as IRibbonControl)
1、从头开始编写回调
如果知道了回调签名,则不必使用标准的形式声明参数。例如,有一个使用下列XML的切换按钮:
<toggleButton
id=”rxtgl”
label=”Toggle”
size=”large”
onAction=”rxtgl_click”
imageMso=”FormatPainter”/>
编写rxtgl_click回调如下:
Sub rxtgl_click(rxctl As IRibbonControl,toggled As Boolean)
If toggled Then
    MsgBox “我已切换 …我的ID是 “ & rxctl.ID,vbInformation
End If
End Sub
注意到回调的参数名与上面介绍的标准的参数名不一样,但是单击切换按钮时仍触发该回调,像平常一样传递参数,因此签名中的修改不会导致过程失败,只要使用了正确类型的正确参数。
也能修改onLoad回调签名来满足需要,如下所示:
Sub rxIRibbonUI_onLoad(MyRibbon As IRibbonUI)
Set grxIRibbonUI=MyRibbon
End Sub
然而,如果使用标准的签名及其参数名称,那么其他人将更容易理解代码。下面列出了一些回调签名。
属性onLoad,回调签名(ribbon as IRibbonUI);
属性getLabel,getPressed,getEnabled,getImage,getScreentip,getVisible,等,回调签名(control as IRibbonControl,ByRef returnedVal);
属性onAction(切换按钮),回调签名(control as IRibbonControl,pressed as Boolean);
属性onAction(按钮),回调签名(control as IRibbonControl)。
2、使用Office CustomUI Editor生成回调
一种很容易生成回调的方法是使用CustomUI Editor。这个工具将所有的返回回调的属性搜寻在一起,然后生成需要的回调。因此,无须追踪XML中所有的回调。对于大段的XML代码来说,这是无价的。
在CustomUI Editor中(以Excel为例),可以使用下列步骤自动生成必需的回调:
步骤1 使用CustomUI Editor打开包含XML代码的Excel。
步骤2 单击“Generate Callbacks”按钮。
步骤3 出现一个新的Callbacks选项卡。复制产生的代码并粘贴到VBA工程中。
注意,确保验证代码。
3、理解文件打开时事件的顺序
在工程中添加了回调后,该文档打开时将调用某些过程,具体调用的过程取决于工程打开时定制是否获得了焦点。注意,某些过程仅当包含定制的选项卡获取焦点时才调用,而其它过程当鼠标移动到控件之上时调用。
理解过程调用的顺序是复杂的,因为调用顺序受许多可变因素影响。为了帮助预测典型的事件顺序,下表列出了功能区选项卡的事件及相应的顺序。
表:当打开工程后选项卡获取焦点时的事件顺序
事件

选项卡获取焦点

选项卡有焦点

按下ALT

鼠标在其上方

onLoad

最顶级的事件,当装载UI时发生

getVisible

1

1

N/A

N/A

getLabel

2

3

N/A

N/A

getImage

3

4

N/A

N/A

getEnabled

4

2

N/A

N/A

getKeytip

N/A

N/A

1

N/A

getScreentip

N/A

N/A

N/A

1

getSupertip

N/A

N/A

N/A

2

上表仅列出了可以使用的通用属性的一些示例,然而顺序可能受其它引入的属性的影响,例如getDescription、getTitle,等等。虽然如此,打算在性能方面以最好的方式解决用户界面问题时,上表仍然可以作为一个通用的向导。
4、能够有具有相同名称但不同签名的两个回调吗?
VBA不允许在相同工程中使用相同名称不同签名的两个回调。然而,如果回调在不同的工程中,则相同的回调名称能够有不同的签名。因此,如果同时打开一个以上的Excel文档,那么可能发现回调返回不可预料的结果。因为如果多个操作(签名)与一个回调名称相联系,那么将运行当前文档的回调。
假设打开一个安装了两个加载项的Excel工作簿,三个项目都有一个带有称为rxbtnnsQaShared的控件的用户界面。当单击用户界面中该控件时,所期望的是添加一个新工作簿,然而将出现一个消息框。检查后,发现为所有三个按钮都使用了相同的回调。此时,可以使用断点调试,看看单击操作调用了哪个回调。
上述表明,只要在不同工程中,虽然允许使用带有不同签名相同名称的回调,但这不是一个好主意。
调用位于不同工作簿中的过程
与上面所讲的情况相似,如果XML代码运行位于不同工作簿中的VBA,也会碰到类似的问题。
假设有两个工作簿:Book.xlsm和Book2.xlsm,希望在第一个工作簿中添加一个按钮,运行第二个工作簿中的过程。使用下面的XML代码创建用户界面:
  1. <customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>

  2.     <ribbon>

  3.         <tabs>

  4.             <tab id=“rxtabDemo“
  5.                   label=“My Custom Tab“
  6.                   insertBeforeMso=“TabHome“>

  7.                   <group id=“rxgrpDemo“
  8.                          label=“My Demo Group“>

  9.                          <button id=“rxbtnDemo“
  10.                                  label=“My Demo Button“
  11.                                  size=“large“
  12.                                  onAction=“Book2.xlsm!rxbtnDemo_click“
  13.                                  imageMso=“FileStartWorkflow“/>

  14.                   </group>

  15.             </tab>

  16.         </tabs>

  17.     </ribbon>

  18. </customUI>

复制代码

在Book2.xlsm的标准模块中,放置下列代码:
Sub rxbtnDemo_click(control As IRibbonControl)
    MsgBox “您调用了位于:” & ThisWorkbook.Name & “中的过程.”
End Sub
注意,必须要打开工作簿才能运行。如果希望onAction属性指向已装载的加载项而不是工作簿,那么简单地使用[add-in name].xlam在onAction代码名称前加上前缀,例如:
onAction=”myAddIn.xlam!rxbtnDemo_click”
然后,在加载项的标准模块中放置回调VBA代码:
Book3.xlam!rxbtnDemo_click
此时,必须加上前缀xlam!。注意,如果在用户界面的onAction属性下指定的过程中xlsm和xlam有相同的名称,那么该事件会运行包含在活动工作簿中的代码。你可能已注意到,在前面的介绍的内容中我们必须移除xlsm!,但使用加载项时必须有xlam!。
组织回调
随着功能区自定义代码技术的不断熟练,你将会采取不同的方式来组织回调,可以有单个的回调处理,或者有全局的回调处理,一次处理多个控件。
1、单个的回调处理
编写XML代码时,可以指定返回回调的多种属性,例如onAction、getLabel、getVisible、getEnabled,等等。这些属性的每一个都必须处理。下面以Excel为例,通过生成组中的3个按钮来演示这个过程。
  1. <customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>

  2.     <ribbon>

  3.        <tabs>

  4.             <tab id=“rxtabDemo“
  5.                  label=“My Custom Tab“
  6.                  insertBeforeMso=“TabHome“>

  7.                  <group id=“rxgrpDemo“
  8.                         label=“My Demo Group“>

  9.                      <button id=“rxbtnPaste“
  10.                              label=“My Paste Button“
  11.                              size=“normal“
  12.                              onAction=“rxbtnPaste_click“
  13.                              imageMso=“Paste“
  14.                              tag=“Custom Paste Button“/>

  15.                      <button id=“rxbtnCopy“
  16.                              label=“My Copy Button“
  17.                              size=“normal“
  18.                              onAction=“rxbtnCopy_click“
  19.                              imageMso=“Copy“
  20.                              tag=“Custom Copy Button“/>

  21.                      <button id=“rxbtnCut“
  22.                              label=“My Cut Button“
  23.                              size=“normal“
  24.                              onAction=“rxbtnCut_click“
  25.                              imageMso=“Cut“
  26.                              tag=“Custom Cut Button“/>

  27.                  </group>

  28.             </tab>

  29.         </tabs>

  30.     </ribbon>

  31. </customUI>

复制代码
每个按钮都有其onAction属性,因此如果企图对按钮添加功能,则必须处理每个属性:
Sub rxbtnPaste_click(control As IRibbonControl)
    MsgBox “您单击了” & control.Tag, vbInformation
End Sub
Sub rxbtnCopy_click(control As IRibbonControl)
    MsgBox “您单击了” & control.Tag, vbInformation
End Sub
Sub rxbtnCut_click(control As IRibbonControl)
    MsgBox “您单击了” & control.Tag, vbInformation
End Sub
单独处理每个属性非常繁锁且难以维护,而一种可供选择的方法是一次处理多个属性。


您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-28 11:16 , Processed in 0.060169 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表