我已经搜索了同样的问题,我看到了一些类似的帖子,但是我的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
答案 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
行,为For
中CheckBox
的每个Frame1
指定{ {1}}喜欢这样:UserForm