checkBox控件能够使用户在两种状态之间切换。虽然默认情况下状态是真和假,但是该元素能够指明开/关、上/下、左/右、1/0、或者任何可以想象到的相对状态组合。
您可能想使用checkBox来做下列操作:
² 表明数据库中的某字段是否满足特定的条件。在这种情况下,当满足条件时,将自动选中复选框。
² 允许用户确定是否显示某对象,例如显示或隐藏网格线,或者子窗体。
1、checkBox元素必需的属性
复选框控件需要下表1所列的id属性之一。
表1:checkBox元素必需的属性
属性 |
何时使用 |
id |
当创建自已的复选框时 |
idMso |
当使用现有的Microsoft复选框时 |
idQ |
当在命名空间之间创建共享的复选框时 |
每个复选框控件也需要表2所列出的onAction回调。
表2:checkBox元素必需的回调
动态属性 |
允许值 |
VBA回调签名 |
onAction |
1至4096个字符 |
Sub OnAction(control As IRibbonControl, pressed as Boolean) |
2、带有回调签名的可选的静态属性和动态属性
复选框控件可以使用下表3列出的任一insert属性。
表3:checkBox元素可选的insert属性
INSERT属性 |
允许值 |
默认值 |
何时使用 |
insertAfterMso |
有效的Mso组 |
在组末尾插入 |
在Microsoft控件之后插入 |
insertBeforeMso |
有效的Mso组 |
在组末尾插入 |
在Microsoft控件之前插入 |
insertAfterQ |
有效的组idQ |
在组末尾插入 |
在共享的命名空间控件之后插入 |
insertBeforeQ |
有效的组idQ |
在组末尾插入 |
在共享的命名空间控件之前插入 |
也可以提供下表4所列的任何或所有的属性。
表4:checkBox元素可选的属性和回调
静态属性 |
动态属性 |
允许值 |
默认值 |
动态属性的VBA回调签名 |
description |
getDescription |
1至4096个字符 |
(none) |
Sub GetDescription(control As IRibbonControl,ByRef returnedVal) |
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) |
label |
getLabel |
1至1024个字符 |
(none) |
Sub GetLabel(control As IRibbonControl, ByRef returnedVal) |
(none) |
getPressed |
true,false,1,0 |
false |
Sub GetPressed(control As IRibbonControl, ByRef returnedVal) |
screentip |
getScreentip |
1至1024个字符 |
(none) |
Sub GetScreentip(control As IRibbonControl, ByRef returnedVal) |
supertip |
getSupertip |
1至1024个字符 |
(none) |
Sub GetSupertip(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、checkBox元素允许的子对象
checkBox控件不支持任何子对象。
4、checkBox元素的父对象
在下列任何控件内都能放置checkBox控件:
Ø box
Ø dynamicMenu
Ø group
Ø menu
Ø officeMenu
5、使用内置的复选框控件
(1)创建一个新的.xlsx文件,并将其保存为Excel Built In CheckBox 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 Group“>
<checkBox idMso=“GridlinesExcel“/>
group>
tab>
tabs>
ribbon>
customUI>
下图为上述代码创建的组:
您也可以修改该控件的名字,使用下面的XML代替相应的语句:
<checkBox idMso=“GridlinesExcel“
label=“Toggle Gridlines“/>
此时,显示的界面如下图所示:
6、创建自定义复选框控件
使用Excel时,便利的事情之一是迅速在工作簿中切换A1和R1C1样式公式的能力。在一些情形下,使用R1C1引用的公式将更好。下面的示例演示如何容易地快速切换两种引用形式的公式。
本示例在“公式”选项卡中添加一个控件,省去了必须通过Office菜单来找到该设置的复选框的麻烦。如下图所示,添加的新复选框控件在最右侧的“Other Settings”组中。
首先,新建一个工作簿,保存后关闭。然后使用CustomUI Editor输入下列XML代码:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“ onLoad=“rxIRibbonUI_onLoad“>
<ribbon startFromScratch=“false“>
<tabs>
<tab idMso=“TabFormulas“>
<group id=“rxgrpOtherSettings“
label=“Other Setting“
insertBeforeMso=“GroupNamedCells“>
<checkBox id=“rxchkR1C1“
label=“R1C1 Formulas“
getPressed=“rxchkR1C1_getPressed“
onAction=“rxchkR1C1_click“/>
group>
tab>
tabs>
ribbon>
customUI>
注意,在XML代码的第一行,添加了onLoad属性,以便后面使用时捕获Ribbon对象。
单击“Generate Callbacks”按钮,复制生成的代码。关闭CustomUI Editor。重新打开Excel文件,并打开VBE,将复制的代码粘贴到标准模块中。
现在,该文件中有三个回调签名:rxIRibbonUI_onLoad,rxchkR1C1_getPressed,rxchkR1C1_click,其目的是:
Ø rxIRibbonUI_onLoad存储RibbonUI对象,能够使控件无效以便随后强制更新控件。
Ø 当第一次激活“公式”选项卡(或使无效)并适当地设置复选框时触发rxchkR1C1_getPressed。
Ø 无论何时选中或取消选中复选框都将触发rxchkR1C1_click,其目的实际上是切换开关设置。
此外,rxIRibbonUI_onLoad需要自定义工作簿属性来操作,因此应该首先对其设置。在该工程的ThisWorkbook模块中,输入下列代码:
‘保存功能区和功能区控件状态的私有变量
Private pRibbonUI As IRibbonUI
Public Property Let RibbonUI(iRib As IRibbonUI)
‘设置RibbonUI属性以便后面使用
Set pRibbonUI = iRib
End Property
Public Property Get RibbonUI() As IRibbonUI
‘获取RibbonUI属性以供使用
Set RibbonUI = pRibbonUI
End Property
转到标准模块中,添加下列代码:
‘customUI.onLoad回调
Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
‘设置RibbonUI为工作簿属性以供后面使用
ThisWorkbook.RibbonUI = ribbon
End Sub
此时,当装载该工作簿时,将捕获RibbonUI对象,并将可用于使之无效。
接下来,生成切换设置的宏。最容易的方法是先录制实现该功能的宏:打开宏录制器,选择“Office菜单—Excel选项—公式”,选中“R1C1引用样式”前的复选框。停止录制,转到VBE中查看录制的代码:
Application.ReferenceStyle = xlR1C1
这就是宏录制器能够帮助编写代码的一种情形,告诉确切地告诉你需要引用的对象。虽然仍需要对代码作一些修改,但至少知道从哪里开始以及正确的语法。
再在处理getPressed回调。主要是确定应用程序是否是R1C1模式,如果是则返回true。代码如下:
‘rxchkR1C1 getPressed回调
Sub rxchkR1C1_getPressed(control As IRibbonControl, ByRef returnedVal)
If Application.ReferenceStyle = xlR1C1 Then returnedVal = True
End Sub
下一步,处理单击复选框的回调。pressed参数告诉是否复选框被选中(pressed=true)或没有选中(pressed=false)。代码如下:
‘rxchkR1C1 onAction回调
Sub rxchkR1C1_click(control As IRibbonControl, pressed As Boolean)
Select Case pressed
Case True
Application.ReferenceStyle = xlR1C1
Case False
Application.ReferenceStyle = xlA1
End Select
End Sub
如果单击“公式”选项卡,将触发getPressed程序,设置复选框来表明当前所处的显示模式。否则,选择复选框来设置其为相反的状态。
但仍存在问题。假设有人通过“Excel选项”修改了复选框的值,此时选项卡中的复选框将不会被更新。
为解决这个问题,可以在无论何时激活新工作表时,强制更新该复选框。此时,使用使特定的控件(即rxchkR1C1 checkBox)无效的能力。
再转到ThisWorkbook代码模块,从代码窗口左侧下拉列表中选择Workbook,然后从右侧下拉列表中选择Sheet_Activate,添加代码如下:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
‘每次激活一个工作表时使该选项卡无效
ThisWorkbook.RibbonUI.InvalidateControl (”rxchkR1C1″)
End Sub
好了!保存并关闭后重新打开工作簿,然后输入公式来测试。
当然,在通过“Excel选项”设置R1C1引用样式后不会立即更新,您需要激活另一工作表后再返回该工作表,即可更新了。