限制选中指定个数CheckBox控件(1/2)
实例需求:工作表中有8个CheckBox控件(下文中简称为控件),现在需要实现限制用户最多只能勾选4个控件。
Dim OnDic As Object
Sub CheckboxeEvent()
Dim oCB As CheckBox, OnCol As Collection
Dim oSht As Worksheet
Const MAX_CHECKED As Long = 4
Set OnCol = New Collection
Set oSht = Worksheets("Sheet1")
If OnDic Is Nothing Then
Set OnDic = CreateObject("scripting.dictionary")
For Each oCB In oSht.CheckBoxes
If oCB.Value = xlOn Then OnDic(oCB.Name) = ""
Next
End If
For Each oCB In oSht.CheckBoxes
If oCB.Value = xlOn Then OnCol.Add oCB
Next oCB
If OnCol.Count > MAX_CHECKED Then
For Each oCB In OnCol
If Not OnDic.exists(oCB.Name) Then
oCB.Value = xlOff
End If
Next
Else
OnDic.RemoveAll
For Each oCB In OnCol
OnDic(oCB.Name) = ""
Next
End If
End Sub
【代码解析】
第1行代码声明模块基本对象变量,用于保存已经选中的控件。
第5行代码设置最多选中4个控件。
第6行代码创建Collection对象实例。
第7行代码指定工作表对象。
如果首次运行此代码过程,OnDic
对象为空,则第9行代码创建字典对象,第10~12代码遍历工作表中的控件,如果用户已经勾选控件,第11行代码将控件名称保存在字典对象中。
第14~16代码遍历工作表中的控件,将当期已经选中的控件添加到OnCol对象中。
第17行代码判断当前选中的控件个数是否大于指定个数(4)。
如果已经超过指定个数,第18~22行代码循环遍历OnCol对象。
第19行代码查找存在于OnCol对象中,但是不存在于OnDic对象中的控件,满足上述条件的控件就是最后一个被选中的控件。
第20行代码取消勾选控件。
由于用户可能会取消勾选某个控件,所以第24行代码先清空字典控件,然后第25~27行代码将当前选中的控件添加到字典控件中。
所有CheckBox控件都指定宏为CheckboxeEvent()
过程,最终效果如下图所示。