【问题标题】:How to prevent row check being skipped when the previous row is checked and deleted?如何防止在检查和删除上一行时跳过行检查?
【发布时间】:2017-05-16 19:08:42
【问题描述】:

这旨在循环遍历两列并验证 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

【问题讨论】:

  • 当你删除一行时,你正在将下一行“提升”到第 r 个位置(替换当前行),所以当你递增到下一个 r 时,它自然会跳过你的行刚刚撞了上去。看起来您在底部也会遇到问题,因为即使您删除了行,Lastrow(总行数)仍然保持不变。

标签: vba excel if-statement for-loop


【解决方案1】:

运行反向循环。

For r = 2 To Lastrow 更改为For r = Lastrow to 2 Step -1

没有像我在移动设备上那样对其进行测试,但这应该可以解决您的问题。

【讨论】:

  • 就是这个。谢谢!
【解决方案2】:
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

如果要删除,想法是向后循环。

【讨论】:

    【解决方案3】:

    您可以通过使用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
    

    【讨论】:

      【解决方案4】:

      删除行后只需加上 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
      

      【讨论】:

        猜你喜欢
        • 2021-01-11
        • 2013-11-16
        • 2021-01-20
        • 2022-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多