Как предотвратить пропуску проверки строки при проверке и удалении предыдущей строки?

Это предназначено для циклического прохождения двух столбцов и проверки того, что значение в столбце L меньше определенного (единственного) значения в ячейке с другого листа. Он также проверяет, есть ли в ячейке ошибка «# N / A» в той же строке в столбце M. Если они верны, вся строка удаляется. Код ниже, похоже, работает, однако мне нужно запустить цикл For несколько раз, чтобы полностью удалить все строки. Моя догадка заключается в том, что когда строка удаляется, она не проверяет одно прямо под ней и продолжает движение. Как я могу избежать этого? Любая помощь приветствуется.

Sub removerows() Dim wsOut As Worksheet Dim wsPrev As Worksheet Dim r As Long Dim Lastrow As Long Set wsOut = Worksheets("Output") Set wsPrev = Worksheets("Previous") Lastrow = wsOut.UsedRange(wsOut.UsedRange.Cells.Count).Row For r = 2 To Lastrow If wsOut.Cells(r, "L").Value < wsPrev.Cells(2, "L").Value And _ Application.WorksheetFunction.IsNA(wsOut.Cells(r, "M").Value) Then wsOut.Cells(r, "L").EntireRow.Delete Else wsOut.Cells(r, "L").Interior.ColorIndex = 20 End If Next End Sub 

Запустите обратный цикл.

Изменение For r = 2 To Lastrow для For r = Lastrow to 2 Step -1 .

Не тестировал его, поскольку я нахожусь на мобильном телефоне, но это должно решить вашу проблему.

 Sub removerows() Dim wsOut As Worksheet Dim wsPrev As Worksheet Dim r As Long Dim Lastrow As Long Set wsOut = Worksheets("Output") Set wsPrev = Worksheets("Previous") Lastrow = wsOut.UsedRange(wsOut.UsedRange.Cells.Count).Row For r = Lastrow To 2 step -1 If wsOut.Cells(r, "L").Value < wsPrev.Cells(2, "L").Value And _ Application.WorksheetFunction.IsNA(wsOut.Cells(r, "M").Value) Then wsOut.Cells(r, "L").EntireRow.Delete Else wsOut.Cells(r, "L").Interior.ColorIndex = 20 End If Next End Sub 

Идея состоит в том, чтобы сделать цикл назад, если вы удаляете.

вы можете ускорить его и избежать циклов с помощью AutoFilter() :

 Option Explicit Sub removerows() Dim prevValue As Double prevValue = Worksheets("Previous").Range("L2") With Worksheets("Output") '<--| reference your "output" sheet With .Range("M1", .Cells(.Rows.count, "L").End(xlUp)) '<--| reference its columns "L:M" range from row 1 (header) down to column "L" last not empty row .AutoFilter Field:=1, Criteria1:="<" & prevValue '<--| 1st filter on column "L" with values lower than sheet "previous" sheet "L2" cell .AutoFilter Field:=2, Criteria1:="#N/A" '<--| '<--| 2nd filter on column "M" with values "#N/A" values If Application.WorksheetFunction.Subtotal(103, .Resize(, 1)) > 1 Then .Resize(.Rows.count - 1).Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete '<--| if any filtered cells then delete their row .AutoFilter '<--| remve filters .AutoFilter Field:=1, Criteria1:=">=" & prevValue '<--| filter on column "L" with values greater or equal than sheet "previous" sheet "L2" cell If Application.WorksheetFunction.Subtotal(103, .Resize(, 1)) > 1 Then .Resize(.Rows.count - 1, 1).Offset(1).SpecialCells(xlCellTypeVisible).Interior.ColorIndex = 20 '<--| if any filtered celld then color them End With End With End Sub 

Просто добавьте r = r – 1 после удаления строки.

 Sub removerows() Dim wsOut As Worksheet Dim wsPrev As Worksheet Dim r As Long Dim Lastrow As Long Set wsOut = Worksheets("Output") Set wsPrev = Worksheets("Previous") Lastrow = wsOut.UsedRange(wsOut.UsedRange.Cells.Count).Row For r = 2 To Lastrow If wsOut.Cells(r, "L").Value < wsPrev.Cells(2, "L").Value And _ Application.WorksheetFunction.IsNA(wsOut.Cells(r, "M").Value) Then wsOut.Cells(r, "L").EntireRow.Delete ***** r = r -1 'Done! it will recheck the same cell after Else wsOut.Cells(r, "L").Interior.ColorIndex = 20 End If Next End Sub 
  • excel логическая ошибка, все проходит логический тест
  • IF и OR для значений ячеек в столбце (столбцах)
  • IfElse и использование переменных?
  • IF в R - Всегда вложенные?
  • Сумма Excel, если год равен
  • Как сделать так, чтобы был выбран вариант OptionButton.Value
  • Excel, если условие
  • Условное форматирование и утверждение IF
  • Подсчет экземпляров каждого месяца на основе утверждений IF
  • Есть ли более эффективный метод For-Next, включающий оператор If-Then?
  • Использование VLOOKUP в VBA - Уход за N / A путем ссылки на другой VLOOKUP или INDEX / MATCH
  • Давайте будем гением компьютера.