一个RibbonX示例
本节包含了另一个使用RibbonX修改UI的示例。这个工作簿将在“页面布局”选项卡中创建一个新的组,并添加一个复选框控件,用于切换分页符的显示。
注:虽然Excel有大约1700个命令,但没有切换分页符显示的命令。在打印或预览一个工作表之后,隐藏分页符的唯一方式是使用Excel选项对话框。因此,本示例也有一些实用价值。
本示例有一点技巧,因为需要使新的Ribbon控件与活动工作表同步。例如,如果激活一个没有显示分页符的工作表,则复选框控件应该处于未选中状态;如果激活的工作表显示分页符,则该控件应该被选中。而且,分页符应该与图表工作表不相关,因此如果激活图表工作表,则该控件应该被禁用。
1、RibbonX代码
下面的RibbonX代码添加一个新组(带复选框控件)到“页面布局”选项卡中:
<customUI
xmlns=”http://schemas.microsoft.com/office/2006/01/customui“
onLoad=”Initialize”>
<ribbon>
<tabs>
<tab idMso=”TabPageLayoutExcel”>
<group id=”Group1″ label=”Custom”>
<checkBox id=”Checkbox1″
label=”Page Breaks”
onAction=”TogglePageBreakDisplay”
getPressed=”GetPressed”
getEnabled=”GetEnabled”/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
这段RibbonX代码引用了四个VBA回调过程:
- Initialize:工作簿打开时执行。
- TogglePageBreakDisplay:用户单击复选框控件时执行。
- GetPressed:该控件无效时执行(用户激活了一个不同的工作表)。
- GetEnabled: 该控件无效时执行(用户激活了一个不同的工作表)。
图1:该复选框控件总是与活动工作表的分页符显示同步
2、VBA代码
CustomUI标记包含一个参数onLoad,指定了Initialize VBA的回调过程,如下:
Public MyRibbon As IRibbonUI
Sub Initialize(Ribbon As IRibbonUI)
‘ 工作簿装载时执行
Set MyRibbon = Ribbon
End Sub
这个Initialize过程创建一个名为MyRibbon的IRibbonUI对象。注意,MyRibbon是一个Public变量,因此也可以在该模块中的其它过程里访问该变量。
创建一个简单的事件过程,无论何时激活某工作表都将执行该过程。该过程位于ThisWorkbook代码模块中,名为CheckPageBreakDisplay:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Call CheckPageBreakDisplay
End Sub
CheckPageBreakDisplay过程使该复选框控件无效。换句话说,它销毁了与该控件相关的任何数据。
Sub CheckPageBreakDisplay()
‘ 当激活工作表时执行
MyRibbon.InvalidateControl (”Checkbox1″)
End Sub
当某控件无效时,调用GetPressed和GetEnabled过程。
Sub GetPressed(control As IRibbonControl, ByRef returnedVal)
‘ 该控件是无效时执行
On Error Resume Next
returnedVal = ActiveSheet.DisplayPageBreaks
End Sub
Sub GetEnabled(control As IRibbonControl, ByRef returnedVal)
‘ 该控件无效时执行
returnedVal = TypeName(ActiveSheet) = “Worksheet”
End Sub
注意,参数returnedVal按ByRef传递,这意味着代码可以改变该值,并且确实会发生。在GetPressed过程中,设置returnedVal变量为活动工作表的DisplayPageBreaks属性的状态。结果是,如果显示分页符(选中该控件),则该控件的Pressed参数为True。否则,该控件没有被选中。
在GetEnabled过程中,如果当前工作表是工作表(不是图表工作表),变量returnedVal被设置为True。因此,该控件仅当活动工作表是工作表时启用。
仅有的VBA过程是onAction过程,TogglePageBreakDisplay,在用户选中或取消选中该复选框时执行:
Sub TogglePageBreakDisplay(control As IRibbonControl, pressed As Boolean)
‘ 当单击该复选框时执行
On Error Resume Next
ActiveSheet.DisplayPageBreaks = pressed
End Sub
如果用户选中了该复选框,则参数pressed为True,反之如果没有选中该复选框则为False。该代码也相应地设置DisplayPageBreaks属性。
