【问题标题】:Loop not deleting all the required rows循环不删除所有必需的行
【发布时间】:2019-08-10 03:59:12
【问题描述】:

我的代码应该计算 WIP 工作表中的行数,然后循环遍历这些行,如果 B 列中的字符串包含单词“out”,则删除一行。

Sub delete()
    numrows = Worksheets("WIP").Cells(Rows.Count, "A").End(xlUp).Row

    For x = 1 To numrows
        If InStr(1, lCase(Range("B" & x)), "out") <> 0 Then
            Rows(x).Delete
        End If
    Next
End Sub

代码正在运行,没有出现任何错误,但它只删除了一些行。假设 B 列中有 100 行包含单词“out”。我将运行代码一次,它会删除几行。然后我再次运行它,它又摆脱了一些。如果我运行代码足够多次,它将删除所有正确的行。

我不确定为什么第一次没有删除所有行,任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: excel vba for-loop


    【解决方案1】:

    替换:

    For x = 1 To numrows
    

    与:

    For x = numrows to 1 Step -1
    

    如果向前运行,循环索引会损坏。

    【讨论】:

    • 损坏是描述问题的最佳方式吗?从上到下遍历行将跳过在删除行并增加增量时上移的行。
    【解决方案2】:

    我认为在处理大量数据时最有效的另一种方法是.ClearContents 而不是.EntireRow.Delete,最后一次性删除所有空白行。或者更好的是,考虑一下:

    Columns("B:B").Replace What:="out", Replacement:=vbNullString, LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    Columns("B:B").SpecialCells(xlCellTypeBlanks).EntireRow.delete
    

    请注意,如果 B 为空白,它将删除行,因此请根据您的数据进行调整,但这是执行您想做的最快的方法。

    【讨论】:

      【解决方案3】:

      您是否尝试过使用 .FindNext?我认为这可能会更快一些并避免您的问题:

      With sheets(“WIP”).Range(“B1:B” & x)
      
      Set mycell = .Cells.Find(What:=“out”)
      
          If Not mycell Is Nothing Then
      
              Do Until mycell Is Nothing
      
                  Cells(mycell.Row, “B”).entireRow.Delete
      
                  Set mycell = .FindNext(mycell)
              Loop
      
      End If
      

      结束

      【讨论】:

      • 方法Find影响时间执行。无论如何,Excel 都必须删除这些行,但是您正在增加查找下一个单元格的时间,在该单元格中检查 If 语句总是要快得多。
      【解决方案4】:

      虽然最好的响应是向后循环(从而避免跳过在删除时向上移动的行),但您也可以嵌套在 Do While 循环中。

      Option Explicit
      
      Sub delete()
      
        dim x as long, numrows as long
      
        with Worksheets("WIP")
      
          numrows = .Cells(Rows.Count, "A").End(xlUp).Row
      
          For x = 1 To numrows
      
            Do While InStr(1, Range("B" & x), "out", vbTextCompare) > 0
              Rows(x).Delete
            Loop
      
          Next
      
        End With
      
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-08
        • 1970-01-01
        • 1970-01-01
        • 2019-08-04
        • 2019-09-18
        • 1970-01-01
        • 1970-01-01
        • 2021-11-11
        相关资源
        最近更新 更多