Чего мне не хватает в этом коде: «Иначе без ошибки if»? - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь запустить этот код, который сначала объявляет wsD, а затем WsS в зависимости от ячейки на вкладке «Данные».Я продолжаю получать

без ошибки if.

Set wsD = ThisWorkbook.Sheets("Data")

    If wsD.Range("C4") = "AL" Then Set wsS = ThisWorkbook.Sheets("AL_Sim")
    ElseIf wsD.Range("C4") = "COLL" Then Set wsS = ThisWorkbook.Sheets("COLL_Sim")
    ElseIf wsD.Range("C4") = "COMP" Then Set wsS = ThisWorkbook.Sheets("COMP_Sim")
    ElseIf wsD.Range("C4") = "GL" Then Set wsS = ThisWorkbook.Sheets("GL_Sim")
    ElseIf wsD.Range("C4") = "EPL" Then Set wsS = ThisWorkbook.Sheets("EPL_Sim")
    ElseIf wsD.Range("C4") = "LAW" Then Set wsS = ThisWorkbook.Sheets("LAW_Sim")
    ElseIf wsD.Range("C4") = "POL" Then Set wsS = ThisWorkbook.Sheets("POL_Sim")

    End If
Next

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Оператор If имеет два допустимых синтаксиса.

Встроенный:

If {bool-expression} Then {statement}

И блок:

If {bool-expression} Then
    {statements}
End If

Так что, если есть оператор на том же самомВ строке, следующей за ключевым словом Then, VBA анализирует оператор If как встроенный синтаксис.

Таким образом, поскольку оператор завершен, следующий оператор, начинающийся с ElseIf, не имеет смысла для компилятора:«иначе без if».

0 голосов
/ 26 сентября 2018

Есть малоизвестный факт (или, как мне нравится это называть, маленькая практическая шутка Microsoft ...) в , что If..Then..End If условие имеет фактически две установленные формы:

  1. однострочный синтаксис
  2. многострочный синтаксис

Вы в основном смешали многострочный и однострочныйстроковый синтаксис в один муш , согласно MSDN :

Что следует за ключевым словом Then, проверяется, чтобы определить, является ли оператор однострочнымIf. Если после Then в той же строке появляется что-то кроме комментария, оператор обрабатывается как однострочный оператор If. Если Then отсутствует, он должен быть началом множественногоline If...Then...Else.

Пример однострочного оператора:

If <condition> Then <expression>

и многострочного (что вы пытались сделать) :

If <condition> Then
  <expression>
ElseIf <condition> Then 'optional, note comment isn't evaluated as single-line expression
  <expression>
End If

Таким образом, чтобы подвести итог, ваш код выдал ошибку, потому что ElseIf был оценен как <expression> после оператора If..Then вместо оценки вусловно, как вы и предполагали.


Неписанное правило гласит: всегда пишите в многострочном синтаксисе .
Не только вы избежите ненужных ошибок(как вы только что столкнулись), но также бесспорно легче читать и стандарт среди кодеров.

1054 *
0 голосов
/ 26 сентября 2018

Вам нужны действия на новых строках:

If wsD.Range("C4") = "AL" Then
    Set wsS = ThisWorkbook.Sheets("AL_Sim")
ElseIf wsD.Range("C4") = "COLL" Then
    Set wsS = ThisWorkbook.Sheets("COLL_Sim")
ElseIf wsD.Range("C4") = "COMP" Then
    Set wsS = ThisWorkbook.Sheets("COMP_Sim")
ElseIf wsD.Range("C4") = "GL" Then
    Set wsS = ThisWorkbook.Sheets("GL_Sim")
ElseIf wsD.Range("C4") = "EPL" Then
    Set wsS = ThisWorkbook.Sheets("EPL_Sim")
ElseIf wsD.Range("C4") = "LAW" Then
    Set wsS = ThisWorkbook.Sheets("LAW_Sim")
ElseIf wsD.Range("C4") = "POL" Then
    Set wsS = ThisWorkbook.Sheets("POL_Sim")
End If

Select Case было бы лучше здесь:

Select Case wsD.Range("C4")
    Case Is = "AL"
        Set wsS = ThisWorkbook.Sheets("AL_Sim")
    Case Is = "COLL"
        Set wsS = ThisWorkbook.Sheets("COLL_Sim")
    Case Is = "COMP"
        Set wsS = ThisWorkbook.Sheets("COMP_Sim")
    Case Is = "GL"
        Set wsS = ThisWorkbook.Sheets("GL_Sim")
    Case Is = "EPL"
        Set wsS = ThisWorkbook.Sheets("EPL_Sim")
    Case Is = "LAW"
        Set wsS = ThisWorkbook.Sheets("LAW_Sim")
    Case Is = "POL"
        Set wsS = ThisWorkbook.Sheets("POL_Sim")
End Select
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...