2015-12-14 2 views
2

Я получаю ошибку компиляции «Else without If» в следующей части моего кода. В чем проблема и как это исправить?Cascading if statement not working

If InStr(1, Worksheets("Raw data").Cells(i, 3), "1M") Then Call RowCopyPaste("AS-001", i, counter1M) 
    counter1M = counter1M + 1 

    ElseIf InStr(1, Worksheets("Raw data").Cells(i, 3), "2M") Then Call RowCopyPaste("AS-001", i, counter2M) 
    counter2M = counter2M + 1 

    ElseIf InStr(1, Worksheets("Raw data").Cells(i, 3), "3M") Then Call RowCopyPaste("AS-001", i, counter3M) 
    counter3M = counter3M + 1 

    End If 

ответ

2

A Если сравнение может жить на одной линии с одной командой, но не так, как вы это делаете. Ваши две команды на условие должны быть более похожими на следующее.

If InStr(1, Worksheets("Raw data").Cells(i, 3), "1M") Then 
    Call RowCopyPaste("AS-001", i, counter1M) 
    counter1M = counter1M + 1 
ElseIf InStr(1, Worksheets("Raw data").Cells(i, 3), "2M") Then 
    Call RowCopyPaste("AS-001", i, counter2M) 
    counter2M = counter2M + 1 
ElseIf InStr(1, Worksheets("Raw data").Cells(i, 3), "3M") Then 
    Call RowCopyPaste("AS-001", i, counter3M) 
    counter3M = counter3M + 1 
End If 

Что-то вроде следующего может жить сам по себе, но не с другими ElseIf командами.

If InStr(1, Worksheets("Raw data").Cells(i, 3), "1M") Then Call RowCopyPaste("AS-001", i, counter1M) 

Вы могли бы хотеть попробовать это как Select Case statement, если у вас есть какие-либо другие условия для покрытия.

+0

Хороший ответ. Возможно, в то время как вы на нем могли бы упомянуть, как «Call» можно отказаться, поскольку это сделает код более идиоматичным. –

+0

В то время как 'Call' не нужен и немного назад, программисты будут использовать его, чтобы сделать свой собственный код более понятным для себя. Я думаю, возможно, этот комментарий и ваш должны служить тому, чтобы другие знали, что они могут обойтись без 'Call', если они также удаляют скобки, окружающие параметры. – Jeeped

+0

Способ подсчета VBA (без 'Call') * * немного нечетный и требует некоторого привыкания. Вы правы, что, вероятно, достаточно оставить его в качестве комментария. –

2

В качестве альтернативы, вы можете заменить вложенную Если с Select Case и даже Instr() с Like оператора:

Select Case True 

    Case Worksheets("RawData").Cells(1, 1) Like "*1M*" 
     Call RowCopyPaste("AS-001", i, counter1M) 
     counter1M = counter1M + 1 

    Case Worksheets("RawData").Cells(1, 1) Like "*2M*" 
     Call RowCopyPaste("AS-001", i, counter2M) 
     counter2M = counter2M + 1 

    Case Worksheets("RawData").Cells(1, 1) Like "*3M*" 
     Call RowCopyPaste("AS-001", i, counter3M) 
     counter3M = counter3M + 1 

    Case Else 
     '... 

End Select