ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享]RibbonX和VBA

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2007-3-13 08:25 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:UI界面定制

本文整理自《Excel 2007 VBA Programmer’s Reference》一书的第14章:RibbonX,也是该书在网上公开的内容,详细讲述了使用VBA如何设置和操作Ribbon。该书的目录和示例章节请见下面的链接:http://www.oaltd.co.uk/Excel2007ProgRef/default.htm。由于对Excel2007的熟悉程度和英文水平有限,可能有很多错漏之处,敬请批评指正。

后记:断断续续的抽了一些空余时间,终于将本章内容全部译完了,也使自已对Ribbon开发有了更进一步的认识。但是,由于对Excel 2007认识有限,再加上时间和水平方面的原因,也来不及仔细研磨,匆匆将该章初译稿奉上,以供大家学习参考。对其中的不通顺之处和错漏的地方,请大家多包涵,也请大家批评指正。

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-13 08:28 | 显示全部楼层
RibbonX和VBA
分类:Excel 2007>>Ribbon
Office 2007最大的改变之一是Ribbon(功能区)。在Ribbon设计之初,Microsoft意识到必须有一种方式能够为开发者和(某范围的)最终用户来定制Ribbon。这导致了RibbonX,即Ribbon的可编程机制。下面的内容介绍了RibbonX,并解释了如何定制Ribbon。
概述
在以前版本的Office中,可以通过使用VBA操作组成CommandBars对象模型的对象来创建菜单和工具栏,这对一个有实际意义的应用程序来说,经常需要成百甚至上千行VBA代码来维护添加、移除、或重新整理菜单。有时,最好的方式是使用表驱动的方式来创建菜单,即通过填充在工作表中的表来定义菜单和工具栏,一个可重复使用的VBA过程来解释表以创建菜单和工具栏。即使在使用表驱动方式,仍然需要相当多的VBA代码以确保仅当工作表被激活时特定的菜单是可见的,并且在关闭工作簿时必须相当小心地移除定制的菜单。
当为Ribbon设计可编程模型时,Microsoft以目前最好的实践开始,识别了已存在的不利点并移除了它们,也对关键客户和其它有兴趣的团体进行了调查,听取了所有反映的问题并修改了RibbonX设计去解决所碰到的多数问题,结果是一个完全新的范例:
(1) 定制在设计时就被定义,而不是单独的编码。使用XML进行定义并在XML文件格式中存储作为一个自定义部分,而不是使用工作表中的表。
(2) 当打开工作簿时,Excel自动读取XML部分并应用定制到Ribbon中。
(3) 如果使用一个标准工作簿,它的Ribbon定制仅当该工作簿激活时被应用并可见。
(4) 如果使用一个加载项工作簿,它的Ribbon定制总被应用并可用。
(5) 无论何时关闭工作簿,它的Ribbon定制都会自动删除。
(6) 即使定制在设计时被定义,大多数控件的属性可以使用VBA在运行时修改(诸如可见、标签,等等)
(7) 一些控件可以是完全动态的——因此,它们的结构和属性可以使用VBA在运行时定义。
(8) 所有内置的控件都是可用的,能够被重载、执行和查询它们的图像、标题,等等。

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-13 08:29 | 显示全部楼层
准备工作
如果您想花些时间研究RibbonX,那么有一些关键的工具需要下载并需要知道一些网站:
(1) 正式的RibbonX站点是http://msdn.microsoft.com/office/tool/ribbon
(2) Office 2007自定义UI编辑器可从下面链接下载:
http://openxmldeveloper.org/articles/CustomUIeditor.aspx
(或http://fanjy.blog.excelhome.net/user1/fanjy/archives/2007/841.html)
(3) 在MSDN站点上有两个有价值的文件可以利用。第一个文件包含Excel所有内置的选项卡、组和控件的名称列表;第二个文件是一个Excel加载项,添加了一个所有可用的内置图像库,能够用于自定义的控件中。
(4) 如果您想了解RibbonX的实质,MSDN中的customui.xsd架构是可用的。这是正式的架构,用于使您的定制生效,确切地描述了哪个控件具有什么属性和内容。
(5) 为了告知您的RibbonX XML中的任何错误,应选中“Office按钮>>Excel选项>>高级>>显示加载项用户接口错误”前的复选框。

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-13 08:30 | 显示全部楼层
添加定制
添加RibbonX定制到工作簿中只需两个步骤:
1、创建XML文件来定义所需要的定制。
2、插入该XML文件到工作簿文件中(必须使用XML文件格式之一)。
第一步是本文剩下的部分所要讲述的主题。您可以通过手工或编程来添加XML部分,需要进行下面的操作:
1、添加XML文件到工作簿压缩结构中。通过协定,它有名称/customUI/customUI.xml,虽然可以使用任何其它的名称。最好将XML部分放在它自身的文件夹中,因为也需要在这里存储按钮图像。
2、编辑根文件rels以包括对新的XML部分的引用,诸如:
(1) <Relationship Type=”http://schemas.microsoft.com/office/2006/relationships/ui/extensibility” Target=”/customUI/customUI.xml” Id=”rID5” />
(2) 最重要的是relationship的Type属性,因为这是Excel判断是否relationship为一个RibbonX定制。注意,因为是XML,区分大小写,所以正确的大小写拼写是相当重要的。
这些变化很容易通过Office 2007自定义UI编辑器实用程序来实现,可从下面的链接下载:
http://openxmldeveloper.org/articles/CustomUIeditor.aspx
(或http://fanjy.blog.excelhome.net/user1/fanjy/archives/2007/841.html)

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-13 08:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
XML结构
Ribbon主要的关键之一是所有的控件都根据相关的功能分成组,因此,文本格式的控件在“开始”选项卡的“字体”组中,公式审核工具全部位于“公式”选项卡中的“公式审核”组中。从功能角度看,这是合乎逻辑的,但从过程角度看Ribbon则完全不合逻辑。例如,Excel用户通常会被要求去查看他人创建的工作簿,此时,面对着这样的问题:大多数人以他们自已的方式处理文件、跟踪公式、检查定义的名称、对单元格应用不同的格式、添加评论、有规律地在原始工作簿和副本之间切换。不巧的是,这些操作中的每一个都涉及到Ribbon中的不同的选项卡。
在先前版本的Excel中,可以通过创建自定义工具栏并在其中添加所需要的按钮使所有这些操作组合在一起。当完成工作簿审核后,您能关闭工具栏直到下次去查看其他人的文件。
在Office 2007中,自定义工具栏的概念已被停止使用,取而代之的是,定义一些RibbonX XML创建包含为审核所需要的所有内置组和/或控件的自定义选项卡,然后添加XML到另外的空白加载项工作簿中。现在,当您被要求去审核工作簿时,可以装载这个审核加载项,这时所有您需要的控件都在工作簿中方便的位置。当您完成工作后,可以卸载该加载项以移除自定义选项卡。这些都不需要VBA。
首先,创建一个新工作簿,在工作簿中单击“Office按钮>>准备>>属性”命令,添加“标题”和“备注”(显示在加载项对话框中),然后保存为Auditing.xlam(在“另存为”对话框中使用“Excel加载宏”文件类型)。
然后,打开Office 2007自定义UI编辑器,在该编辑器中打开Auditing.xlam文件,输入下面的XML代码,单击“保存”添加XML到文件中。注意,XML文件中的代码区分大小写,因此要正确的拼写大小写。
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <ribbon>
    <tabs>
        <tab id="rxAuditing" label="Auditing">
          <group id="rxAuditMisc" label="Miscellaneous">
            <control idMso="Copy" />
            <control idMso="PasteMenu" />
            <separator id="rxAuditMiscSeparator1" />
            <control idMso="NameManager" />
            <control idMso="ViewFreezePanesGallery" />
            <control idMso="WindowSwitchWindowsMenuExcel" />
           </group>
           <group idMso="GroupFormulaAuditing" />
           <group idMso="GroupFont" />
           <group idMso="GroupNumber" />
       </tab>
    </tabs>
  </ribbon>
</customUI>
返回到Excel中,打开加载项对话框(“Office按钮>>Excel选项>>加载项>>管理:Excel加载项>>转到…”),然后装载Auditing.xlam加载项。单击该对话框中的“确定”按钮后,可以在Ribbon中看到添加了一个名为Auditing选项卡,包含了在XML中定义的组和控件,如下图1所示。
 
图1
下面介绍XML定义的每一行以及与Ribbon改变的结果相联系的部分。
<customUI>元素是XML的根容器,名称集(namespace)将它识别作为RibbonX文档。
<ribbon>元素是一个联系到可见的Ribbon的所有变化的容器。<customUI>元素也可以包含一个<commands>元素,用来重复利用内置控件(见本文后面的介绍)。
<tabs>元系是一个联系到Ribbon中现有的或新的选项卡的所有变化的容器。<ribbon>元素也能包含<officeMenu>、<qat>和/或<contextualTabs>元素来控制Ribbon的相应部分。注意,不能有<miniToolbar>或<statusBar>元素,这些元素超出了RibbonX的范围。
<tab id=”rxAuditing” label=”Auditing”>元素是真正定制的开始,创建了自定义的选项卡。包含在定制中的每项都必须至少有一个ID,有三种类型的ID属性:id、idMso和idQ,分别指定自定义项、内置项、或与多个文件共享的项。在本例中,由于是创建一个自定义选项卡,因此使用id属性并给它一个唯一的名称。为所有的自定义项使用标准的前缀是一个好的做法,这容易使它们与内置的名称相区别。我习惯使用rx表示这是一个RibbonX项,当在VBA中引用它时,也有助于进一步与其它类型的控件相区别。
<group id=”rxAuditMisc” label=”Miscellaneous”>元素创建第一组并打开其中的内容的定义,显示在选项卡中的组与它们在RibbonX文件中定义的顺序相同,每列显示三行,然后再从新列开始显示。
<control idMso=”Copy” />元素添加内置的“复制”按钮到自定义组中。普通的control元素类型可以为所有内置控件使用而不管它们实际的类型,idMso ID类型提供了实际控件名称。就像先前所提到的,所有Excel的控件名都列于ExcelRibbonConrtols.xls文件中,可从MSDN下载。
<control idMso=”PasteMenu” />元素添加了标准的“粘贴”按钮和下拉菜单。
<separator id=”rxAuditMiscSeparator1” />元素在该组中添加一条垂直分隔线并开始第二列控件。注意,即使它为一个不进行任何操作的可视元素,仍须有一个独立的自定义ID。
紧接着在自定义组中添加了内置的名称管理器、冻结窗格和切换窗口控件三个元素。
</group>结束了第一组的定义。
<group idMso=”GroupFormulaAuditing” />元素在自定义选项卡中添加了整个内置的公式审核组,使用了idMso和正确的名称来标识它作为内置的组。
<group idMso=”GroupFont” />和<group idMso=”GroupNumber” />元素添加了内置的字体和数字格式组。
</tab>完成了自定义选项卡的定义,剩下的代码行结束了tabs、ribbon和customUI元素容器。
使用这种技术,您可以创建仅仅包含RibbonX定义的由多个部分组成的加载项,每个加载项创建由不同的内置控件组集中在一起的自定义选项卡,以适用于不同的高级任务。如果这样做的话,您可能想添加加载项对话框到快速访问工具栏中。
虽然添加整个内置组到选项卡中是容易的,但通过创建自定义组并在其中添加特定的控件通常可以得到好的结果。可以包括一些不同的容器控件,以提供分层控件或创建内置控件的自定义下拉菜单,并设置一些显示属性来控制它们的外观。例如,可以包括一个自定义的<box>元素并使用showLabel属性来显示标准的排序按钮,并在已经存在的复制菜单之上显示一组水平的光标:
<group id="rxAuditMisc" label="Miscellaneous">
            <box id="rxSortBox">
              <control idMso="SortAscendingExcel" showLabel="false" />
              <control idMso="SortDescendingExcel" showLabel="false" />
              <control idMso="SortDialog" showLabel="false" />
            </box>
            <control idMso="Copy" />
在组中包括<box>元素的结果如图2所示。
   图2

[分享]RibbonX和VBA

[分享]RibbonX和VBA

[分享]RibbonX和VBA

[分享]RibbonX和VBA

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-13 08:32 | 显示全部楼层
RibbonX和VBA
Excel 2007不但有创建包含内置控件的选项卡和组的能力,而且Microsoft也提供了添加许多类型的自定义控件到Ribbon中的能力,并且使用称作回调(callback)的机制将它们的行为和大多数属性与VBA过程和函数挂钩。回调意味着当对RibbonX定义的控件进行单击、变化等操作时,就会运行与控件相对应的过程,这与您已经使用多年的Application.OnKey、CommandBarButton.OnAction等原理相同,在RibbonX中的主要的不同在于传递到所调用的函数的一些参数,因此函数必须被正确地声明以便于调用。而且,这与用户窗体控件事件过程的代码也不同。
可以使用调用在运行时改变控件属性。不是在XML中为属性定义一个特定的值,而是提供Excel应该调用的过程名。例如,在前面自定义的组中,可以使用特定的getLabel调用代替label=”Miscellaneous”属性:
<group id=”rxAuditMisc” getLabel=”rxAuditMisc_getLabel”>
当选项卡第一次显示时,Excel将调用rxAuditMisc_getLabel VBA过程(在一个标准模块中),该过程提供了为Excel去使用的文本。如果您想在稍后的某个时候改变文本,不能只更新对象的属性,RibbonX没有对象模型。取而代之的是,有一个接口去告诉Excel先前所提供的信息不再有效,当Excel下步需要显示组或控件时,再调用过程来获取新值。大多数控件的大多数属性可以使用这种方法动态设置。所有可用的调用和它们的功能在本文后面详细描述,首先,看看所有可用的能够添加到Ribbon中的自定义控件类型,以及所有可以修改控件的外观和行为的属性。

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-13 08:39 | 显示全部楼层

控件类型
    

Office以前的版本中有一组相对有限的控件类型可以被添加到菜单或工具栏中,Office 2007允许您添加更多的按钮或弹出菜单,并且包括能够在Excel内置Ribbon中发现的几乎每个显示机制的控件类型。下面列出了所有可用的控件类型、简单的描述以及每类内置控件的示例图片。
   

基本控件
   

下表列出了所有的基本控件,这些控件可以添加到自定义组中或者可以包含在其它控件类型中。

容器控件

下表列出了所有的容器控件,您可以添加这些控件到自定义组中。通过嵌套容器控件在其它容器里,可以创建层次结构。


[此贴子已经被作者于2007-5-15 19:55:16编辑过]

[分享]RibbonX和VBA

[分享]RibbonX和VBA

[分享]RibbonX和VBA

[分享]RibbonX和VBA

[分享]RibbonX和VBA

[分享]RibbonX和VBA

[分享]RibbonX和VBA

[分享]RibbonX和VBA

[分享]RibbonX和VBA

[分享]RibbonX和VBA

[分享]RibbonX和VBA

[分享]RibbonX和VBA
HfkGr2O6.jpg
nswWNlZs.jpg
mbRtvu5U.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-13 09:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

控件属性

所有控件类型都有一些属性,您可以使用这些属性修改它们的外观。所有可用的属性按字母顺序列于下表中,包括它们允许的值和可以应用的控件。


[分享]RibbonX和VBA

[分享]RibbonX和VBA

[分享]RibbonX和VBA

[分享]RibbonX和VBA

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-13 09:10 | 显示全部楼层

控件回调
大多数RibbonX定制可以在设计时定义,并且因此可以直接包括在XML文件中。然而,如果一些属性需要在启动时设置或者可以在运行时改变,则可以使用等价的get属性来提供回调函数的名称。当Excel开启时,调用该函数且该函数提供属性的值。与过去使用的OnAction调用不同,Excel不会自动作于该回调到包含RibbonX定义的工作簿。如果多个工作簿包含带有相同回调名称的过程,则不会保证有哪一个会被调用。
例如,下面是XML文件中最初所包含的代码行,对组标签进行了硬编码:
<group id=”rxAuditMisc” label=”Miscellaneous”>
为了使用回调来代替,添加下面的VBA过程到Auditing.xlam工作簿中,以在运行时提供标签。VBA过程的参数必须与RibbonX希望提供的参数相匹配,大多数参数以引用方式传递到RibbonX控件且以ByRef参数为返回值:
Sub rxAuditMisc_getLabel(ByRef Control As IRibbonControl, _
 ByRef ReturnValue As Variant)
  ReturnValue = "Miscellaneous-" & Format(Date, "dddd")
End Sub
保存该加载项,卸载它,然后使用自定义UI编辑器来改变RibbonX XML以使用getLabel属性,所添加的调用过程为:
<group id="rxAuditMisc" getLabel="rxAuditMisc_getLabel">
如果重新装载该加载项并单击Auditing选项卡,第一组现在应该在名称中包括了星期几(如图3所示)。
  图3
(译注:本人在调试此段代码时,总是没有任何反应,最后检查才得知修改后的语句中getlabel的l小写了,实际上应该是大写的L,即getLabel,改正后,才调试通过。这说明,在使用XML时,一定要严格执行大小写)
传递到回调中的Control引用是一个相当简单的对象,仅有三个只读属性且没有方法:
(1) id —— 控件的id属性
(2) tag —— 如果定义在XML中,则是控件的tag属性
(3) context —— 没有在Excel中使用
如果为多个控件指定一个普通的回调名称,则id属性可以用于区分控件。例如,在使用多种语言的应用程序中,可以在所有控件的定义中包括getLabel=”rxGetLabel”并从语言查找表中读取合适的文本,以匹配控件的ID:
Sub rxGetLabel(ByRef Control As IRibbonControl, _
               ByRef ReturnValue As Variant)
  ReturnValue = Application.WorksheetFunction.VLookup(Control.ID, _
                shtLanguages.Range("rngLabels"), glLanguaeID, False)
End Sub
除了get等价于所有设计时属性外,下表列出的控件回调仅在运行时可用。


下表列出了所有可用的控件回调函数标记。如果您使用Office 2007自定义UI编辑器,可以为任何包含于XML文件中的回调生成正确的调用标记,并可以粘贴到VBA工程中。



[此贴子已经被作者于2007-3-13 9:11:07编辑过]

[分享]RibbonX和VBA

[分享]RibbonX和VBA

[分享]RibbonX和VBA

[分享]RibbonX和VBA
rnDAVeY0.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-13 09:11 | 显示全部楼层
管理控件图像
大多数控件可以有一个相联系的图像,通过imageMso、image、getImage、showImage、getShowImage、showItemImage、getShowItemImage、size和getSize属性可以控制图像的选择和显示样式。
当您想为自定义控件使用内置图标之一时使用imageMso属性,属性的值必须是内置控件名称,可从MSDN网站上下载Office2007IconsGallery.xlsm文件找到内置控件名。该文件添加一组库到Excel的开发工具选项卡中,总共显示所有2586个可用的图像。例如,可以使用XML显示一个带有笑脸的按钮:
<button id=”rxButtonSmiley” imageMso=”HappyFace” />
当您想为控件使用自定义的图像时使用image属性,那些图像通常包含在工作簿文件里。Ribbon绘图引擎被设计成最好处理全彩色(24位)图像,也有一个alpha通道控制每个像素的透明度,因此,为自定义图像使用的最好的图形格式是Portable Network Graphics(.png)格式,支持alpha通道并有相对小的文件大小。
Office 2007自定义UI编辑器可以用于添加自定义图像到工作簿文件中——只需单击“插入图标”按钮,然后选择要添加的文件,编辑器将在右手边的面板内显示图标并给它一个缺省的ID,可以通过右击图标来改变ID,然后用于控件的图标属性中:
<button id=”rxButtonCustom” image=”MyPNG” />
在文件中,编辑器存储所有的图像在单独的customUI\images文件夹中,并在customUI\_rels文件夹中创建一个customUI.xml.rels文件,在XML中使用与图像文件相关联的IDs:
<Relationships xmlns=”http://schemas.openxmlformats.org/package/2006/relationships”>
<Relationship Type=”http://schemas.openxmlformats.org/officeDocument/2006/relationships/image “Target=”images/myCustomImage.png” Id=”MyPNG” />
</Relationship>
如果在大量的工作簿中使用相同的自定义图像,将它们存放在网络工作驱动器中而不是在每个工作簿文件中复制它们可能更有效,并在运行时装载它们。可以使用customUI元素的loadImage回调来处理:
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui”
loadImage=”rxcustomUI_loadImage”>
……
        <button id=”rxButtonCustom” image=”Custom1.bmp”>
……
</customUI>
并且用一些VBA代码去装载图像并提供它们作为一个IPicture对象:
Sub rxcustomUI_loadImage(imageID as String, ByRef returnedVal)
Set returnedVal=LoadPicture(“X:\Images\” & imageID)
End Sub
当Excel装载工作簿时,为每个找到的图像属性调用loadImage回调,传递image属性的值作为imageID,不指向包含在文件中的图像。returnedVal参数必须设置为标准的IPicture图像对象或内置控件名,代码使用标准的LoadPicture函数从网络共享中装载图像作为正确的对象类型。不巧的是,LoadPicture不会处理.png文件格式,因此,如果您想使用这项技术装载.png文件,必须使用Windows API调用到GDI+库,这超出了本文的范围,但可从www.wrox.com下载一个可用的模块,提供了一个LoadPictureGDI函数处理.png文件。
当应用程序运行时,如果您想改变自定义的控件图像,可使用getImage回调。一个例子是用于单元格边框的splitButton控件,当从按钮的菜单部分选择一项(例如双线底边框)时,按钮图像(和行为)被更新与所选项目相匹配。这可通过分配一个OnAction回调到所有的菜单项中来实现,它在模块级的变量中记录了合适的图像并标识了需要刷新的按钮(稍后详述)。当Excel下次需要显示按钮时,再次调用getImage回调,从模块级的变量中返回新的图像。
showImage属性和getShowImage回调可以是true或false,它们控制着控件的图像是否显示。
showItemImage属性和getShowItemImage回调可以是true或false,控制着是否为dropDown、comboBox或gallery项显示图像。
size属性和getSize回调可以是normal或large。标准的(normal)尺寸占用Ribbon的一行(图标侧带有标题),而大的(large)尺寸占用所有的三行(图标下面带有标题)。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 17:21 , Processed in 0.050942 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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