验证至少选中了一个复选框

时间:2013-12-06 03:57:24

标签: excel vba userform

我已经搜索了同样的问题,我看到了一些类似的帖子,但是我的Userform仍然无法正常工作。我是VBA和Userform的新手。

我总共有12个复选框(12个月),我必须检查至少有一个CheckBox被选中。

Dim atLeastOneChecked As Boolean
atLeastOneChecked = False
Dim ctrlNCK As Control
For Each ctrlNCK In Controls
    If TypeName(ctrlNCK) = "chkMonth" Then
        If ctrlNCK.Value = True Then atLeastOneChecked = True
    End If
Next ctrlNCK

If Not atLeastOneChecked = True Then
    MsgBox "Month cannot be empty.", vbExclamation, "Input Data"
    Exit Sub
    End If

3 个答案:

答案 0 :(得分:0)

这是未经测试的,但请尝试:

If Left(ctrlNCK.Name,8) = "chkMonth" Then

我不会指望Type是“chkMonth”。这假设每个相关的CheckBox名称都以“chkMonth”开头。

如果您只想要选择一个月,而且只选择一个月,我会考虑在OptionButtons中使用Frame

答案 1 :(得分:0)

If (chbindian + chbchinies + chbitalian + chbsindian) = 0 Then
MsgBox "Please select at least Two checkbox"
Exit Sub
End If

试试这个

(chbindian + chbchinies + chbitalian + chbsindian)将此名称替换为您的复选框名称

答案 2 :(得分:0)

使用类似的问题代码方法我想出了这个:

Private Sub CommandButton1_Click()

Dim chk As Control
Dim i As Long

For Each chk In Me.Controls
    If TypeOf chk Is MSForms.CheckBox Then
        If chk = 0 Then
            i = i + 1
        End If
    End If
Next
    If i = 12 Then
        MsgBox "Please select at least one month!"
        Exit Sub
    End If

MsgBox "You selected at least one month!"

End Sub

解释:

For循环逐CheckBox UserForm逐个检查。

如果CheckBox的值为0(False),则i变量的计数器等于它在上一次迭代结束时的值(当前值)+ 1.

每个CheckBox的值为0(False)意味着它未经检查'向计数器添加1,因此,一旦循环完成,i将等于0(检查所有CheckBox)和12(未选中CheckBox)之间的任何位置。

退出循环后,下一个if语句会检查计数器i的值是否等于12,然后MsgBox显示"Please select at least one month!",否则无论是什么意思接下来发生的事情现在将执行(在我的示例中,另一个MsgBox建议"You selected at least one month!")。

注意:如果由于某种原因以后在UserForm添加了更多CheckBox,我的解决方案会有缺陷,因为它会检查 ALL { {1}}表单上的命令。

要解决此问题,您可以将CheckBox放在CheckBoxes Frame上。

假设UserForm被命名为Frame,您需要做的就是调整Frame1行,为ForCheckBox的每个Frame1指定{ {1}}喜欢这样:UserForm