0

我的代码中有一大块 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
4

5 回答 5

2

您应该做的第一件事是摆脱多余的部分= True。布尔值的全部意义在于没有必要将它们与其他布尔值进行比较——你只需说if somethingor 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%(基于行数),这是相当大的数量。

于 2013-09-11T09:07:21.977 回答
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 检查。

于 2013-09-11T22:38:57.247 回答
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
于 2013-09-11T20:50:38.760 回答
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
于 2013-09-11T20:18:21.023 回答
0

在这种情况下,我认为您应该考虑使用IIF 函数

ReportTaskCount = IIF(chkPO.Value, ReportTaskCount + 1, ReportTaskCount)
ReportTaskCount = IIF(chkGRN.Value, ReportTaskCount + 1, ReportTaskCount)

这可能会节省您的时间并保持可读性。

并且不需要= True为每个条件指定,因为它是一个布尔值

于 2013-09-11T09:19:07.137 回答