上下文选项卡对新UI的功能提供了极大的推进作用。当用户对某对象执行特定的任务时就会出现特定的选项卡。例如,在Excel中处理图表时,一个上下文选项卡提供用于图表处理的额外选项。本文将介绍创建和执行这些特定的选项卡,以及如何修改内置的上下文选项卡,也介绍如何定制或替换内置的弹出菜单,如何创建自已的上下文弹出菜单。最后,探讨创建一个使用多种语言的UI。
使项目上下文
使项目上下文意味着必须响应所做的内容,例如操控表或图片。根据对上下文控件的定义,需要在新Office UI中使用上下文选项卡集合来执行任务。然而,也不总是这样。
下面介绍上下文控件的概念,例如选项卡、组和通用控件。
选项卡
当执行上下文敏感的命令时,立即想到的是上下文选项卡。作为使Ribbon的功能完整的一部分,这些特定的选项卡将根据所选择的对象或这些对象是否获得焦点而从功能区中出现和消失,例如图表、数据透视表或图片。
下图显示了名为“图片工具”的tabSet,包含一个名为“格式”的选项卡。

要实现这样的解决方案,需要使用上下文选项卡集合和tabSet元素。下面的XML标记作为上下文选项卡集和相应的选项卡的容器:
  1. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><customUI</span> <span style="color:#000066">xmlns</span>=<span style="color:#ff0000">"http://schemas.microsoft.com/office/2006/01/customui"</span><span style="color:#000000; font-weight:bold">></span></span>
  2. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><ribbon<span style="color:#000000; font-weight:bold">></span></span></span>
  3. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><contextualTabs<span style="color:#000000; font-weight:bold">></span></span></span>
  4. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><tabSet<span style="color:#000000; font-weight:bold">></span></span></span>
  5. <span style="color:#808080; font-style:italic"><!-- Your contextual tab code goes here --></span>
  6. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></tabSet<span style="color:#000000; font-weight:bold">></span></span></span>
  7. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></contextualTabs<span style="color:#000000; font-weight:bold">></span></span></span>
  8. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></ribbon<span style="color:#000000; font-weight:bold">></span></span></span>
  9. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></customUI<span style="color:#000000; font-weight:bold">></span></span></span>

contextualTabs集合是每个tabSet的父对象,同样选项卡的collection对象是选项卡的父对象。可以使用上述代码来创建自已的上下文敏感功能,访问内置的tabSets来修改它们。不巧的是,这样的tabSets扩展不能应用到Excel或Word,仅能对Access的窗体和报表提供这样的扩展。当在Access中使用自定义选项卡tabSets时,需要按下列方式引用扩展的tabSet:

  1. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><tabSet</span> <span style="color:#000066">idMso</span>=”TabSetFormReportExtensibility”<span style="color:#000000; font-weight:bold">></span></span>

在这个tabSet里,创建上下文选项卡UI。
对于Excel和Word,需要通过完全控制内置的上下文选项卡或者通过联合getVisible属性使用事件来使选项卡的行为像上下文选项卡。

例如,当用户处理Excel工作簿中的工作表Sheet1时,希望仅使字体组和插入图表组可见。XML代码:

  1. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><customUI</span> <span style="color:#000066">xmlns</span>=<span style="color:#ff0000">"http://schemas.microsoft.com/office/2006/01/customui"</span></span>
  2. <span style="color:#009900">    <span style="color:#000066">onLoad</span>=<span style="color:#ff0000">"rxIRibbonUI_onLoad"</span><span style="color:#000000; font-weight:bold">></span></span>
  3. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><ribbon</span> <span style="color:#000066">startFromScratch</span>=<span style="color:#ff0000">"false"</span><span style="color:#000000; font-weight:bold">></span></span>
  4. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><tabs<span style="color:#000000; font-weight:bold">></span></span></span>
  5. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><tab</span> <span style="color:#000066">idMso</span>=<span style="color:#ff0000">"TabHome"</span><span style="color:#000000; font-weight:bold">></span></span>
  6. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><group</span> <span style="color:#000066">idMso</span>=<span style="color:#ff0000">"GroupFont"</span></span>
  7. <span style="color:#009900">                   <span style="color:#000066">getVisible</span>=<span style="color:#ff0000">"rxShared_getVisible"</span><span style="color:#000000; font-weight:bold">/></span></span>
  8. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></tab<span style="color:#000000; font-weight:bold">></span></span></span>
  9. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><tab</span> <span style="color:#000066">idMso</span>=<span style="color:#ff0000">"TabInsert"</span><span style="color:#000000; font-weight:bold">></span></span>
  10. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><group</span> <span style="color:#000066">idMso</span>=<span style="color:#ff0000">"GroupInsertChartsExcel"</span></span>
  11. <span style="color:#009900">                   <span style="color:#000066">getVisible</span>=<span style="color:#ff0000">"rxShared_getVisible"</span><span style="color:#000000; font-weight:bold">/></span></span>
  12. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></tab<span style="color:#000000; font-weight:bold">></span></span></span>
  13. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></tabs<span style="color:#000000; font-weight:bold">></span></span></span>
  14. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></ribbon<span style="color:#000000; font-weight:bold">></span></span></span>
  15. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></customUI<span style="color:#000000; font-weight:bold">></span></span></span>

使用在XML中定义的共享回调,现在能够通过使用想控制的特定工作表的自定义属性来决定属性的返回值。使用下面的代码:

  1. <span style="color:#000080">Sub</span> rxShared_getVisible(<span style="color:#000080">control</span> <span style="color:#000080">As</span> IRibbonControl, <span style="color:#000080">ByRef</span> returnedVal)
  2. <span style="color:#000080">Select</span> <span style="color:#000080">Case</span> <span style="color:#000080">control</span>.ID
  3. <span style="color:#000080">Case</span> <span style="color:#800000">"GroupFont"</span>
  4. returnedVal = Sheet1.rxGroupFontVisible
  5. <span style="color:#000080">Case</span> <span style="color:#800000">"GroupInsertChartsExcel"</span>
  6. returnedVal = Sheet1.rxGroupInsertChartsExcel
  7. <span style="color:#000080">End</span> <span style="color:#000080">Select</span>
  8. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>

根据自定义的属性值设置该属性的值。首先,设置Ribbon对象,这样当文档打开时以便设置该Ribbon为ThisWorkbook对象的属性。下面的代码放置在ThisWorkbook模块中:

  1. <span style="color:#000080">Private</span> pRibbonUI <span style="color:#000080">As</span> IRibbonUI
  2. <span style="color:#000080">Public</span> <span style="color:#000080">Property</span> <span style="color:#000080">Let</span> rxIRibbonUI(iRib <span style="color:#000080">As</span> IRibbonUI)
  3. <span style="color:#000080">Set</span> pRibbonUI = iRib
  4. <span style="color:#000080">End</span> <span style="color:#000080">Property</span>
  5. <span style="color:#000080">Public</span> <span style="color:#000080">Property</span> <span style="color:#000080">Get</span> rxIRibbonUI() <span style="color:#000080">As</span> IRibbonUI
  6. <span style="color:#000080">Set</span> rxIRibbonUI = pRibbonUI
  7. <span style="color:#000080">End</span> <span style="color:#000080">Property</span>

其次,指定想控制的工作表的自定义属性,代码如下所示。自定义属性可读写,以便执行期间的任何时候都能重新赋值。

  1. <span style="color:#000080">Private</span> pblnGroupFontVisible <span style="color:#000080">As</span> <span style="color:#000080">Boolean</span>
  2. <span style="color:#000080">Private</span> pblnGroupChartVisible <span style="color:#000080">As</span> <span style="color:#000080">Boolean</span>
  3. <span style="color:#000080">Property</span> <span style="color:#000080">Let</span> rxGroupFontVisible(<span style="color:#000080">ByVal</span> blnVisible <span style="color:#000080">As</span> <span style="color:#000080">Boolean</span>)
  4. pblnGroupFontVisible = blnVisible
  5. <span style="color:#000080">End</span> <span style="color:#000080">Property</span>
  6. <span style="color:#000080">Property</span> <span style="color:#000080">Get</span> rxGroupFontVisible() <span style="color:#000080">As</span> <span style="color:#000080">Boolean</span>
  7. rxGroupFontVisible = pblnGroupFontVisible
  8. <span style="color:#000080">End</span> <span style="color:#000080">Property</span>
  9. <span style="color:#000080">Property</span> <span style="color:#000080">Let</span> rxGroupInsertChartsExcel(<span style="color:#000080">ByVal</span> blnVisible <span style="color:#000080">As</span> <span style="color:#000080">Boolean</span>)
  10. pblnGroupChartVisible = blnVisible
  11. <span style="color:#000080">End</span> <span style="color:#000080">Property</span>
  12. <span style="color:#000080">Property</span> <span style="color:#000080">Get</span> rxGroupInsertChartsExcel() <span style="color:#000080">As</span> <span style="color:#000080">Boolean</span>
  13. rxGroupInsertChartsExcel = pblnGroupChartVisible
  14. <span style="color:#000080">End</span> <span style="color:#000080">Property</span>

最后,根据需要修改自定义属性。这里,我们希望当指定工作表是活动工作表时显示这些组,因此使用Worksheet_Activate和Worksheet_Deactivate事件来修改属性值,代码如下:

  1. <span style="color:#000080">Private</span> <span style="color:#000080">Sub</span> Worksheet_Activate()
  2. Sheet1.rxGroupFontVisible = <span style="color:#000080">True</span>
  3. Sheet1.rxGroupInsertChartsExcel = <span style="color:#000080">True</span>
  4. ThisWorkbook.rxIRibbonUI.Invalidate
  5. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>
  6. <span style="color:#000080">Private</span> <span style="color:#000080">Sub</span> Worksheet_Deactivate()
  7. Sheet1.rxGroupFontVisible = <span style="color:#000080">False</span>
  8. Sheet1.rxGroupInsertChartsExcel = <span style="color:#000080">False</span>
  9. ThisWorkbook.rxIRibbonUI.Invalidate
  10. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>

当激活/取消激活该工作表时,显示或隐藏相应的组。
使用不明显的方法
使用可见性创建上下文敏感的选项卡和组可能有点不正规,但是确实是达到目标的有效的方式。然而,这种方式不是在所有情形下都可用,特别是在处理内置组中的内置控件时。
启用和禁用控件
可以使用enabled属性决定控件是否启用。
下面通过使用getEnabled属性提供上下文敏感的控件。要禁用命令,必须引用该命令本身和按钮或通用控件,例如禁用复制和剪切命令的XML代码如下:

  1. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><customUI</span> <span style="color:#000066">xmlns</span>=<span style="color:#ff0000">"http://schemas.microsoft.com/office/2006/01/customui"</span></span>
  2. <span style="color:#009900">    <span style="color:#000066">onLoad</span>=<span style="color:#ff0000">"rxIRibbonUI_onLoad"</span><span style="color:#000000; font-weight:bold">></span></span>
  3. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><commands<span style="color:#000000; font-weight:bold">></span></span></span>
  4. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><command</span> <span style="color:#000066">idMso</span>=<span style="color:#ff0000">"Copy"</span> <span style="color:#000066">getEnabled</span>=<span style="color:#ff0000">"rxShared_getEnabled"</span><span style="color:#000000; font-weight:bold">/></span></span>
  5. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><command</span> <span style="color:#000066">idMso</span>=<span style="color:#ff0000">"Cut"</span> <span style="color:#000066">getEnabled</span>=<span style="color:#ff0000">"rxShared_getEnabled"</span><span style="color:#000000; font-weight:bold">/></span></span>
  6. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></commands<span style="color:#000000; font-weight:bold">></span></span></span>
  7. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></customUI<span style="color:#000000; font-weight:bold">></span></span></span>

下一步,添加共享回调来处理要执行的程序:

  1. <span style="color:#000080">Sub</span> rxShared_getEnabled(<span style="color:#000080">control</span> <span style="color:#000080">As</span> IRibbonControl, <span style="color:#000080">ByRef</span> returnedVal)
  2. <span style="color:#000080">Select</span> <span style="color:#000080">Case</span> <span style="color:#000080">control</span>.ID
  3. <span style="color:#000080">Case</span> <span style="color:#800000">"Copy"</span>
  4. returnedVal = Sheet1.rxCopyEnabled
  5. <span style="color:#000080">Case</span> <span style="color:#800000">"Cut"</span>
  6. returnedVal = Sheet1.rxCutEnabled
  7. <span style="color:#000080">End</span> <span style="color:#000080">Select</span>
  8. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>

同样,使用自定义属性指定回调的返回值。
修改内置的选项卡集
下图展示了对内置的图表工具上下文选项卡集中添加的自定义选项卡。

正确修改内置选项卡集的关键是知道想要定制的tabSet的idMso,本例中,我们想修改TabSetChartTools选项卡集。
因此,在内置选项卡集中添加自定义选项卡的XML代码如下:

  1. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><customUI</span> <span style="color:#000066">xmlns</span>=<span style="color:#ff0000">"http://schemas.microsoft.com/office/2006/01/customui"</span><span style="color:#000000; font-weight:bold">></span></span>
  2. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><ribbon<span style="color:#000000; font-weight:bold">></span></span></span>
  3. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><contextualTabs<span style="color:#000000; font-weight:bold">></span></span></span>
  4. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><tabSet</span> </span>
  5. <span style="color:#009900">    <span style="color:#000066">idMso</span>=<span style="color:#ff0000">"TabSetChartTools"</span><span style="color:#000000; font-weight:bold">></span></span>
  6. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><tab</span> </span>
  7. <span style="color:#009900">       <span style="color:#000066">id</span>=<span style="color:#ff0000">"rxtab"</span> </span>
  8. <span style="color:#009900">       <span style="color:#000066">label</span>=<span style="color:#ff0000">"My Chart Tools"</span><span style="color:#000000; font-weight:bold">></span></span>
  9. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></tab<span style="color:#000000; font-weight:bold">></span></span></span>
  10. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></tabSet<span style="color:#000000; font-weight:bold">></span></span></span>
  11. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></contextualTabs<span style="color:#000000; font-weight:bold">></span></span></span>
  12. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></ribbon<span style="color:#000000; font-weight:bold">></span></span></span>
  13. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></customUI<span style="color:#000000; font-weight:bold">></span></span></span>

然而,有时我们想移除上下文图表选项卡中的所有的内置选项卡,仅在该选项卡集中添加一些非常特别的编辑工具。
首先,我们看看图表工具选项卡集中的选项卡,如下表所示。
表:图表工具选项卡集中默认的选项卡

选项卡名 描述
TabChartToolsDesign 提供用户设计所选择的图表的工具,例如内置样式选项、数据选择、图表类型,等等。
TabChartToolsLayout 指供用户布局所选择的图表的工具,例如标签、趋势线,等等。
TabChartToolsFormat 提供用户格式化所选择的图表的工具,例如形状样式、文本填充、文本效果、排列,等等。

选项卡不会像按钮一样提供enabled属性,因而使用其visible属性控制其出现。通过使选项卡不可见,其中的所有对象都将从UI中消失,但不会禁用其中包含的控件。
接着完成上面的示例,其XML代码如下:

  1. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><contextualTabs<span style="color:#000000; font-weight:bold">></span></span></span>
  2. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><tabSet</span> </span>
  3. <span style="color:#009900">    <span style="color:#000066">idMso</span>=<span style="color:#ff0000">"TabSetChartTools"</span><span style="color:#000000; font-weight:bold">></span></span>
  4. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><tab</span> </span>
  5. <span style="color:#009900">       <span style="color:#000066">id</span>=<span style="color:#ff0000">"rxtab"</span> </span>
  6. <span style="color:#009900">       <span style="color:#000066">label</span>=<span style="color:#ff0000">"My Chart Tools"</span><span style="color:#000000; font-weight:bold">></span></span>
  7. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><group</span> <span style="color:#000066">idMso</span>=<span style="color:#ff0000">"GroupFont"</span><span style="color:#000000; font-weight:bold">/></span></span>
  8. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><group</span> <span style="color:#000066">idMso</span>=<span style="color:#ff0000">"GroupInsertChartsExcel"</span><span style="color:#000000; font-weight:bold">/></span></span>
  9. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><group</span> <span style="color:#000066">idMso</span>=<span style="color:#ff0000">"GroupNumber"</span><span style="color:#000000; font-weight:bold">/></span></span>
  10. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></tab<span style="color:#000000; font-weight:bold">></span></span></span>
  11. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><tab</span> </span>
  12. <span style="color:#009900">     <span style="color:#000066">idMso</span>=<span style="color:#ff0000">"TabChartToolsDesign"</span> </span>
  13. <span style="color:#009900">     <span style="color:#000066">visible</span>=<span style="color:#ff0000">"false"</span> <span style="color:#000000; font-weight:bold">/></span></span>
  14. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><tab</span> </span>
  15. <span style="color:#009900">     <span style="color:#000066">idMso</span>=<span style="color:#ff0000">"TabChartToolsLayout"</span> </span>
  16. <span style="color:#009900">     <span style="color:#000066">visible</span>=<span style="color:#ff0000">"false"</span> <span style="color:#000000; font-weight:bold">/></span></span>
  17. <span style="color:#009900"><span style="color:#000000; font-weight:bold"><tab</span> </span>
  18. <span style="color:#009900">     <span style="color:#000066">idMso</span>=<span style="color:#ff0000">"TabChartToolsFormat"</span> </span>
  19. <span style="color:#009900">     <span style="color:#000066">visible</span>=<span style="color:#ff0000">"false"</span> <span style="color:#000000; font-weight:bold">/></span></span>
  20. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></tabSet<span style="color:#000000; font-weight:bold">></span></span></span>
  21. <span style="color:#009900"><span style="color:#000000; font-weight:bold"></contextualTabs<span style="color:#000000; font-weight:bold">></span></span></span>

修改后的图表工具选项卡如下图所示。仅当选择图表时才出现。

处理上下文弹出菜单
当在某对象上右击或者在有弹出菜单的工作环境中右击时,会出现弹出菜单。与上下文选项卡相似,弹出菜单显示与活动对象相关的选项。
弹出菜单的设置基于VBA,不需要XML代码,它们仍然基于命令栏对象。大多数弹出菜单都能够被定制,然而基于新的OfficeArt不能够被定制。下图显示了Excel中内置弹出菜单的示例。

上图显示的弹出菜单称为“Cell”,索引值等于36。
不能够定制“Mini工具栏”,然而可以在应用程序选项中控制其是否显现。
完全取代内置的弹出菜单
当在Excel工作表单元格中右击时,将得到单元格弹出菜单,如上图所示。然而,可能有一个区域需要合适的自定义弹出菜单,如下图所示。

在编写代码前,让我们先看看该自定义的弹出菜单需要做什么:

  • 必须在单元格弹出菜单的位置显示。
  • 必须仅显示在预先确定的区域。本例中为单元格区域A1:O32。

首先,添加下面的代码到想要取代内置单元格弹出菜单的工作表代码模块中:

  1. <span style="color:#000080">Private</span> <span style="color:#000080">Sub</span> Worksheet_BeforeRightClick(<span style="color:#000080">ByVal</span> Target <span style="color:#000080">As</span> Excel.Range, _
  2. Cancel <span style="color:#000080">As</span> <span style="color:#000080">Boolean</span>)
  3. <span style="color:#000080">If</span> Union(Target.Range(<span style="color:#800000">"A1"</span>), Range(<span style="color:#800000">"A1:O32"</span>)).Address = _
  4. Range(<span style="color:#800000">"A1:O32"</span>).Address <span style="color:#000080">Then</span>
  5. CommandBars(MYPOPUP).ShowPopup
  6. Cancel = <span style="color:#000080">True</span>
  7. <span style="color:#000080">End</span> <span style="color:#000080">If</span>
  8. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>

下一步,需要在工作簿代码窗口添加两个过程。一个过程指工作簿的Open事件,用来创建弹出菜单;另一个过程指工作簿的Close事件,用来删除弹出菜单。

  1. <span style="color:#000080">Private</span> <span style="color:#000080">Sub</span> Workbook_Open()
  2. <span style="color:#000080">Call</span> mnuPopup
  3. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>
  4. <span style="color:#000080">Private</span> <span style="color:#000080">Sub</span> Workbook_BeforeClose(Cancel <span style="color:#000080">As</span> <span style="color:#000080">Boolean</span>)
  5. <span style="color:#000080">Call</span> delPopup
  6. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>

然后,在标准模块中包含产生弹出菜单以及删除该菜单的代码,即编写mnuPopup过程和delPopup过程,通过声明公共常量MYPOPUP开始,以便在工程中的其它过程中可用:

  1. <span style="color:#000080">Public</span> <span style="color:#000080">Const</span> MYPOPUP <span style="color:#000080">As</span> <span style="color:#000080">String</span> = <span style="color:#800000">"MY POPUP"</span>
  2. <span style="color:#000080">Sub</span> mnuPopup()
  3. <span style="color:#000080">Dim</span> cmdBar <span style="color:#000080">As</span> CommandBar
  4. <span style="color:#000080">Dim</span> mnu <span style="color:#000080">As</span> CommandBarButton
  5. delPopup
  6. <span style="color:#000080">Set</span> cmdBar = CommandBars.Add _
  7. (Name:=MYPOPUP, Position:=msoBarPopup, Temporary:=<span style="color:#000080">True</span>)
  8. <span style="color:#000080">Set</span> mnu = cmdBar.Controls.Add(<span style="color:#000080">Type</span>:=msoControlButton)
  9. <span style="color:#000080">With</span> mnu
  10. .Caption = <span style="color:#800000">"Bold"</span>
  11. .OnAction = <span style="color:#800000">"bold"</span>
  12. .FaceId = 113
  13. <span style="color:#000080">End</span> <span style="color:#000080">With</span>
  14. <span style="color:#000080">Set</span> mnu = cmdBar.Controls.Add(<span style="color:#000080">Type</span>:=msoControlButton)
  15. <span style="color:#000080">With</span> mnu
  16. .Caption = <span style="color:#800000">"Italics"</span>
  17. .OnAction = <span style="color:#800000">"italics"</span>
  18. .FaceId = 114
  19. <span style="color:#000080">End</span> <span style="color:#000080">With</span>
  20. <span style="color:#000080">Set</span> mnu = cmdBar.Controls.Add(<span style="color:#000080">Type</span>:=msoControlButton)
  21. <span style="color:#000080">With</span> mnu
  22. .Caption = <span style="color:#800000">"Underline"</span>
  23. .OnAction = <span style="color:#800000">"underline"</span>
  24. .FaceId = 115
  25. <span style="color:#000080">End</span> <span style="color:#000080">With</span>
  26. <span style="color:#000080">Set</span> mnu = cmdBar.Controls.Add(<span style="color:#000080">Type</span>:=msoControlButton)
  27. <span style="color:#000080">With</span> mnu
  28. .Caption = <span style="color:#800000">"&About..."</span>
  29. .OnAction = <span style="color:#800000">"about"</span>
  30. .FaceId = 326
  31. .BeginGroup = <span style="color:#000080">True</span>
  32. <span style="color:#000080">End</span> <span style="color:#000080">With</span>
  33. <span style="color:#000080">Set</span> mnu = cmdBar.Controls.Add(<span style="color:#000080">Type</span>:=msoControlButton)
  34. <span style="color:#000080">With</span> mnu
  35. .Caption = <span style="color:#800000">"&Help"</span>
  36. .OnAction = <span style="color:#800000">"help"</span>
  37. .FaceId = 984
  38. .BeginGroup = <span style="color:#000080">True</span>
  39. <span style="color:#000080">End</span> <span style="color:#000080">With</span>
  40. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>
  41. <span style="color:#000080">Sub</span> delPopup()
  42. <span style="color:#000080">On</span> <span style="color:#000080">Error</span> <span style="color:#000080">Resume</span> <span style="color:#000080">Next</span>
  43. CommandBars(MYPOPUP).Delete
  44. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>

当打开工作簿时,执行第一个过程;当关闭工作簿时,执行第二个过程。
最后,添加弹出菜单中按钮的功能,代码如下:

  1. <span style="color:#000080">Sub</span> bold()
  2. Selection.Font.bold = <span style="color:#000080">Not</span> Selection.Font.bold
  3. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>
  4. <span style="color:#000080">Sub</span> italics()
  5. Selection.Font.Italic = <span style="color:#000080">Not</span> Selection.Font.Italic
  6. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>
  7. <span style="color:#000080">Sub</span> underline()
  8. <span style="color:#000080">If</span> Selection.Font.underline = xlUnderlineStyleSingle <span style="color:#000080">Then</span>
  9. Selection.Font.underline = xlUnderlineStyleNone
  10. <span style="color:#000080">Else</span>
  11. Selection.Font.underline = xlUnderlineStyleSingle
  12. <span style="color:#000080">End</span> <span style="color:#000080">If</span>
  13. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>

在弹出菜单中添加单独的项目
自定义内置弹出菜单的另一种有用的方式是添加新功能。如下图所示,我们在工作表标签右击后出现的弹出菜单中添加新的功能,只需单击该功能应能按字母顺序对工作表排序。

在标准模块中输入下面的代码:

  1. <span style="color:#000080">Sub</span> addButton()
  2. <span style="color:#000080">Dim</span> cmdbar <span style="color:#000080">As</span> CommandBar
  3. <span style="color:#000080">Dim</span> btn <span style="color:#000080">As</span> CommandBarButton
  4. resetPopup
  5. <span style="color:#000080">On</span> <span style="color:#000080">Error</span> <span style="color:#000080">GoTo</span> Err_Handler
  6. <span style="color:#000080">Set</span> cmdbar = Application.CommandBars(<span style="color:#800000">"Ply"</span>)
  7. <span style="color:#000080">Set</span> btn = cmdbar.Controls.Add(<span style="color:#000080">Type</span>:=msoControlButton, Before:=1)
  8. <span style="color:#000080">With</span> btn
  9. .Style = msoButtonIconAndCaption
  10. .Caption = <span style="color:#800000">"Order sheet tabs"</span>
  11. .FaceId = 210
  12. .OnAction = <span style="color:#800000">"orderTabs"</span>
  13. <span style="color:#000080">End</span> <span style="color:#000080">With</span>
  14. <span style="color:#000080">Exit</span> <span style="color:#000080">Sub</span>
  15. Err_Handler:
  16. MsgBox Err.Description, vbCritical, Err.Number
  17. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>

与上例一样,如果想在打开工作簿时自动实现该功能,则在工作簿的打开事件中添加调用该过程,此外,在工作簿的关闭事件中添加调用恢复原菜单的功能。恢复菜单的代码如下:

  1. <span style="color:#000080">Sub</span> resetPopup()
  2. Application.CommandBars(<span style="color:#800000">"Ply"</span>).Reset
  3. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>

下面,编写代码实现当单击添加的按钮时所实现的功能:

  1. <span style="color:#000080">Sub</span> orderTabs()
  2. <span style="color:#000080">Dim</span> i <span style="color:#000080">As</span> <span style="color:#000080">Long</span>
  3. <span style="color:#000080">Dim</span> j <span style="color:#000080">As</span> <span style="color:#000080">Long</span>
  4. <span style="color:#000080">Dim</span> n <span style="color:#000080">As</span> <span style="color:#000080">Long</span>
  5. n = ActiveWorkbook.Sheets.Count
  6. <span style="color:#000080">If</span> n = 1 <span style="color:#000080">Then</span>
  7. MsgBox <span style="color:#800000">"这个工作簿中仅有一个工作表!"</span>, _
  8. vbInformation
  9. <span style="color:#000080">Exit</span> <span style="color:#000080">Sub</span>
  10. <span style="color:#000080">End</span> <span style="color:#000080">If</span>
  11. <span style="color:#000080">For</span> i = 1 <span style="color:#000080">To</span> n - 1
  12. <span style="color:#000080">For</span> j = i + 1 <span style="color:#000080">To</span> n
  13. <span style="color:#000080">If</span> Sheets(j).Name < Sheets(i).Name <span style="color:#000080">Then</span>
  14. Sheets(j).Move Before:=Sheets(i)
  15. <span style="color:#000080">End</span> <span style="color:#000080">If</span>
  16. <span style="color:#000080">Next</span>
  17. <span style="color:#000080">Next</span>
  18. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>

使用多种语言的UI
本例的目的是让用户能够选择他们喜欢的语言。示例中将提供两种语言,下图显示了我们将在Excel中创建的示例。

实现上述目的需要完成四项任务:

  • 每个控件的标签必须在运行时修改,因此使用getLabel属性。
  • 因为这是在所有控件中共享的属性,所以我们使用一个共享的回调来处理变化。这也避免了许多代码量。
  • 使用工作表保持控件的名字和翻译。可以隐藏该工作表,以便用户不容易访问它。
  • 使用VLookup函数搜索列表中的控件,返回标签值。

控件名和翻译是实现该解决方案的关键元素,一个工作表示例如下图所示。

可以为包含翻译的区域定义动态区域,也可以将区域转换为表,但是在里只是提供一个示例,所以使用固定区域。下面开始编写VBA代码。
首先,定义一些需要使用的变量。在标准模块声明部分声明下列全局变量:

  1. <span style="color:#000080">Public</span> grxIRibbonUI <span style="color:#000080">As</span> IRibbonUI
  2. <span style="color:#000080">Public</span> giColControls <span style="color:#000080">As</span> <span style="color:#000080">Integer</span>
  3. <span style="color:#000080">Public</span> gWS <span style="color:#000080">As</span> Worksheet

第一个变量是Ribbon对象,第二个变量指向语言版本所在的列;第三个变量指向包含翻译的工作表对象。
接着,使用onLoad事件设置这些变量以便后面使用:

  1. <span style="color:#000080">Sub</span> rxIRibbonUI_onLoad(ribbon <span style="color:#000080">As</span> IRibbonUI)
  2. <span style="color:#000080">Set</span> grxIRibbonUI = ribbon
  3. giColControls = 2
  4. <span style="color:#000080">Set</span> gWS = ThisWorkbook.Sheets(<span style="color:#800000">"Languages"</span>)
  5. Application.SendKeys <span style="color:#800000">"%UN{RETURN}"</span>
  6. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>

这段代码执行下列任务:

  • 设置ribbon对象
  • 决定翻译位于的初始列
  • 设置包含翻译的工作表
  • 向应用程序发送快捷键Alt+UN,以便当打开该工作簿时选择自定义选项卡

当打开文档时将装载初始标签,因此需要处理共享的getLabel回调,代码如下:

  1. <span style="color:#000080">Sub</span> rxshared_getLabel(<span style="color:#000080">control</span> <span style="color:#000080">As</span> IRibbonControl, <span style="color:#000080">ByRef</span> returnedVal)
  2. <span style="color:#000080">On</span> <span style="color:#000080">Error</span> <span style="color:#000080">Resume</span> <span style="color:#000080">Next</span>
  3. returnedVal = Application.WorksheetFunction.VLookup( _
  4. <span style="color:#000080">control</span>.ID, gWS.Range(<span style="color:#800000">"A1:C200"</span>), giColControls, 0)
  5. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>

当用户从UI的splitButton/menu中选择不同语言时调用代码。当用户单击所选择的语言命令时,需要使功能区无效以便重新装载值到UI中,代码如下:

  1. <span style="color:#000080">Sub</span> rxbtnshared_Click(<span style="color:#000080">control</span> <span style="color:#000080">As</span> IRibbonControl)
  2. <span style="color:#000080">Select</span> <span style="color:#000080">Case</span> <span style="color:#000080">control</span>.ID
  3. <span style="color:#000080">Case</span> <span style="color:#800000">"rxbtnSpanish"</span>
  4. giColControls = 3
  5. <span style="color:#000080">Case</span> <span style="color:#800000">"rxbtnEnglish"</span>
  6. giColControls = 2
  7. <span style="color:#000080">End</span> <span style="color:#000080">Select</span>
  8. grxIRibbonUI.Invalidate
  9. <span style="color:#000080">End</span> <span style="color:#000080">Sub</span>

使用Select语句选择两种可用的语言。如果选择的是Spanish,查找的列被设置为3;如果选择English,该列被设置为2(缺省值)。

动态加载Ribbon功能区的更多相关文章

  1. Excel催化剂开源第7波-VSTO开发中Ribbon动态加载菜单

    在VS开发环境中,特别是VSTO的开发,微软已经现成地给开发者准备了设计器模式的功能区开发,相对传统的VBA.ExcelDna和其他方式的COM加载项开发来说,不需要手写xml功能区,直接类似拖拉窗体 ...

  2. c# 创建Excel com加载项Ribbon动态加载工作簿和工作表

    使用 VSTO 创建外接程序,Gallery控件动态加载工作簿名称 代码如下: 加载工作簿名称: private void Gallery1_ItemsLoading(object sender, R ...

  3. js动态加载css和js

    之前写了一个工具类点此链接里面含有这段代码,感觉用处挺多,特意提出来 var loadUtil = { /* * 方法说明:[动态加载js文件css文件] * 使用方法:loadUtil.loadjs ...

  4. geotrellis使用(二十三)动态加载时间序列数据

    目录 前言 实现方法 总结 一.前言        今天要介绍的绝对是华丽的干货.比如我们从互联网上下载到了一系列(每天或者月平均等)的MODIS数据,我们怎么能够对比同一区域不同时间的数据情况,采用 ...

  5. Ext JS 如何动态加载JavaScript创建窗体

    JavaScript不需要编译即可运行,这让JavaScript构建的应用程序可以变得很灵活.我们可以根据需要动态从服务器加载JavaScript脚本来创建和控制UI来与用户交互.下面结合Ext JS ...

  6. Ext动态加载Toolbar

    在使用Ext的GridPanel时候,有时候需要面板不用重新加载而去更新Store或者Toolbar,Store的方法有很多,例如官方api给我们提供的Store.load(),Store.reLoa ...

  7. Android动态加载框架汇总

    几种动态加载的比较 1.Tinker 用途:热修复 GitHub地址:https://github.com/Tencent/tinker/ 使用:http://www.jianshu.com/p/f6 ...

  8. 为不同分辨率单独做样式文件,在页面头部用js判断分辨率后动态加载定义好的样式文件

    为不同分辨率单独做样式文件,在页面头部用js判断分辨率后动态加载定义好的样式文件.样式文件命名格式如:forms[_屏幕宽度].css,样式文件中只需重新定义文本框和下拉框的宽度即可. 在包含的头文件 ...

  9. html中的图像动态加载问题

    首先要说明下文档加载完成是什么概念 一个页面http请求访问时,浏览器会将它的html文件内容请求到本地解析,从窗口打开时开始解析这个document,页面初始的html结构和里面的文字等内容加载完成 ...

随机推荐

  1. js实现的对象数组根据对象的键值进行排序代码

    有时候会遇到做展示数组的排序,由大到小和由小到大的切换: var arr=[{id:1,webName:"蚂蚁部落"},{id:2,webName:"网易"}] ...

  2. T4模板试水篇1_入门

    T4模板作为VS自带的一套代码生成器,功能有多强大我也不知道,最近查找了一些资料学习一下,做个笔记 更详细的资料参见: MSDN: http://msdn.microsoft.com/zh-cn/li ...

  3. $.getJson()和$.ajax()同步处理

    一.前言 为什么需要用到同步,因为有时候我们给一个提交按钮注册提交表单数据的时候,在提交动作之前会进行一系列的异步ajax请求操作,但是页面js代码会按顺序从上往下面执行,如果你在这过程中进行了异步操 ...

  4. Js之Navigator对象

    Window对象的navigator属性引用的是包含浏览器厂商和版本信息的Navigator对象.Navigator对象的命名是为了纪念Netscape之后NavigatorBU览器译注2,不过所有其 ...

  5. MySql存储引擎介绍

    MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表.若要修改默认引擎,可以修改配置文件中的default-storage-engin ...

  6. CSS3动画之透视

    若在x,y轴rotate90度,其实是线,不显示,按近大远小的透视关系可用 perspective:数值 开启透视: 默认以中间线为旋转基线,可以用transform-origin来设置旋转基线 在z ...

  7. ajax + php + Controller 控制所有后台函数调用

    转载请注明出处:http://www.cnblogs.com/ghypnus/p/4645873.html 好久没有来这边发布代码了 总共分成3大部分来完成php的ajax调用逻辑,以下是大致的结构 ...

  8. PAT 1059. Prime Factors (25) 质因子分解

    题目链接 http://www.patest.cn/contests/pat-a-practise/1059 Given any positive integer N, you are suppose ...

  9. SQL Server 无法打开物理文件的 2 种解决办法

    解决方法: 方法1.无法打开可以能是没有权限.如果是这样以管理员身份运行Managerment Studio就可以了. 方法2.找到指定的数据库文件.右键属性-->安全-->勾上  ‘完全 ...

  10. hdu Hat's Fibonacci

    import java.math.BigInteger; import java.util.*; public class Main { public static void main(String ...