细品RibbonX(58):示例—创建动态的Ribbon库

细品RibbonX(58):示例—创建动态的Ribbon库

资料整理来自于论坛
完整版下载地址:http://download.csdn.net/download/nodeman/10264659

 

 Loading ...

 

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 2007Custom UI Editor”,然后打开“Charts_In_Ribbon.xlsm”文档,其中的XML代码如下:

<customUIxmlns="http://schemas.microsoft.com/office/2006/01/customui"onLoad="ribbonLoaded">
      <ribbon>
        <tabs>
            <tabidMso="TabHome">
              <groupid="grpChartsInRibbon"label="Charts">
 
                 <galleryid="galSmallCharts"
                          label="Small Charts"
                          size="large"
                          showLabel="true"
                          imageMso="ChartPlacement"
                          columns="1"
                          rows="5"
                          itemHeight="90"
                          itemWidth="150"
                          supertip="Small pictures of your charts!"
                          getItemCount="getItemCount"
                          getItemID="getItemID"
                          getItemImage="getItemImage"  
                          getItemSupertip="getItemSupertip"
                          getItemLabel="getItemLabel"
                          onAction="galRefreshAction"/>
 
                 <galleryid="galBigCharts"
                          label="Big Charts"
                          size="large"
                          showLabel="true"
                          imageMso="ChartPlacement"
                          columns="2"
                          rows="2"
                          itemHeight="291"
                          itemWidth="483"
                          supertip="Large pictures of your charts!"
                          getItemCount="getItemCount"
                          getItemID="getItemID"
                          getItemImage="getItemImage"  
                          getItemSupertip="getItemSupertip"
                          onAction="galRefreshAction"/>
 
            </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

如果创建一个新文档并在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 = Ribbon
End Sub

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

Sub getItemCount(control As IRibbonControl, ByRef count)
        count = ActiveSheet.ChartObjects.count
        Application.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_" & index
End Sub

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

Sub getItemSupertip(control As IRibbonControl, index As Integer, ByRef supertip)
    Dim oSeries As Series
    Dim sTooltip As String
    For Each oSeries In ActiveSheet.ChartObjects(index + 1).Chart.SeriesCollection
        sTooltip = sTooltip & vbCrLf & oSeries.Name & vbCrLf & oSeries.Formula & vbCrLf
    Next oSeries
    supertip = sTooltip
End Sub

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

Sub getItemLabel(control As IRibbonControl, index As Integer, ByRef label)
    If ActiveSheet.ChartObjects(index + 1).Chart.HasTitle Then
        label = ActiveSheet.ChartObjects(index + 1).Chart.ChartTitle.Caption
    Else
        label = ActiveSheet.ChartObjects(index + 1).Name
    End If
End 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).Height
    ActiveSheet.ChartObjects(selectedIndex + 1).Activate
End Sub

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

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值