If trigger = "Reconcile" Then
    If InStr(XXlist, checkmi) > 0 Then
          If checkmi = "XX1000" Then
            a = a + 1
            Call XX1000Check(location, a, checkmi)
          End If
          If checkmi = "XX1001" Then
            Call XX1001Check(location, checkmi)
          End If
          Else: Call SenseCheck(location, location2, location7, checkmi)
    End If
End If

Я хочу, чтобы мой код проверял, равен ли Checkmi одному из жестко закодированных кодов (XX1000, XX1001), а затем вызывал соответствующий код VBA. Однако, если для этого кода нет конкретного модуля VBA, я хочу, чтобы он вызывал универсальный SenseCheck. В настоящее время он выполняет SenseChec k, если начальное условие If InStr(XXlist, checkmi) > 0 неверно, а это не то, что я хочу. И я не совсем уверен, как это исправить.

1
Atanas 3 Мар 2018 в 02:34

3 ответа

Лучший ответ

Это может быть хорошим местом для синтаксиса SELECT ... CASE

      SELECT CASE checkmi 
         CASE "XX1000" 
               a = a + 1
               Call XX1000Check(location, a, checkmi)
         CASE "XX1001" 
               Call XX1001Check(location, checkmi)
         CASE ELSE
               SenseCheck(location, location2, location7, checkmi)
      END SELECT
2
nutsch 2 Мар 2018 в 23:49

Вы уже завершили оператор If на End If ниже:

If checkmi = "XX1001" Then
    Call XX1001Check(location, checkmi)
End If '<~~ termination point

И у вас есть открытый If оператор, в который вы поместили свой Else оператор.

If InStr(XXlist, checkmi) > 0 Then
      If checkmi = "XX1000" Then
        a = a + 1
        Call XX1000Check(location, a, checkmi)
      End If
      If checkmi = "XX1001" Then
        Call XX1001Check(location, checkmi)
      End If '<~~ termination point as pointed above
      Else: Call SenseCheck(location, location2, location7, checkmi)
End If '<~~ termination point

Таким образом, оператор Else будет связан с верхним наиболее незавершенным If оператором.
И это ваш самый первый If оператор {{ X3 } } .

< Сильный > Edit1 : Чтобы исправить свой код, включите оператор Else перед завершением всего оператора If, а также включите использование ElseIf, хотя если у вас есть больше условий, использование Select Case желательно.

If InStr(XXlist, checkmi) > 0 Then
    If checkmi = "XX1000" Then
        a = a + 1
        Call XX1000Check(location, a, checkmi)
    ElseIf checkmi = "XX1001" Then '<~~ incorporate ElseIf statement
        Call XX1001Check(location, checkmi)
    Else '<~~ transfer the Else statement here
        Call SenseCheck(location, location2, location7, checkmi)
    End If
End If
1
L42 3 Мар 2018 в 09:33

Расширяя приведенные ответы, просто добавлю, что вы можете рассмотреть возможность улучшения вашего кода и улучшения его обслуживания, приняв одну и ту же подпрограмму для значений "XX1000" и "XX1001" checkmi

Это с помощью «необязательных» параметров, которые могут быть у Sub / Function с единственным требованием, они должны быть сохранены как последние в их подписи

Например:

Sub XX100XCheck(checkmi As String, location As Long, Optional a As Variant)

Потребует передачи первых двух параметров и оставит третий необязательным. и объявив этот последний тип Variant, вы можете проверить, действительно ли он был передан или нет:

Sub XX100XCheck(checkmi As String, location As Long, Optional a As Variant)

    If Not IsMissing(a) Then 'if "optional" 'a' parameter has actually been passed
        ' here place the code to process "optional" 'a' parameter
    End If

    '... rest of your code to handle "fixed" parameters

End Sub

Так что ваш код вопроса будет:

Select Case checkmi
    Case "XX1000"
        a = a + 1
        XX100XCheck checkmi, location, a ' call XX100Check sub passing all kind of parameters ("fixed" and "optional")

    Case "XX1001"
        XX100XCheck checkmi, location ' call the same sub as above, but now you're not passing it the "optional" a parameter

    Case Else
        SenseCheck(location, location2, location7, checkmi)
End Select

Где вы можете использовать (и поддерживать) только одну подпрограмму (т. е. XX100XCheck()) вместо двух (т. е. XX1000Check() и XX1001Check())

Конечно, это не может быть воспринято как шаблон кодирования обязательный , так как он может вступать в противоречие с другой «хорошей практикой», которая требует простых и простых процедур в противоположность «все в одном» "те

Так что это вопрос баланса (как всегда), и мое предложение исходило из предположения из вашего кода, что два сабвуфера XX...Check() будут иметь минимальные различия между ними

0
DisplayName 3 Мар 2018 в 15:36