台湾教练rocky35分钟:细品RibbonX(58):示例—创建动态的Ribbon库

来源:百度文库 编辑:中财网 时间:2024/04/29 13:06:41
Sam Radakovitz曾在Excel团队博客中发表过一篇文章,介绍了如何创建动态的Ribbon库,即如何通过RibbonX和VBA放置动态的图形图像到功能区库中,在该文中,作者创建了两个库:一个是带有标签的小图表图像,一个是大的图像。如图1和图2所示。

图1:小图形库

图2:大图形库
带有完整的RibbonX和VBA代码的示例文档见:

下面对其进行简单的介绍。
RibbonX
先从RibbonX代码开始。RibbonX简单的解释就是定义Ribbon外观的XML。对于本例,RibbonX将定义所放置的两个库的位置、库按钮以及在库中的项目,RibbonX已存在于文档中,必须使用工具来获取文档中的RibbonX代码,您可以使用Office 2007 Custom UI Editor。打开“Office 2007 Custom UI Editor”,然后打开“Charts_In_Ribbon.xlsm”文档,其中的XML代码如下:
   

如果创建一个新文档并在Office 2007 Custom UI Edtior中打开该文档,则不会看到任何内容,因为该文档中没有RibbonX。下面,我们来介绍一个这个Ribbon XML的关键点:
回调
这里,告诉功能区调用VBA函数来获取:库中的项目数、项目的标签、悬浮在项目上时显示的工具提示。例如在RibbonX中:

getItemCount="getItemCount"

红色的getItemCount是RibbonX属性,告诉功能区去调用VBA函数来获取项目数,蓝色的getItemCount是要调用的VBA函数名称。如果想指定固定的项目数,则应使用:

ItemCount="4"

Ribbon对象
在customUI标签中添加

onLoad="ribbonLoaded"

将允许VBA代码获取ribbon对象的一个句柄,允许我们使ribbon无效。使该ribbon无效将强制ribbon在下次用户进入库时调用库程序(回调),为我们提供了更新库中项目和图像的一种方式。在下面的VBA部分将介绍如何使ribbon无效。
库的位置
在本示例中,我们在“开始”选项卡中创建了一个新组:

idMso="TabHome"

。因为我们没有指定“insertbefore”属性,因此将新按钮排在“开始”选项卡的右侧。
在库按钮中的图像
这里,为库按钮图像选取了一个已存在的ribbon图标:

这种结果是通过

imageMso="ChartPlacement"

来定义的。可以为每个按钮使用不同的图标,或者通过回调或定义图像属性装载自已的图标。
小库或大库
两个库对代码有相同的回调,因为它们的项目数和图表图片是相同的,它们在RibbonX里的不同是:

  • 对于小库,itemWidth和itemHeight属性被设置得比大库更小。
  • 小库有另一个回调,来定义库中每个图表的标签。由于在小库中的图表更小,所以添加标签能帮助识别图表。
  • 对小库有更少的列,但有更多的行。设置小库为单列来帮助创建小库和大库之间不同的视图。

VBA代码
本例中,oRibbon对象是Ribbon,将使用其来使Ribbon无效,以便可以强制更新库。

Public oRibbon As IRibbonUI

当ribbon装载RibbonX时,调用接下来的sub过程,传递Ribbon对象,这是获取Ribbon对象的唯一方式。该代码设置公共的ribbon对象为后面使用:

Public Sub ribbonLoaded(Ribbon As IRibbonUI)Set oRibbon = RibbonEnd Sub

当用户在库中单击时,调用“getItemCount”,ribbon需要清楚其显示什么。因为我们在RibbonX中定义了回调,指定在库中有多少项。
注意本例中的OnTime方法,如何使ribbon无效。默认情况下,ribbon将调用所有回调一次来获取项目和图像,并隐藏这些值直至使它们无效。这里,每次用户在库中单击时,使图像失效。处理这种操作有更顺畅的方法,但本示例将保持简单的方式。

Sub getItemCount(control As IRibbonControl, ByRef count)count = ActiveSheet.ChartObjects.countApplication.OnTime DateAdd("s", 1, Now), "InvalidateRibbon"End Sub

下一个程序为库中每个项目调用,将设置项目在库中显示的图像。本例中,想使所有的图像都在这里,因此Ribbon带有一个索引值,只是告诉索引的图表,然后告诉ribbon使用该图像。

Sub getItemImage(control As IRibbonControl, index As Integer, ByRef image)ActiveSheet.ChartObjects(index + 1).Chart.Export ThisWorkbook.Path & "\Chart_" & index + 1 & ".jpg", "jpg"Set image = LoadPicture(ThisWorkbook.Path & "\chart_" & index + 1 & ".jpg")End Sub

“getItemID”程序在通过ribbon获取库项目的id时调用。在本示例中我们不使用。

Sub getItemID(control As IRibbonControl, index As Integer, ByRef id)id = "Chart_" & indexEnd Sub

下一个回调定义每个库项目的工具提示,或者超级工具提示。在本示例中,工具提示是series名称和公式,提供用户其原理或来源于哪里。这虽然不是特别有帮助的,但有趣。

Sub getItemSupertip(control As IRibbonControl, index As Integer, ByRef supertip)Dim oSeries As SeriesDim sTooltip As StringFor Each oSeries In ActiveSheet.ChartObjects(index + 1).Chart.SeriesCollectionsTooltip = sTooltip & vbCrLf & oSeries.Name & vbCrLf & oSeries.Formula & vbCrLfNext oSeriessupertip = sTooltipEnd Sub

“getItemLabel”回调仅被小库调用,通过RibbonX来定义,将设置库项目的标签。本例中,将使用图表标题作为标签,如果不存在则使用图表名称。

Sub getItemLabel(control As IRibbonControl, index As Integer, ByRef label)If ActiveSheet.ChartObjects(index + 1).Chart.HasTitle Thenlabel = ActiveSheet.ChartObjects(index + 1).Chart.ChartTitle.CaptionElselabel = ActiveSheet.ChartObjects(index + 1).NameEnd IfEnd Sub

下一个程序当用户在库项目中单击后调用。例如,用户单击某图表,代码将滚动到该图表并激活该图表。

Sub galRefreshAction(control As IRibbonControl, selectedId As String, selectedIndex As Integer)ActiveWindow.ScrollIntoView ActiveSheet.ChartObjects(selectedIndex + 1).Left, ActiveSheet.ChartObjects(selectedIndex + 1).Top, ActiveSheet.ChartObjects(selectedIndex + 1).Width, ActiveSheet.ChartObjects(selectedIndex + 1).HeightActiveSheet.ChartObjects(selectedIndex + 1).ActivateEnd Sub

最终的结果
在定义了RibbonX和VBA代码之后,打开该文档将显示两个新库,点击每个库的下拉箭头后,将显示工作表中最近图表的图像,单击库中的某图表将到达该图表。
您可以修改本示例,以达到更丰富的效果。
如果将本示例作为一个加载项,将可以在所有工作簿中使用。
目前,本示例只是遍历活动工作表的图表,可以修改以显示整个工作簿中的图表,甚至是所有打开的工作簿中的图表。
参考资源:
http://msdn2.microsoft.com/en-us/office/aa905530.aspx
http://msdn2.microsoft.com/en-us/office/aa905356.aspx
http://msdn2.microsoft.com/en-us/library/aa338199.aspx