Vba 如何防止在检查和删除上一行时跳过行检查?

Vba 如何防止在检查和删除上一行时跳过行检查?,vba,excel,if-statement,for-loop,Vba,Excel,If Statement,For Loop,这是为了在两列之间循环,并验证L列中的值是否低于另一张图纸中单元格中的特定(单个)值。它还检查M列中同一行的单元格中是否存在“#N/A”错误。如果这些错误为真,则删除整行。下面的代码似乎可以工作,但是,我必须多次运行For循环才能完全删除所有行。我的直觉是,当一行被删除时,它不会检查它正下方的那一行并继续前进。我怎样才能避免这种情况?感谢您的帮助 Sub removerows() Dim wsOut As Worksheet Dim wsPrev As Worksheet Dim r As L

这是为了在两列之间循环,并验证L列中的值是否低于另一张图纸中单元格中的特定(单个)值。它还检查M列中同一行的单元格中是否存在“#N/A”错误。如果这些错误为真,则删除整行。下面的代码似乎可以工作,但是,我必须多次运行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
Sub-remoterows()
以工作表的形式显示
将wsPrev设置为工作表
变暗,变长
最后一排一样长
Set wsOut=工作表(“输出”)
设置wsPrev=工作表(“上一个”)
Lastrow=wsOut.UsedRange(wsOut.UsedRange.Cells.Count).Row
对于r=2到最后一行
如果wsOut.Cells(r,“L”).值
运行反向循环

将r=2的
更改为Lastrow
将r=Lastrow的
更改为2步骤-1

我在手机上时没有测试它,但这应该可以解决您的问题。

Sub-remoterows()
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
以工作表的形式显示 将wsPrev设置为工作表 变暗,变长 最后一排一样长 Set wsOut=工作表(“输出”) 设置wsPrev=工作表(“上一个”) Lastrow=wsOut.UsedRange(wsOut.UsedRange.Cells.Count).Row 对于r=Lastrow到2步骤-1 如果wsOut.Cells(r,“L”).值

如果要删除,可以使循环向后。

可以通过使用
AutoFilter()

选项显式
分包商()
将值设置为双精度
prevValue=工作表(“以前”)。范围(“L2”)

对于工作表(“输出”)”只需在删除行后添加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
Sub-remoterows()
以工作表的形式显示
将wsPrev设置为工作表
变暗,变长
最后一排一样长
Set wsOut=工作表(“输出”)
设置wsPrev=工作表(“上一个”)
Lastrow=wsOut.UsedRange(wsOut.UsedRange.Cells.Count).Row
对于r=2到最后一行
如果wsOut.Cells(r,“L”).值
当您删除一行时,您正在将下一行“升级”到第r行位置(替换当前行),因此当您增加到下一个r时,它自然会跳过您刚刚增加的行。看起来底部也会有问题,因为即使删除了行,Lastrow(总行数)仍然保持不变。这就是问题所在。谢谢
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