Вложено ли - Возможно, лучшее решение? - PullRequest
0 голосов
/ 09 октября 2018

Я надеюсь получить совет относительно лучшего решения для массивного вложенного If оператора в VBA.Из-за количества условий, которые были бы возможны, оператор If становится чрезвычайно большим.Я думал об использовании цикла For, но, похоже, для этого все еще потребуется значительное количество условий If, и я также подумал о Select Case, но это тоже не работает.

Приведенный ниже код показывает, как у меня установлены переменные для операторов If и большинства условий.Любая помощь в оптимизации этого кода будет принята с благодарностью.

    If wsCalc.Range("LenderComplete") <> vbNullString Then f = 1
If wsCalc.Range("ProcessorComplete") <> vbNullString Then g = 1
If wsCalc.Range("KeyerComplete") <> vbNullString Then h = 1
If wsCalc.Range("CheckerComplete") <> vbNullString Then i = 1

If f <> 1 And g <> 1 And h <> 1 And i <> 1 Then
    ContLoanFile.ContinueLP.BackColor = vbYellow
    With ContLoanFile.Label7
        .Caption = "Lender items NOT complete." & vbNewLine & "Processor items NOT complete." & vbNewLine & "Keyer items NOT complete." & vbNewLine & "Checker items NOT complete."
        .Font.Size = 9
    End With
    If f = 1 And g <> 1 And h <> 1 And i <> 1 Then
        ContLoanFile.ContinueLP.BackColor = vbYellow
        With ContLoanFile.Label7
            .Caption = "Lender items COMPLETE." & vbNewLine & "Processor items COMPLETE." & vbNewLine & "Keyer items NOT complete." & vbNewLine & "Checker items NOT complete."
            .Font.Size = 9
        End With
        If f = 1 And g = 1 And h <> 1 And i <> 1 Then
            ContLoanFile.ContinueLP.BackColor = vbYellow
            With ContLoanFile.Label7
                .Caption = "Lender items COMPLETE." & vbNewLine & "Processor items COMPLETE." & vbNewLine & "Keyer items NOT complete." & vbNewLine & "Checker items NOT complete."
                .Font.Size = 9
            End With
            If f = 1 And g = 1 And h = 1 And i <> 1 Then
                ContLoanFile.ContinueLP.BackColor = vbYellow
                With ContLoanFile.Label7
                    .Caption = "Lender items COMPLETE." & vbNewLine & "Processor items COMPLETE." & vbNewLine & "Keyer items COMPLETE." & vbNewLine & "Checker items NOT complete."
                    .Font.Size = 9
                End With
                If f = 1 And g = 1 And h = 1 And i = 1 Then
                    ContLoanFile.ContinueLP.BackColor = vbYellow
                    With ContLoanFile.Label7
                        .Caption = "Lender items COMPLETE." & vbNewLine & "Processor items COMPLETE." & vbNewLine & "Keyer items COMPLETE." & vbNewLine & "Checker items COMPLETE."
                        .Font.Size = 9
                    End With
                    If f <> 1 And g = 1 And h = 1 And i = 1 Then
                        ContLoanFile.ContinueLP.BackColor = vbYellow
                        With ContLoanFile.Label7
                            .Caption = "Lender items NOT complete." & vbNewLine & "Processor items COMPLETE." & vbNewLine & "Keyer items COMPLETE." & vbNewLine & "Checker items COMPLETE."
                            .Font.Size = 9
                        End With
                        If f = 1 And g <> 1 And h = 1 And i = 1 Then
                            ContLoanFile.ContinueLP.BackColor = vbYellow
                            With ContLoanFile.Label7
                                .Caption = "Lender items COMPLETE." & vbNewLine & "Processor items NOT complete." & vbNewLine & "Keyer items COMPLETE." & vbNewLine & "Checker items COMPLETE."
                                .Font.Size = 9
                            End With

1 Ответ

0 голосов
/ 10 октября 2018

Во-первых, их не нужно вкладывать, потому что все они имеют противоречивую логику и никогда не будут «каскадно» спадать, как задумано вложенным If.

If f <> 1 And g <> 1 And h <> 1 And i <> 1 Then '// If this is true
    '...
    If f = 1 And g <> 1 And h <> 1 And i <> 1 Then '// Then this can never be true

Если вы собираетесьчтобы сохранить этот дизайн, тогда на самом деле должна быть If...ElseIf... логика.


Во-вторых, у вас много общей логики, поэтому что-то вроде этого должно работать, потому что вам не нужно повторять одно и то жерезультат для каждого условия:

Dim caption As String

caption = "Lender items " & IIf(wsCalc.Range("LenderComplete").Value <> vbNullString, "COMPLETE", "NOT complete") & vbNewLine & _
          "Processor items " & IIf(wsCalc.Range("ProcessorComplete").Value <> vbNullString, "COMPLETE", "NOT complete") & vbNewLine & _
          "Keyer items " & IIf(wsCalc.Range("KeyerComplete").Value <> vbNullString, "COMPLETE", "NOT complete") & vbNewLine & _
          "Checker items " & IIf(wsCalc.Range("CheckerComplete").Value <> vbNullString, "COMPLETE", "NOT complete")


With ContLoanFile
    .ContinueLP.BackColor = vbYellow
    With .Label7
        .Caption = caption
        .Font.Size = 9
    End With
End With

Нет необходимости в цикле и нет необходимости проверять одни и те же значения несколько раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...