我的代码中有一大块ifs,我不想放入数组,因为我需要它们有唯一的名称。
我如何为这块IF制作更小的代码?
If chkPO.Value = True Then
ReportTaskCount = ReportTaskCount + 1
End If
If chkGRN.Value = True Then
ReportTaskCount = ReportTaskCount + 1
End If
If chkSO.Value = True Then
ReportTaskCount = ReportTaskCount + 1
End If
etc
etc
etc
答案 0 :(得分:2)
你应该做的第一件事是摆脱多余的= True
位。布尔值的全部意义在于,不必将它们与其他布尔值进行比较 - 您只需说if something
或if not something
。否则,你在哪里停下来?类似的东西:
If ((chkSO.Value = True) = True) = True Then
无限广告?
请记住,标准复选框的值(假设它们是您正在使用的复选框)是一个整数,对于未选中可以是0,对于已检查可以是1,对于灰色可以是2。因此,您的代码(和我的代码)依赖于隐式转换为布尔值。如果您没有将代码中的框变灰,那将不会成为问题,因为0(未选中)将被强制为false。但是,灰色将被视为检查了bos。
如果您允许灰显,则可能需要修改代码以将其考虑在内。如何执行此操作取决于您希望如何处理灰色复选框,这只是您可以做出的决定。如果您没有将状态设置为灰色,则可以忽略此状态,并忽略前一段。
然后,假设您不能使用数组(如您所述),您至少可以使用if
语句的单行变体:
If chkPO.Value Then ReportTaskCount = ReportTaskCount + 1
If chkGRN.Value Then ReportTaskCount = ReportTaskCount + 1
If chkSO.Value Then ReportTaskCount = ReportTaskCount + 1
这应该会使代码大小减少大约75%(基于行数),这是一个很大的数量。
答案 1 :(得分:0)
在这种情况下,我认为您应该考虑使用IIF function;
ReportTaskCount = IIF(chkPO.Value, ReportTaskCount + 1, ReportTaskCount)
ReportTaskCount = IIF(chkGRN.Value, ReportTaskCount + 1, ReportTaskCount)
这可能会节省您的时间并保持可读性。
并且无需为每个条件指定= True
,因为它是布尔值
答案 2 :(得分:0)
对于这么简单的事情可能有点多,但如果你有一百个如此 -
Private mReportTaskCount As Integer
Private Sub IncrementCount(ByVal blnValue As Boolean)
If blnValue Then mReportTaskCount = mReportTaskCount + 1
End Sub
Private Sub Whatever()
IncrementCount chkPO.Value
IncrementCount chkGRN.Value
IncrementCount chkSO.Value
IncrementCount chkBLU.Value
IncrementCount chkYEL.Value
IncrementCount chkPUR.Value
End Sub
答案 3 :(得分:0)
Public Sub YourSub()
ReportTaskCount = CountTrueBooleans (chkPO.Value, chkGRN.Value, chkSO.Value)
End Sub
Public Function CountTrueBooleans (ParamArray Values())
Dim ret as long
For i = LBound(aa) To UBound(Values)
If Values(i) <> 0 Then ret = ret + 1 'checking for "True" and counting them...
Next
CountTrueBooleans = ret
End Function
答案 4 :(得分:0)
如果您知道要为窗口上所有已检查的CheckBox控件增加ReportTaskCount,则可以执行以下操作:
Private Sub MakeReportTaskCount()
Dim ctl As Control
ReportTaskCount = 0
For Each ctl In Controls
If TypeOf ctl Is CheckBox Then
ReportTaskCount = ReportTaskCount + 1
End If
Next ctl
End Sub
或者,您可以为每个CheckBox赋予其Tag属性特殊值,例如: “ReportCountCheck”,并进行字符串比较而不是TypeOf检查。