admin 管理员组

文章数量: 1086019


2024年4月20日发(作者:unt的单词)

RibbonX和VBA

[分享]RibbonX和VBA

本文整理自《Excel 2007 VBA Programmer’s Reference》一书的第14章:RibbonX,

也是该书在网上公开的内容,详细讲述了使用VBA如何设置和操作Ribbon。该书的目录

和示例章节请见下面的链接:/Excel2007ProgRef/。

由于对Excel2007的熟悉程度和英文水平有限,可能有很多错漏之处,敬请批评指正。

后记:断断续续的抽了一些空余时间,终于将本章内容全部译完了,也使自已对Ribbon

开发有了更进一步的认识。但是,由于对Excel 2007认识有限,再加上时间和水平方面的

原因,也来不及仔细研磨,匆匆将该章初译稿奉上,以供大家学习参考。对其中的不通顺

之处和错漏的地方,请大家多包涵,也请大家批评指正。

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) 所有内置的控件都是可用的,能够被重载、执行和查询它们的图像、标题,等等。

资料库

博客网

准备工作

如果您想花些时间研究RibbonX,那么有一些关键的工具需要下载并需要知道一些网

站:

(1) 正式的RibbonX站点是/office/tool/ribbon。

(2) Office 2007自定义UI编辑器可从下面链接下载:

/articles/。

(或/user1/fanjy/archives/2007/)

(3) 在MSDN站点上有两个有价值的文件可以利用。第一个文件包含Excel所有内置

的选项卡、组和控件的名称列表;第二个文件是一个Excel加载项,添加了一个所有可用

的内置图像库,能够用于自定义的控件中。

(4) 如果您想了解RibbonX的实质,MSDN中的架构是可用的。这是

正式的架构,用于使您的定制生效,确切地描述了哪个控件具有什么属性和内容。

(5) 为了告知您的RibbonX XML中的任何错误,应选中“Office按钮>>Excel选项>>

高级>>显示加载项用户接口错误”前的复选框。

添加定制

添加RibbonX定制到工作簿中只需两个步骤:

1、创建XML文件来定义所需要的定制。

2、插入该XML文件到工作簿文件中(必须使用XML文件格式之一)。

第一步是本文剩下的部分所要讲述的主题。您可以通过手工或编程来添加XML部分,

需要进行下面的操作:

1、添加XML文件到工作簿压缩结构中。通过协定,它有名称

/customUI/,虽然可以使用任何其它的名称。最好将XML部分放在它自身

的文件夹中,因为也需要在这里存储按钮图像。

2、编辑根文件rels以包括对新的XML部分的引用,诸如:

(1)

Type=”/office/2006/relationships/ui/extensibility”

Target=”/customUI/” Id=”rID5” />

(2) 最重要的是relationship的Type属性,因为这是Excel判断是否relationship

为一个RibbonX定制。注意,因为是XML,区分大小写,所以正确的大小写拼写是相当

重要的。

这些变化很容易通过Office 2007自定义UI编辑器实用程序来实现,可从下面的链接

下载:

/articles/。

(或/user1/fanjy/archives/2007/)

XML结构

Ribbon主要的关键之一是所有的控件都根据相关的功能分成组,因此,文本格式的

控件在“开始”选项卡的“字体”组中,公式审核工具全部位于“公式”选项卡中的“公

式审核”组中。从功能角度看,这是合乎逻辑的,但从过程角度看Ribbon则完全不合逻

辑。例如,Excel用户通常会被要求去查看他人创建的工作簿,此时,面对着这样的问题:

大多数人以他们自已的方式处理文件、跟踪公式、检查定义的名称、对单元格应用不同的

格式、添加评论、有规律地在原始工作簿和副本之间切换。不巧的是,这些操作中的每一

个都涉及到Ribbon中的不同的选项卡。

在先前版本的Excel中,可以通过创建自定义工具栏并在其中添加所需要的按钮使所

有这些操作组合在一起。当完成工作簿审核后,您能关闭工具栏直到下次去查看其他人的

文件。

在Office 2007中,自定义工具栏的概念已被停止使用,取而代之的是,定义一些

RibbonX XML创建包含为审核所需要的所有内置组和/或控件的自定义选项卡,然后添加

XML到另外的空白加载项工作簿中。现在,当您被要求去审核工作簿时,可以装载这个审

核加载项,这时所有您需要的控件都在工作簿中方便的位置。当您完成工作后,可以卸载

该加载项以移除自定义选项卡。这些都不需要VBA。

首先,创建一个新工作簿,在工作簿中单击“Office按钮>>准备>>属性”命令,添

加“标题”和“备注”(显示在加载项对话框中),然后保存为(在“另存为”

对话框中使用“Excel加载宏”文件类型)。

然后,打开Office 2007自定义UI编辑器,在该编辑器中打开文件,

输入下面的XML代码,单击“保存”添加XML到文件中。注意,XML文件中的代码区分

大小写,因此要正确的拼写大小写。

xmlns="/office/2006/01/customui">

返回到Excel中,打开加载项对话框(“Office按钮>>Excel选项>>加载项>>管理:

Excel加载项>>转到…”),然后装载加载项。单击该对话框中的“确定”

按钮后,可以在Ribbon中看到添加了一个名为Auditing选项卡,包含了在XML中定义

的组和控件,如下图1所示。

图1

下面介绍XML定义的每一行以及与Ribbon改变的结果相联系的部分。

元素是XML的根容器,名称集(namespace)将它识别作为RibbonX文

档。

元素是一个联系到可见的Ribbon的所有变化的容器。元素也

可以包含一个元素,用来重复利用内置控件(见本文后面的介绍)。

元系是一个联系到Ribbon中现有的或新的选项卡的所有变化的容器。

元素也能包含和/或元素来控制

Ribbon的相应部分。注意,不能有元素,这些元素超出

了RibbonX的范围。

元素是真正定制的开始,创建了自定

义的选项卡。包含在定制中的每项都必须至少有一个ID,有三种类型的ID属性:id、idMso

和idQ,分别指定自定义项、内置项、或与多个文件共享的项。在本例中,由于是创建一

个自定义选项卡,因此使用id属性并给它一个唯一的名称。为所有的自定义项使用标准的

前缀是一个好的做法,这容易使它们与内置的名称相区别。我习惯使用rx表示这是一个

RibbonX项,当在VBA中引用它时,也有助于进一步与其它类型的控件相区别。

元素创建第一组并打开其

中的内容的定义,显示在选项卡中的组与它们在RibbonX文件中定义的顺序相同,每列显

示三行,然后再从新列开始显示。

元素添加内置的“复制”按钮到自定义组中。普通的

control元素类型可以为所有内置控件使用而不管它们实际的类型,idMso ID类型提供了

实际控件名称。就像先前所提到的,所有Excel的控件名都列于

文件中,可从MSDN下载。

元素添加了标准的“粘贴”按钮和下拉菜单。

元素在该组中添加一条垂直分隔线

并开始第二列控件。注意,即使它为一个不进行任何操作的可视元素,仍须有一个独立的

自定义ID。

紧接着在自定义组中添加了内置的名称管理器、冻结窗格和切换窗口控件三个元素。

结束了第一组的定义。

元素在自定义选项卡中添加了整个

内置的公式审核组,使用了idMso和正确的名称来标识它作为内置的组。

素添加了内置的字体和数字格式组。

完成了自定义选项卡的定义,剩下的代码行结束了tabs、ribbon和customUI

元素容器。

使用这种技术,您可以创建仅仅包含RibbonX定义的由多个部分组成的加载项,每个

加载项创建由不同的内置控件组集中在一起的自定义选项卡,以适用于不同的高级任务。

如果这样做的话,您可能想添加加载项对话框到快速访问工具栏中。

虽然添加整个内置组到选项卡中是容易的,但通过创建自定义组并在其中添加特定的

控件通常可以得到好的结果。可以包括一些不同的容器控件,以提供分层控件或创建内置

控件的自定义下拉菜单,并设置一些显示属性来控制它们的外观。例如,可以包括一个自

定义的元素并使用showLabel属性来显示标准的排序按钮,并在已经存在的复制

菜单之上显示一组水平的光标:

在组中包括元素的结果如图2所示。

图2

加为好友 6楼 大 中 小 发表于 2007-3-13 08:32 只看该作者

★EH梦之队《实战技巧精粹》系列图书火热发售, 配套视频教程免费下载中★

RibbonX和VBA

Excel 2007不但有创建包含内置控件的选项卡和组的能力,而且Microsoft也提供了

添加许多类型的自定义控件到Ribbon中的能力,并且使用称作回调(callback)的机制将它

们的行为和大多数属性与VBA过程和函数挂钩。回调意味着当对RibbonX定义的控件进

行单击、变化等操作时,就会运行与控件相对应的过程,这与您已经使用多年的

、on等原理相同,在RibbonX中的主

要的不同在于传递到所调用的函数的一些参数,因此函数必须被正确地声明以便于调用。

而且,这与用户窗体控件事件过程的代码也不同。

可以使用调用在运行时改变控件属性。不是在XML中为属性定义一个特定的值,而是

提供Excel应该调用的过程名。例如,在前面自定义的组中,可以使用特定的getLabel

调用代替label=”Miscellaneous”属性:

当选项卡第一次显示时,Excel将调用rxAuditMisc_getLabel VBA过程(在一个标准

模块中),该过程提供了为Excel去使用的文本。如果您想在稍后的某个时候改变文本,不

能只更新对象的属性,RibbonX没有对象模型。取而代之的是,有一个接口去告诉Excel

先前所提供的信息不再有效,当Excel下步需要显示组或控件时,再调用过程来获取新值。

大多数控件的大多数属性可以使用这种方法动态设置。所有可用的调用和它们的功能在本

文后面详细描述,首先,看看所有可用的能够添加到Ribbon中的自定义控件类型,以及

所有可以修改控件的外观和行为的属性。

控件类型

Office以前的版本中有一组相对有限的控件类型可以被添加到菜单或工具栏中,

Office 2007允许您添加更多的按钮或弹出菜单,并且包括能够在Excel内置Ribbon中发

现的几乎每个显示机制的控件类型。下面列出了所有可用的控件类型、简单的描述以及每

类内置控件的示例图片。

基本控件

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

件类型中。

容器控件

下表列出了所有的容器控件,您可以添加这些控件到自定义组中。通过嵌套容器控件

在其它容器里,可以创建层次结构。

控件回调

大多数RibbonX定制可以在设计时定义,并且因此可以直接包括在XML文件中。然

而,如果一些属性需要在启动时设置或者可以在运行时改变,则可以使用等价的get属性

来提供回调函数的名称。当Excel开启时,调用该函数且该函数提供属性的值。与过去使

用的OnAction调用不同,Excel不会自动作于该回调到包含RibbonX定义的工作簿。如

果多个工作簿包含带有相同回调名称的过程,则不会保证有哪一个会被调用。

例如,下面是XML文件中最初所包含的代码行,对组标签进行了硬编码:

为了使用回调来代替,添加下面的VBA过程到工作簿中,以在运行时

提供标签。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属性,所添加的调用过程为:

如果重新装载该加载项并单击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 = p(, _

("rngLabels"), glLanguaeID, False)

End Sub

除了get等价于所有设计时属性外,下表列出的控件回调仅在运行时可用。

下表列出了所有可用的控件回调函数标记。如果您使用Office 2007自定义UI编辑器,

可以为任何包含于XML文件中的回调生成正确的调用标记,并可以粘贴到VBA工程中。

其它的RibbonX元素、属性和回调

虽然在RibbonX中的大多数元素、属性和回调用于设置控件的属性,但您需要理解更

多以完全使用Ribbon。

如果您忽略了定义控件的XML元素,那么完整的RibbonX结构如下所示,其中的省

略号(…)表示一个或多个可选的属性,这些元素和它们的属性在下面的小节中介绍。

xmlns="/office/2006/01/customui" ...>

可用于菜单中的任何控件类型

,


本文标签: 控件 使用 添加 工作 选项卡