2015-12-12 4 views
1

Я написал ниже код. Его петля внутри цикла. Первый цикл запускается для поиска значения 1-го диапазона (sheet1) во всех диапазонах второго цикла (лист2). Я хочу, чтобы второй цикл остановился, если условие выполнено, и приступим к следующему значению.Петля внутри петли. Остановка второго цикла, если условие выполнено

Я использую «Exit For» для остановки 2-го цикла, если условие выполнено. но проблема в том, что ...

Когда первый цикл = 2, второй цикл также равен 2 и условие выполнено, второй цикл останавливается. Первый цикл становится = 3, но второй цикл все еще остается = 2, что вызывает несоответствие и отказ для всех. Пожалуйста помоги.

For I = 2 To REND   
     For P = 2 To ENDROW 
      If Range("D" & I) = D.Range("c" & P) Then 
      If Range("H" & I) = D.Range("F" & P) Then 
       Range("A" & I) = "MATCHED" 
       Exit For 

      Else 
       Range("A" & I) = "DIFFERENCE OF " & Range("G" & I) - D.Range("F" & P) 
      End If 
      Else 
      Range("A" & I) = "AP NOT FOUND" 
      End If 
     Next P 
Next I 

Где заявления являются:

Dim D As Worksheet, F As Worksheet, R As WorksheetDim X As String 
Dim I As Integer, ENDROW As Integer, FEND As Integer 
Dim P As Integer, REND As  Integer, L As Integer 
Set D = ActiveWorkbook.Sheets("DWAC") 
Set F = ActiveWorkbook.Sheets("FPS") 
Set R = ActiveWorkbook.Sheets("RAW") 
ENDROW = D.Range("C2").End(xlDown).Row 
FEND = F.Range("C2").End(xlDown).Row 
REND = R.Range("C2").End(xlDown).Row 
+0

Возможно, я еще не совсем понял ваш вопрос, но почему вы определяете страницу для одной стороны диапазонов сравнения, но не для других? (т. е. вы используете «диапазон» («G» и I) - D.Range («F» и P), почему первый диапазон не «страница» определен? Кроме того, вы сравниваете «значения» неявно, то есть без определения .Value свойство диапазона? Это может привести к несоответствию ошибок, поскольку в этом случае не определено, что именно следует сравнивать? – mtholen

+0

Итак, я использую 'с листом' для первого диапазона, поэтому не нужно использовать' page.range' – Akkitech

+0

. 2-е сравнительные поля содержат целое число, поэтому не используйте 'range.value' – Akkitech

ответ

2

Из Вашего вопроса, я предполагаю, что там будет только один результат в Sheets("DWAC") column C. Имея это в виду, мы можем использовать find вместо цикла, пока вы не получите соответствие.

Если мы очистили ваши Dim заявления (Eсть один лист не используется в переменных кода строки & должен быть long.

Dim D As Worksheet, R As Worksheet 
    Dim ENDROW As Long, REND As Long 
    Dim rng1 As Range, rng2 As Range 
    Dim c As Range, FndC As Range 

Теперь, конечно, набор рабочих листов

Set D = Sheets("DWAC") 
Set R = Sheets("RAW") 

И затем найдите последние строки и задайте диапазоны.

Это найдет последнюю строку в столбце c Листы («DWAC»), заданный диапазон где мы хотим, чтобы найти исходное значение из Sheets («RAW»)

With D 
    ENDROW = .Cells(.Rows.Count, "C").End(xlUp).Row 
    Set rng2 = .Range("C2:C" & ENDROW) 'find value in column C sheet D 
End With 

Затем установите диапазон петли из листов R, это диапазон мы будем циклически.

With R 
     REND = .Cells(.Rows.Count, "D").End(xlUp).Row 
     Set rng1 = .Range("D2:D" & REND) 'Loop through column D in sheet R 
    End With 

Теперь мы можем начать цикл. c будет проходить через rng1 и найти себя в rng2, FndC будет диапазоном, если c будет найден.

For Each c In rng1.Cells 
     Set FndC = rng2.Find(what:=c, lookat:=xlWhole) 

Если c в найденном, то сделайте что-нибудь.

If Not FndC Is Nothing Then 

      If c.Offset(, 4) = FndC.Offset(, 3) Then 
       c.Offset(, -3) = "Match" 
      Else 
       c.Offset(, -3) = "DIFFERENCE OF " & c.Offset(, 3) - FndC.Offset(, 3) 
      End If 
     Else: c.Offset(, -3) = "Not Found" 

     End If 
    Next c 

Если у меня есть Смещение в неправильном порядке, вы можете отредактировать его в соответствии с вашими требованиями. Вот что представляют собой смещения.

c.Offset(, 4)'=Column H Sheet "R" 
FndC.Offset(, 3)'=Column F Sheet "D" 
c.Offset(, -3)'=Column A Sheet "R" 
c.Offset(, 3)'=Column G Sheet "R" 

Полный код.

Sub FindAndStuff() 
    Dim D As Worksheet, R As Worksheet 
    Dim ENDROW As Long, REND As Long 
    Dim rng1 As Range, rng2 As Range 
    Dim c As Range, FndC As Range 

    Set D = Sheets("DWAC") 
    Set R = Sheets("RAW") 

    With D 
     ENDROW = .Cells(.Rows.Count, "C").End(xlUp).Row 
     Set rng2 = .Range("C2:C" & ENDROW) 'find value in column C sheet D 
    End With 


    With R 
     REND = .Cells(.Rows.Count, "D").End(xlUp).Row 
     Set rng1 = .Range("D2:D" & REND) 'Loop through column D in sheet R 
    End With 

    For Each c In rng1.Cells 
     Set FndC = rng2.Find(what:=c, lookat:=xlWhole) 

     If Not FndC Is Nothing Then 

      If c.Offset(, 4) = FndC.Offset(, 3) Then 
       c.Offset(, -3) = "Match" 
      Else 
       c.Offset(, -3) = "DIFFERENCE OF " & c.Offset(, 3) - FndC.Offset(, 3) 
      End If 
     Else: c.Offset(, -3) = "Not Found" 

     End If 
    Next c 

End Sub 
+0

Больше превосходит, меньше VBA, отлично как другое решение. Другой стиль. – gazzz0x2z

+0

Удивительный !!!! Он отлично работает ..... !!! – Akkitech

1

Лучшим способом я знаю, использовать булевы:

Dim chck As Boolean 
Dim chck2 As Boolean 
For I = 2 To REND 
    chck = False 
    chck2 = False 
    For P = 2 To ENDROW 
     If Range("D" & I) = D.Range("c" & P) Then 
      chck = True 
      If Range("H" & I) = D.Range("F" & P) Then 
       chck2 = True 
       Exit For 
      End If 
     end if 
    Next P  
    If chck And chck2 Then 
     Range("A" & I) = "MATCHED" 
    ElseIf chck Then 
     Range("A" & I) = "DIFFERENCE OF " & Range("G" & I) - D.Range("F" & P) 
    Else 
     Range("A" & I) = "AP NOT FOUND" 
    End If 
Next I 
+0

Это сработало, но когда 'If chck And chck2 Then' истинно, он закончил цикл и остановил макрос. howver «Для I = 2 К REND» необходимо продолжить. – Akkitech

+0

@Akkitech Я неправильно прочитал ожидание. См. Edit –

+0

Я попробую это завтра. Я сейчас не работаю ..... Спасибо за помощь. – Akkitech

Смежные вопросы