组合框控件基于指定的记录源显示数据,它是编辑框和下拉控件的组合。该控件最明显的特征之一是:不仅能够从列表中选取项目,而且能够在其中输入项目。
comboBox控件常用于下列情形:
n 列表非常长,希望用户在输入一些关键词后能够迅速跳到合适的地方。(例如fonts控件)
n 希望呈现给用户一个预定义列表,同时也希望能够在列表中添加项目。
可以使用静态列表或动态创建列表来填充组合框。
1、comboBox元素必需的属性
组合框控件需要下表1所列的id属性之一。
表1:comboBox元素必需的属性
属性
何时使用
id
当创建自已的组合框时
idMso
当使用现有的Microsoft组合框时
idQ
当在命名空间之间创建共享的组合框时
2、带有回调签名的可选的静态属性和动态属性
组合框控件可以使用下表2列出的任一insert属性。
表2:comboBox元素可选的insert属性
INSERT属性
允许值
默认值
何时使用
insertAfterMso
有效的Mso组
在组末尾插入
在Microsoft控件之后插入
insertBeforeMso
有效的Mso组
在组末尾插入
在Microsoft控件之前插入
insertAfterQ
有效的组idQ
在组末尾插入
在共享的命名空间控件之后插入
insertBeforeQ
有效的组idQ
在组末尾插入
在共享的命名空间控件之前插入
也可以为组合框设置下表3所列的任何或所有的属性或回调。
表3:comboBox元素可选的属性和回调
静态属性
动态属性
允许值
默认值
动态属性的VBA回调签名
(none)
onChange
1至4096个字符
(none)
Sub OnChange(control
As IRibbonControl,
text As String)
enabled
getEnabled
true,false,1,0
true
Sub GetEnabled(control As
IRibbonControl,
ByRef returnedVal)
image
getImage
1至1024个字符
(none)
Sub GetImage(control As
IRibbonControl,
ByRef returnedVal)
imageMso
getImage
1至1024个字符
(none)
同上
(none)
getItemCount
1至1024个字符
(none)
Sub GetItemCount(control As
IRibbonControl,
ByRef returnedVal)
(none)
getItemID
1至1024个字符
(none)
Sub GetItemID(control As
IRibbonControl,
index As Integer,
ByRef id)
(none)
getItemImage
独立的文本字符串
(none)
Sub GetItemImage(control As
IRibbonControl,
index As Integer,
ByRef returnedVal)
(none)
getItemLabel
1至1024个字符
(none)
Sub GetItemLabel(control As IRibbonControl,
index As Integer,
ByRef returnedVal)
(none)
getItemScreentip
1至1024个字符
(none)
Sub GetItemScreenTip(control As IRibbonControl,
index As Integer,
ByRef returnedVal)
(none)
getItemSupertip
1至1024个字符
(none)
Sub GetItemSuperTip(control As IRibbonControl,
index As Integer,
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)
maxLength
(none)
1至1024个字符
1024
(none)
screentip
getScreentip
1至1024个字符
(none)
Sub GetScreentip(control As IRibbonControl,
ByRef returnedVal)
showImage
getShowImage
true,false,1,0
true
Sub GetShowImage(control As IRibbonControl,
ByRef returnedVal)
showItemAttribute
(none)
true,false,1,0
true
(none)
showItemImage
(none)
true,false,1,0
true
(none)
showLabel
getShowLabel
true,false
true
Sub GetShowLabel(control As
IRibbonControl,
ByRef returnedVal)
sizeString
(none)
1至1024个字符
12
(none)
supertip
getSupertip
1至1024个字符
(none)
Sub GetSupertip(control
As IRibbonControl,
ByRef returnedVal)
tag
(none)
1至1024个字符
(none)
(none)
(none)
getText
1至4096个字符
(none)
Sub GetText(control As
IRibbonControl,
ByRef returnedVal)
visible
getVisible
true,false,1,0
true
Sub GetVisible(control
As
IRibbonControl,
ByRef returnedVal)
3、comboBox元素允许的子对象
comboBox元素可以使用的唯一的子对象是item元素。
4、comboBox元素的父对象
在下列任何控件内都能放置comboBox控件:
n box
n group
5、使用内置的组合框控件
在Excel的所有控件中,最著名的可能是字体组合框。如果创建组合最常使用的控件的自定义选项卡,那么将会添加字体组合框控件。
(1)创建一个新的.xlsx文件,并将其保存为Excel Built In comboBox 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“>
<comboBox idMso=“Font“/>
<comboBox idMso=“FontSize“/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
下图为上述代码创建的组。
6、创建自定义组合框控件
本例中,假设您已经隐藏了完整的用户界面。此外,也试图使应用程序看起来不太像Excel,因为隐藏了所有的工作表标签。然而,您仍然想用户能够在三个工作表之间移动,因此需要提供一些手段来实现这项操作。在许多情形下,组合框控件是能够用于这类导航的理想的控件:列出应用程序中所有的“页面”,允许用户输入其希望跳转到的页面。
(1)新建一个工作簿,以.xlsm为扩展名保存后关闭。
(2)在CustomUI Editor中打开该工作簿,并输入下列XML代码:
<customUI xmlns=“http://schemas.microsoft.com/office/2006/01/customui“>
<ribbon startFromScratch=“false“>
<tabs>
<tab id=“rxtabDemo“
label=“Navigation“
insertBeforeMso=“TabHome“>
<group id=“rxgrpNavigate“
label=“Navigate To“>
<comboBox id=“rxcboSelectSheet“
label=“Activate:“
onChange=“rxcboSelectSheet_Click“>
<item id=“rxitemcboSelectSheet1“
label=“Sheet1“/>
<item id=“rxitemcboSelectSheet2“
label=“Sheet2“/>
<item id=“rxitemcboSelectSheet3“
label=“Sheet3“/>
</comboBox>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
注意到该组合框利用onChange回调来产生当选择项目时的行为。此外,该组合框包含三个项目:Sheet1、Sheet2、Sheet3。这些项目是静态的并且不能从文件中修改,用户也不能添加其它项目,这确保了用户仅能在这三个工作表之间导航。
生成回调签名,并复制代码后关闭CustomUI Editor。
在Excel中打开该工作簿,打开VBE并将代码粘贴到一个标准模块中。下面编辑该回调以响应希望的操作。这时,可以通过考虑事件的顺序来解决如何实现:
(1)用户从工作表列表中选择一个项目。
(2)触发回调。
(3)将组合框中所选择的值(即工作表的名字)传递到程序。
(4)激活工作表。
然而,如果用户在组合框中输入值,会发生什么呢?要处理这些可能发生的事,应该编辑回调签名如下:
‘rxcboSelectSheet onChange回调
Sub rxcboSelectSheet_Click(control As IRibbonControl, text As String)
On Error Resume Next
Worksheets(text).Activate
If Err.Number <> 0 Then
MsgBox “对不起,不存在这个工作表!”
End If
End Sub
第2行代码试图激活传递给回调的名称的工作表。从列表中选择的项目总是有效的名字,而由用户输入的文本可能与列表中的项目不匹配。在开始部分的On Error语句告诉代码即使发生错误也继续运行下一行代码。
如果Err属性不为零,那么一定是发生了错误,因此用户输入的值是无效的。此外,因为希望让用户知道其输入是不可接受的,所以包括了一个消息框。
现在,就可以测试了:可以从组合框中选择一个值(如下图所示),也可以输入一个值。