实例需求:工作表中有8个CheckBox控件(下文中简称为控件),现在需要实现限制用户最多只能勾选4个控件。
在上一篇博客中已经实现了这个需求,其基本思路是用户选中第5个控件时,事件代码将取消勾选最后一个选中的控件。其实这个案例也可以使用防患于未然的思路来解决,即用户选中4个控件之后,就禁用其他控件,用户当然也就无法再勾选更多控件。
示例代码如下。
Sub CheckboxeEvent()
Dim oCB As CheckBox, bFlag As Boolean, CBCnt As Long
Dim OffCol As Collection, oSht As Worksheet
Const MAX_CHECKED As Long = 4
Set oSht = Worksheets("Sheet1")
CBCnt = oSht.CheckBoxes.Count
Set OffCol = New Collection
For Each oCB In ActiveSheet.CheckBoxes
If oCB.Value = xlOff Then OffCol.Add oCB
Next oCB
bFlag = ((CBCnt - OffCol.Count) = MAX_CHECKED)
For Each oCB In OffCol
oCB.Interior.Color = IIf(bFlag, RGB(188, 188, 188), vbWhite)
oCB.Enabled = Not bFlag
Next oCB
End Sub
【代码解析】
第4行代码设置最多选中4个控件。
第5行代码获取指定工作表对象。
第6行代码获取工作表中CheckBox控件个数。
第7行代码创建Collection对象。
第8~10代码遍历工作表中的控件,将当期未被选中的控件添加到OffCol对象中。
第11行代码设置标志布尔变量bFlag,如果当前选中的控件个数与MAX_CHECKED
相同,则bFlag值为True。
第12~14行代码循环遍历未被选中的控件。
如果bFlag值为True,第13行代码将控件填充色设置为灰色,第14行代码禁用该控件,以实现用户无法勾选该控件。
所有CheckBox控件都指定宏为CheckboxeEvent()
过程,最终效果如下图所示。