ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > 综合应用 > 细品RibbonX(58):示例—创建动态的Ribbon库

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

作者:绿色风 分类: 时间:2022-08-17 浏览:176
楼主
apolloh
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代码如下:


  1. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="ribbonLoaded">
  2.         <ribbon>
  3.           <tabs>
  4.                 <tab idMso="TabHome">
  5.                 <group id="grpChartsInRibbon" label="Charts">

  6.                  <gallery id="galSmallCharts"
  7.                           label="Small Charts"
  8.                           size="large"
  9.                           showLabel="true"
  10.                           imageMso="ChartPlacement"
  11.                           columns="1"
  12.                           rows="5"
  13.                           itemHeight="90"
  14.                           itemWidth="150"
  15.                           supertip="Small pictures of your charts!"
  16.                           getItemCount="getItemCount"
  17.                           getItemID="getItemID"
  18.                           getItemImage="getItemImage"  
  19.                           getItemSupertip="getItemSupertip"
  20.                           getItemLabel="getItemLabel"
  21.                           onAction="galRefreshAction"/>

  22.                  <gallery id="galBigCharts"
  23.                           label="Big Charts"
  24.                           size="large"
  25.                           showLabel="true"
  26.                           imageMso="ChartPlacement"
  27.                           columns="2"
  28.                           rows="2"
  29.                           itemHeight="291"
  30.                           itemWidth="483"
  31.                           supertip="Large pictures of your charts!"
  32.                           getItemCount="getItemCount"
  33.                           getItemID="getItemID"
  34.                           getItemImage="getItemImage"  
  35.                           getItemSupertip="getItemSupertip"
  36.                           onAction="galRefreshAction"/>

  37.             </group>
  38.         </tab>
  39.     </tabs>
  40.   </ribbon>
  41. </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对象为后面使用:


    1. Public Sub ribbonLoaded(Ribbon As IRibbonUI)
    2.     Set oRibbon = Ribbon
    3. End Sub

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


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

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



    1. Sub getItemImage(control As IRibbonControl, index As Integer, ByRef image)
    2.     ActiveSheet.ChartObjects(index + 1).Chart.Export ThisWorkbook.Path & "\Chart_" & index + 1 & ".jpg", "jpg"
    3.     Set image = LoadPicture(ThisWorkbook.Path & "\chart_" & index + 1 & ".jpg")
    4. End Sub
    “getItemID”程序在通过ribbon获取库项目的id时调用。在本示例中我们不使用。
    1. Sub getItemID(control As IRibbonControl, index As Integer, ByRef id)
    2.     id = "Chart_" & index
    3. End Sub
    下一个回调定义每个库项目的工具提示,或者超级工具提示。在本示例中,工具提示是series名称和公式,提供用户其原理或来源于哪里。这虽然不是特别有帮助的,但有趣。
    1. Sub getItemSupertip(control As IRibbonControl, index As Integer, ByRef supertip)
    2.     Dim oSeries As Series
    3.     Dim sTooltip As String
    4.     For Each oSeries In ActiveSheet.ChartObjects(index + 1).Chart.SeriesCollection
    5.         sTooltip = sTooltip & vbCrLf & oSeries.Name & vbCrLf & oSeries.Formula & vbCrLf
    6.     Next oSeries
    7.     supertip = sTooltip
    8. End Sub


    “getItemLabel”回调仅被小库调用,通过RibbonX来定义,将设置库项目的标签。本例中,将使用图表标题作为标签,如果不存在则使用图表名称。
    1. Sub getItemLabel(control As IRibbonControl, index As Integer, ByRef label)
    2.     If ActiveSheet.ChartObjects(index + 1).Chart.HasTitle Then
    3.         label = ActiveSheet.ChartObjects(index + 1).Chart.ChartTitle.Caption
    4.     Else
    5.         label = ActiveSheet.ChartObjects(index + 1).Name
    6.     End If
    7. End Sub


    下一个程序当用户在库项目中单击后调用。例如,用户单击某图表,代码将滚动到该图表并激活该图表。
    1. Sub galRefreshAction(control As IRibbonControl, selectedId As String, selectedIndex As Integer)
    2.     ActiveWindow.ScrollIntoView ActiveSheet.ChartObjects(selectedIndex + 1).Left, ActiveSheet.ChartObjects(selectedIndex + 1).Top, ActiveSheet.ChartObjects(selectedIndex + 1).Width, ActiveSheet.ChartObjects(selectedIndex + 1).Height
    3.     ActiveSheet.ChartObjects(selectedIndex + 1).Activate
    4. End 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.aspx04.jpg
     
  • 2楼
    rongjun
    学习了!

    免责声明

    有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
    ------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

    评论列表
    sitemap