作者:绿色风
分类:
时间: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代码如下:
- <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="ribbonLoaded">
- <ribbon>
- <tabs>
- <tab idMso="TabHome">
- <group id="grpChartsInRibbon" label="Charts">
- <gallery id="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"/>
- <gallery id="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代码之后,打开该文档将显示两个新库,点击每个库的下拉箭头后,将显示工作表中最近图表的图像,单击库中的某图表将到达该图表。 您可以修改本示例,以达到更丰富的效果。 如果将本示例作为一个加载项,将可以在所有工作簿中使用。 目前,本示例只是遍历活动工作表的图表,可以修改以显示整个工作簿中的图表,甚至是所有打开的工作簿中的图表。 参考资源: 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总版主之一