2015-07-20 10 views
0

У меня проблема с кодом VBA. Я пытаюсь сравнить 2 столбца, как столбцы A, так и B. Если некоторые данные совпадают, например, скажем, что A2 содержит текст в B3, тогда мне нужно сравнить ячейку C2 с столбцом D. Я не понимаю, почему, но я получаю ошибку «End If without block If». Большое спасибо за помощь парням.VBA For loop with If loop

Вот мой код:

Sub Compare() 
For i = 1 To 100 
    For j = 1 To 50 
    If InStr(1, ActiveSheet.Cells(i, 1).Value, ActiveSheet.Cells(j, 2).Value, vbTextCompare) <> 0 _ 
    Then For k = 1 To 20 
     If InStr(1, ActiveSheet.Cells(i, 3).Value, ActiveSheet.Cells(k, 4).Value, vbTextCompare) <> 0 Then MsgBox i 
     End If 
    Next k 
    End If 
    Next j 
Next i 

End Sub 
+1

так, как вы построили ваш IF заявления (все находится на 1 линии) End If не требуется. Избавьтесь от обоих End Ifs, и вам должно быть хорошо идти. – sous2817

+3

Или - сделайте их блоком, если в конце концов - вставьте разрыв строки после слова 'Then'. Тот факт, что вы используете символы продолжения строки, говорит о том, что ваши линии становятся громоздкими. –

ответ

3

Я нашел структуру вашего, если заявления немного сбивает с толком, и я не совсем уверен, что вы можете сделать для цикла как однострочника подобных, чтобы избавиться от все конечного МФСА. Для чего это стоит, я думаю, что этот код немного легче следовать:

Sub Compare() 
For i = 1 To 100 
    For j = 1 To 50 
    If InStr(1, ActiveSheet.Cells(i, 1).Value, ActiveSheet.Cells(j, 2).Value, vbTextCompare) <> 0 Then 
     For k = 1 To 20 
      If InStr(1, ActiveSheet.Cells(i, 3).Value, ActiveSheet.Cells(k, 4).Value, vbTextCompare) <> 0 Then MsgBox i 
     Next k 
    End If 
    Next j 
Next i 

End Sub 

Это работает без ошибки компиляции, но не могу комментировать, если он делает то, что вы хотите, чтобы это сделать.

2

sous2817 поднял интересный вопрос в своем ответе о том, работает ли оператор с 1 строкой, если тело оператора if само является циклом for. Ответ, кажется, «нет» - если для цикла сама не выдавливается на одну строку, используя оператор двоеточие разделитель:

Sub test1() 'compile error 
    Dim i As Long, s As Long 
    If i = 0 _ 
    Then For i = 1 To 10 
     s = s + i 
    Next i 
    MsgBox s 
End Sub 

Sub test2() 'compiles okay 
    Dim i As Long, s As Long 
    If i = 0 _ 
    Then For i = 1 To 10: s = s + i: Next i 
    MsgBox s 
End Sub 
+0

Это интересный способ сделать это! – sous2817

-2
Sub comparison() 
For i = 2 To 1000 
    For j = 2 To 1000 
     If Worksheets(Worksheet).Range("A" & i).Value = Worksheets(Worksheet).Range("L" & j).Value Then 
      Worksheets(worksheet).Range("N" & j).Select 
      With Selection.Interior 
       .Pattern = xlSolid 
       .PatternColorIndex = xlAutomatic 
       .Color = 65535 
       .TintAndShade = 0 
       .PatternTintAndShade = 0 
      End With 

     End If 
    Next j 
Next i 
End Sub 
+1

Я проигнорировал этот ответ, потому что этот код не выполняет то, что пытался выполнить примерный код OP, равно как и не отвечает на вопрос о получении ошибки OP. – CBRF23