咋看起来,splitButton实质上与menu元素相同。与使用菜单一样,当用户单击拆分按钮时,将执行一项命令或者显示额外选项的层级列表。
与菜单在不同的项目之间有线条分隔不一样,splitButton没有这样的格式属性。因此,splitButton通常将相似的命令组合在一起,而将不同的命令组织到逻辑组和子组中。
splitButton胜过menu之处是能够将toggleButton控件作为界面中显示的控件的能力(“脸”控件)。当然,也可以使用按钮控件作为splitButton控件的“脸”控件。
1、splitButton元素必需的属性
拆分按钮控件需要下表1所列的id属性之一。
表1:splitButton元素必需的属性
属性 |
何时使用 |
id |
当创建自已的拆分按钮时 |
idMso |
当使用现有的Microsoft拆分按钮时 |
idQ |
当在命名空间之间创建共享的拆分按钮时 |
2、带有回调签名的可选的静态属性和动态属性
拆分按钮控件可以使用下表2列出的任一insert属性。
表2:splitButton元素可选的insert属性
INSERT属性 |
允许值 |
默认值 |
何时使用 |
insertAfterMso |
有效的Mso组 |
在组末尾插入 |
在Microsoft控件之后插入 |
insertBeforeMso |
有效的Mso组 |
在组末尾插入 |
在Microsoft控件之前插入 |
insertAfterQ |
有效的组idQ |
在组末尾插入 |
在共享的命名空间控件之后插入 |
insertBeforeQ |
有效的组idQ |
在组末尾插入 |
在共享的命名空间控件之前插入 |
也可以为菜单控件设置下表3所列的任何静态属性或等价的动态属性。
表3:splitButton元素可选的属性和回调
静态属性 |
动态属性 |
允许值 |
默认值 |
动态属性的VBA回调签名 |
enabled |
getEnabled |
true,false,1,0 |
true |
Sub GetEnabled(control As IRibbonControl, ByRef returnedVal) |
keytip |
getKeytip |
1至3个字符 |
(none) |
Sub GetKeytip(control As IRibbonControl, ByRef returnedVal) |
showLabel |
getShowLabel |
true,false,1,0 |
true |
Sub GetShowLabel(control As IRibbonControl, ByRef returnedVal) |
tag |
(none) |
1至1024个字符 |
(none) |
(none) |
visible |
getVisible |
true,false,1,0 |
true |
Sub GetVisible(control As IRibbonControl, ByRef returnedVal) |
3、splitButton元素允许的子对象
splitButton元素必须包含一个按钮或一个切换按钮(作为该控件的外观),也可以是一个menu元素,但必须在按钮或切换按钮之后定义。
4、splitButton元素的父对象
在下列任何控件内都能放置splitButton控件:
n box
n buttonGroup
n dynamicMenu
n group
n menu
n officeMenu
5、使用内置的splitButton控件
(1)创建一个新的.xlsx文件,并将其保存为Excel Built In splitButton Example.xlsx。
(2)关闭该文件并在CustomUI Editor中打开。
(3)输入下列XML代码:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
<ribbon
startFromScratch=“false“>
<tabs>
<tab id=“rxtabDemo“
label=“Demo“
insertBeforeMso=“TabHome“>
<group id=“rxgrpDemo“
label=“Demo“>
<splitButton idMso=“FileSaveAsMenu“
size=“large“/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
下图为上述代码创建的组。
6、创建自定义splitButton控件
本例中,添加能够让我们在工作簿中插入新工作表的拆分按钮控件,而不是在工作表标签中右击,选择插入,然后选择工作表类型。即在插入选项卡中使用拆分按钮使用户插入一个新工作表。此外,因为插入工作表可能是一项频繁的任务,所以将新控件放置在功能区的开始。
(1)新建一个工作簿,以.xlsm为扩展名保存后关闭。
(2)在CustomUI Editor中打开该工作簿,并输入下列XML代码:
<customUI
xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
<ribbon
startFromScratch=“false“>
<tabs>
<!– Enter your first tab here –>
<tab idMso=“TabInsert“>
<group id=“rxgrpInsertSheet“
label=“Sheets“
insertBeforeMso=“GroupInsertTablesExcel“>
<splitButton id=“rxsbtnInsertSheet“
size=“large“>
<button id=“rxbtnSplitFace“
label=“Sheets“
imageMso=“CreateReportFromWizard“/>
<menu id=“mnuInsertSheet“>
<button id=“rxbtnWorksheet“
label=“Insert Worksheet“
imageMso=“GetExternalDataFromText“
onAction=“rxbtnInsertSheet_click“/>
<button id=“rxbtnChartsheet“
label=“Insert Chart Sheet“
imageMso=“PivotChartType“
onAction=“rxbtnInsertSheet_click“/>
</menu>
</splitButton>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
注意,splitButton包含一个没有onAction回调的按钮,该按钮的唯一目的是作为拆分按钮的外观图像(“脸”)。
此外,该按钮带有一个菜单,包含两个按钮:Insert Worksheet和Insert Chart Sheet,为方便起见,共享一个回调签名。
(3)生成回调签名,并复制代码后关闭CustomUI Editor。
(4)在Excel中打开该工作簿,打开VBE并将回调签名代码粘贴到一个标准模块中。下面编辑该回调以响应希望的操作。
‘rxbtnWorkSheet onAction回调
Sub rxbtnInsertSheet_click(control As IRibbonControl)
Select Case control.ID
Case Is = “rxbtnWorksheet”
ActiveWorkbook.Worksheets.Add
Case Is = “rxbtnChartsheet”
ActiveWorkbook.Charts.Add
End Select
End Sub
如代码所示,设置回调来立即查询已经触发的控件的ID。如果是rxbtnWorksheet控件,那么将插入新工作表;如果是rxbtnChartsheet控件,那么将插入新图表工作表。
现在,该工作簿的“插入”选项卡如下图。
下面,我们再看一个示例。该示例沿用细品RibbonX(27)中的菜单示例,看看menu与splitButton控件有什么不同。其XML代码如下:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
<ribbon startFromScratch=“false“>
<tabs>
<tab id=“rxtabDemo“
label=“Demo“
insertBeforeMso=“TabHome“>
<group id=“rxgrpViews“
label=“Document Views“>
<menu id=“rxmnuViewsMenu“
itemSize=“normal“
imageMso=“FilePrintPreview“
label=“Views Menu“
size=“large“>
<toggleButton idMso=“ViewPageBreakPreviewView“/>
<toggleButton idMso=“ViewFullScreenView“/>
<checkBox idMso=“ViewHeadings“/>
<checkBox idMso=“ViewFormulaBar“/>
<checkBox idMso=“GridlinesExcel“/>
</menu>
<splitButton id=“rxsbtnSplitVersion“
size=“large“
showLabel=“false“>
<button id=“rxbtnSplitVersionFace“
imageMso=“FilePrintPreview“
label=“Split Button Version“/>
<menu id=“rxmnuSplitVersionMenu“
itemSize=“normal“>
<toggleButton idMso=“ViewPageBreakPreviewView“/>
<toggleButton idMso=“ViewFullScreenView“/>
<checkBox idMso=“ViewHeadings“/>
<checkBox idMso=“ViewFormulaBar“/>
<checkBox idMso=“GridlinesExcel“/>
</menu>
</splitButton>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
上述XML代码使用splitButton元素创建了一个基本的菜单。然而,menu元素中的一些良好特征例如menuSeparator不可用于splitButton元素。
Excel中的自定义界面如下图:
能注意到它们之间的不同吗?在splitButton控件中有一条细的水平线将图像和文本分隔开,这条线在menu控件中不明显。