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改变的结果相联系的部分。 档。 可以包含一个 Ribbon的相应部分。注意,不能有 了RibbonX的范围。 义的选项卡。包含在定制中的每项都必须至少有一个ID,有三种类型的ID属性:id、idMso 和idQ,分别指定自定义项、内置项、或与多个文件共享的项。在本例中,由于是创建一 个自定义选项卡,因此使用id属性并给它一个唯一的名称。为所有的自定义项使用标准的 前缀是一个好的做法,这容易使它们与内置的名称相区别。我习惯使用rx表示这是一个 RibbonX项,当在VBA中引用它时,也有助于进一步与其它类型的控件相区别。 中的内容的定义,显示在选项卡中的组与它们在RibbonX文件中定义的顺序相同,每列显 示三行,然后再从新列开始显示。 control元素类型可以为所有内置控件使用而不管它们实际的类型,idMso ID类型提供了 实际控件名称。就像先前所提到的,所有Excel的控件名都列于 文件中,可从MSDN下载。 并开始第二列控件。注意,即使它为一个不进行任何操作的可视元素,仍须有一个独立的 自定义ID。 紧接着在自定义组中添加了内置的名称管理器、冻结窗格和切换窗口控件三个元素。 结束了第一组的定义。 内置的公式审核组,使用了idMso和正确的名称来标识它作为内置的组。 素添加了内置的字体和数字格式组。 完成了自定义选项卡的定义,剩下的代码行结束了tabs、ribbon和customUI 元素容器。 使用这种技术,您可以创建仅仅包含RibbonX定义的由多个部分组成的加载项,每个 加载项创建由不同的内置控件组集中在一起的自定义选项卡,以适用于不同的高级任务。 如果这样做的话,您可能想添加加载项对话框到快速访问工具栏中。 虽然添加整个内置组到选项卡中是容易的,但通过创建自定义组并在其中添加特定的 控件通常可以得到好的结果。可以包括一些不同的容器控件,以提供分层控件或创建内置 控件的自定义下拉菜单,并设置一些显示属性来控制它们的外观。例如,可以包括一个自 定义的 菜单之上显示一组水平的光标: 在组中包括 图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" ...> 可用于菜单中的任何控件类型 所有控件类型 所有控件类型 在多个工作簿中共享控件 当使用id属性创建自定义的选项卡、组和控件时,您总会获得一个带状的新选项卡、 组或控件——即使带有相同ID或标签的已存在。这通常是有利的,因为它避免了多个加 载项意外改变彼此的项目。然而,有时您想在多个加载项或工作簿中共享这些项目,例如, 有一个创建基本选项卡、组和菜单结构的加载项,并且一些单个的工作簿要添加这些项目, 这可通过使用idQ属性提供满足要求的IDs来获得——IDs联系着一个特定的名称空间。 名称空间在customUI元素中提供,并且只需要是独立的字符串,可以提供一个别名(本例 中为Q)以便于XML更容易阅读: xmlns:Q="Excel 2007 VBA Prog Ref"> 您想要在工作簿间共享的任何元素接下来使用idQ属性来定义,并且包括在ID中的 名称空间别名: 任何使用相同名称字符串去限定带有相同ID的控件的工作簿将共享那些控件,而不是 获取它们自已的副本。在本例中,包括一个名称空间xmls:Q=”Excel 2007 VBA Prog Ref” 和限定选项卡ID idQ=”Q:rxShared”的任何工作簿都将为它们的控件使用相同的选项 卡。然而,因为您已为组使用了非限定的ID,所以该组不会在工作簿之间共享。这种方法 中使用限定的IDs的能力应用于所有容器类型的控件,因此,一个加载项使用限定的IDs 可以为所有的选项卡、组和菜单创建一个复杂的菜单结构,并且单个的工作簿能够添加它 们的定制到共享的菜单中。 运行时更新控件 回调不只是用于在装载工作簿时获取控件的属性,也可以使用它们在任何时间改变属 性的值。这可通过使用指定的接口(IRibbonUI)标识一个控件为无效来实现,下次Excel需 要显示该控件时,将再次调用所有回调来获取最新值。 通过添加onLoad回调到custom元素中,告诉Excel提供一个IRibbon接口: xmlns:Q="Excel 2007 VBA Prog Ref" onLoad="rxcustomUI_onLoad"> onLoad回调标记包括一个IRibbon参数,存储在一个模块级变量中供以后使用: Dim moRibbon As IRibbonUI Sub rxcustomUI_onLoad(ribbon As IRibbonUI) Set moRibbon = ribbon End Sub IRibbonUI接口仅有两个方法: (1) InvalidateControl(“ControlID”)方法标记一个单独的控件无效,因此当该控件 下次显示时应该被更新。通常,使控件无效是最好的。 (2) Invalidate方法标记整个Ribbon定制无效,因此,每个控件的每次回调都被重新 调用。这可能在提供UI语言选择和为每个控件使用getLabel时使用,当用户改变他们的 语言选择时,使每个控件无效,因此更新时显示新的文本。 作为一个例子,下面的XML创建一个带有Up、Goto和Down菜单的splitButton, 使用了内置的图像,并定义回调可以改变按钮的图像和行为以重复最后所选择的菜单(像 Border splitButton)。创建一个新的工作簿,作为加载项保存该工作簿,然后使用自定义 UI编辑器添加XML: onLoad="rxcustomUI_onLoad"> 现在,打开上面创建的加载项(忽略任何错误),然后添加下面的VBA代码到标准模块 中,执行定义在XML中的所有回调: '使控件无效的变量 Dim moRibbon As IRibbonUI '存储当前splitButton样式的变量,与图像名相同 Dim msSplitStyle As String '回调 Sub rxcustomUI_onLoad(ribbon As IRibbonUI) Set moRibbon = ribbon End Sub 'rxButton getImage回调 Sub rxButton_getImage(control As IRibbonControl, ByRef returnedVal) 'GoTo缺省样式 If msSplitStyle = "" Then msSplitStyle = "GoTo" '返回内置图像名 returnedVal = msSplitStyle End Sub 'rxButton onAction回调 Sub rxButton_onAction(control As IRibbonControl) DoSplitAction msSplitStyle End Sub '所有rxMenu onAction回调 Sub rxMenu_onAction(control As IRibbonControl) '从控件ID中获取样式 msSplitStyle = Mid$(, 7) '告诉ribbon按钮需要被刷新 dateControl "rxButton" '执行合适的操作 DoSplitAction msSplitStyle End Sub '执行操作 Private Sub DoSplitAction(ByVal sStyle As String) Select Case sStyle Case "OutlineMoveUp": MsgBox "向上" Case "GoTo": MsgBox "定位到" Case "OutlineMoveDown": MsgBox "向下" End Select End Sub 保存并关闭该加载项工作簿,然后重新打开该工作簿,此时应该有一个名为VBA Prog Ref的选项卡,带有一个单独的大的分割按钮,按钮上的图像和动作变化与所选菜单相匹 配。 图4 挂钩内置控件 鉴于大多数RibbonX集中定制Ribbon的可见的外观,commands和command元 素提供了一种机制用来重载任何内置菜单,修改它的开启状态或中止任何按钮单击。可以 包括下面的XML去重载Print按钮以便可以建立某种格式: xmlns="/office/2006/01/customui"> command元素仅有一个enabled属性或getEnabled和/或onAction回调。例如, 通过包含enabled=”false”来使一个控件失去能力,或视应用程序的状态使用 getEnabled回调决定是否开启控件。onAction回调用于中止缺省的行为,允许您去处理 一些先前的过程并删除行为: '为Print onAction回调,带有删除的能力 Sub rxPrint_onAction(control As IRibbonControl, ByRef cancelDefault) If CDbl(Time) > 0.5 Then MsgBox "打印仅能在早晨进行!" cancelDefault = True End If End Sub 不巧的是,用这种方式重载Ribbon控件仅影响用户实际单击该控件或使用Alt+Key 快捷键去触发该控件,而不能中止可以使用功能键和Ctrl+Key组合键(如本例中的Ctrl+P) 进行的一些操作。 如果两个加载项试图重载相同的控件,则最后装载的加载项有效。 因为上述两个原因,重载一个控件的功能应该谨慎使用。 在“独特”应用程序中的RibbonX 大多数独特样式的Excel应用程序典型地以移除所有的Excel菜单并尽可能以一些其 它的UI元素开始,以便提供一个向下锁定的界面给用户。这可以使用ribbon元素的 startFromScratch属性提供带有新建(New)、打开(Open)、另存为(Save As)、最近打开 的文件(Recent Files)和Excel选项(Excel Options)等项的最小的Office菜单: xmlns="/office/2006/01/customui"> (使用上述代码后的界面如图5所示。) 显然,您可以包括更多的XML去创建自定义的选项卡、组,等等。 图5 定制Office菜单 Office菜单作为RibbonX定义里一个特定的实例,可以通过officeMenu元素在其中 添加控件: xmlns="/office/2006/01/customui"> onAction="rxOMBtn_onAction"> 也可以通过嵌套合适的控件IDs添加按钮到Office菜单的内置项中,例如“发送”菜 单。注意,在作这样的处理时,必须使用正确的控件类型而不是一般的control元素: xmlns="/office/2006/01/customui"> 定制QAT Office 2007设计原理是QAT属于用户且应用程序决不会直接添加控件到QAT中。 如果用户考虑某些功能是有用的,可以将它们放在QAT中。 在某种情况下,能够添加控件到QAT中是非常有利的——诸如用户创建与本文前面的 Auditing加载项相似的加载项,通过移走QAT中成组的控件而不是添加自定义的选项卡。 不巧的是,Microsoft选择了放弃这项功能,而是设置startFromScratch=”true”来限 制QAT定制到“独特的”应用程序。 QAT有两部分——一部分控件被所有打开的控件所共享,而一部分控件则仅当该文档 处于活动状态时显示在QAT中。可以使用一般的 器添加内置控件到这两个区域中: xmlns="/office/2006/01/customui"> 控制选项卡、选项设置和组 的结构。本文中,您已经用各种方式使用了选项卡和组。tabSet元素提供对内置上下文选 项卡的访问,例如,选取图表时,Excel显示三组上下文相关的图表工具选项卡。您可以使 用下面的XML添加一个自定义组到图表工具设计选项卡中: xmlns="/office/2006/01/customui"> Microsoft对处理选项卡、上下文相关选项卡和组设置了一些限制,包括: (1) 不能创建自已的上下文相关的tabSet,但仅可以指向内置的 (2) 能添加自定义选项卡到选项卡组中以及自定义组到内置选项卡中 (3) 不能添加控件到内置组中 (4) 能添加内置组到不同的选项卡(内置或自定义的) (5) 能使内置选项卡或组不可见 (6) 能移动选项卡或组到另一个之前或之后 可以通过设置 (1) visible=”false”隐藏选项卡或组 (2) insertAfterMso=”TabData”移动或添加选项卡或组到一个内置的选项卡或组 之后 (3) insertBeforeMso=”GroupZoom”移动或添加选项卡或组到一个内置的选项卡 或组之前 (4) insertAfterQ=”Q:SharedTab”移动或添加选项卡或组在一个限定的自定义选 项卡或组之后 (5) insertBeforeQ=”Q:SharedGroup”移动或添加选项卡或组在一个限定的自定 义选项卡或组之前 动态控件 Ribbon被设计成为一个包含选项卡、组和控件的静态的结构,在处理Excel时,Ribbon 中所有的控件都在相同的地方且有相同的结构、尺寸和动作。Ribbon中唯一可以被考虑 为动态的部分是上下文相关的选项卡、Window列表和File MRU——仅改变上下文选项 卡可见性,结构仍然保持不变。 在RibbonX设计中反映的原理是XML定制的限制,必须在前面进行定义且硬编码到 文档文件中,在VBA中没有运行时提供XML的机制。事实上,如果赞同该原理,则不需 要在运行时提供XML,因为getLabel、getImage和其它的回调对任何局部需求都是足够 的。 然而,有时候该原理也不适用——Window菜单是一个例子。如果当打开或关闭工作 簿,或者添加和删除工作表时,如果代码改变了命令条结构,当移动CommandBar代码 去使用Ribbon时可能也有问题。 幸运的是,Microsoft认识到在UIs方面的某些实质性的需求,并且提供了四个控件, 这些控件的内容能在运行时提供。它们是comboBox、dropDown、gallery和 dynamicMenu控件,使用一组回调提供内容,控件开始显示时调用并且它们会明确地标 记为无效。它们也有相当有用的invalidateContentOnDrop属性,如果设置为true则每 次都调用回调,否则只是在控件下拉前调用。 dropDown,comboBox和gallery 这些控件实质上是三种下拉控件的样式,gallery下拉显示一个二维栅格图像和/或标 签,dropDown控件和comboBox控件可以是静态的,在XML中以 们的内容。可以在运行时通过使用getItemCount、getItemID、getItemLabel、 getItemImage、getItemScreentip或getItemSupertip回调放置所有三个控件。至少, 必须使用getItemCount提供列表中的项目数。剩下的getItem回调将使用项目索引值传 递调用,需要为每个项目使用getItemID提供一个ID,且使用getItemImage或 getItemLabel将分别提供图像或标签。dropDown和comboBox控件通常带有图像和标 签会看起来更好,而gallery被设计成作为一组栅格图像会看起来更好。在各种情况下, dropDown或gallery的onAction回调提供所选项目的ID和索引号作为参数(comboBox 仅有一个onChange回调提供文本)。 动态菜单 dynamicMenu是RibbonX中的一个独立的控件,因为它是仅有的一个内容结构能够 在运行时可以改变的控件。dropDown、comboBox和gallery实质上是一个直接的列表, 而dynamicMenu可以包含自定义和内置控件的一个完整的控件层次——也包括其它的 dynamicMenus。这个控件被创建以满足特定的需求,其内容随工作簿打开、关闭和变化 而改变。 设想一个包含多个不同类型工作表的工作簿(例如,原始数据、中间计算、汇总和报告), 且每个工作表需要一组不同的菜单,可以使用下面的菜单定义(为了清楚起见,忽略了额外 的属性和回调如Image和onAction):
问题是,在设计时不知道最终的工作簿中每种类型可能有多少工作表,或者以什么顺
序显示。dynamicMenu的getContent回调提供了运行时使用VBA创建先前的XML的
机制(通过直接检测工作簿)。在XML定义里,包括单独的dynamicMenu入口:
getContent="rxSheetOperations_getContent"> rxSheetOperations_getContent过程为所包含的控件建立了XML定义并返回,这 些控件定义包含在
Sub rxSheetOperations_getContent(ByRef control As IRibbonControl, ByRef
returnedVal)
Dim sXML As String
Dim wks As Worksheet
'以容器
版权声明:本文标题:Excel RibbonX VBA 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1713581911a641816.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论