【问题标题】:For Each loop only deleting some of the cells meeting the criteriaFor Each 循环只删除一些符合条件的单元格
【发布时间】:2016-04-10 10:02:22
【问题描述】:

我写了一个子程序,用于删除 A 列中的单元格包含全大写文本的所有行。

当我运行它时,它只会删除一些行,而不是全部。就好像它没有在整个范围内循环。

Sub changeIt()

Dim iHolder As String, rng As Range

Set rng = Range("A1:A19")

For Each Cell In rng

    iHolder = UCase(Cell)

        If StrComp(Cell, iHolder, vbBinaryCompare) = 0 Then

            Cell.EntireRow.Delete

        End If
Next Cell

End Sub

谢谢

【问题讨论】:

    标签: vba excel loops for-loop


    【解决方案1】:

    For Each 替换为For ... NextStep -1

    在您的情况下,如果您删除该行,则其下方的行会向上移动一个位置。因此,您的 ForEach 会跳过一些行,因为它的内部指针总是向前移动一个位置 - 无论是否有删除。你应该可以很容易地发现用铅笔和纸模拟它的问题。

    最简单的解决方案是使用For ... Next从下到上迭代行

    For i = LastRowNumber To FirstRowNumber Step -1
        ...
        If StrComp(...) = 0 Then
            Cell.EntireRow.Delete
        End If        
        ...
    Next
    

    【讨论】:

      【解决方案2】:

      您可能希望最大化性能并仅在一个语句中删除行

      所以你可以像下面这样去

      Sub changeIt()
      
      Dim unionRng As Range, rng As Range
      
      Set rng = Range("A1:A19")
      Set unionRng = Range("B1") '"dummy" range, to prevent Union method from failing the first time it's called
      
      For Each cell In rng
          If StrComp(cell, UCase(cell), vbBinaryCompare) = 0 Then Set unionRng = Union(unionRng, cell)
      Next cell
      If unionRng.Count > 1 Then Intersect(unionRng, rng).EntireRow.Delete ' Intersect method removes the "dummy" range from the one whose rows are to be deleted
      
      End Sub
      

      我还附上了一种“公式”方法,它不会遍历单元格并使用“帮助”列(要扫描的范围右侧的列),因此它必须是“免费的”

      Option Explicit
      
      Sub changeIt2()    
      Dim rng As Range
      
      Set rng = Range("A1:A19")    
      With rng.Offset(, 1)
          .FormulaR1C1 = "=IF(exact(Upper(RC[-1]),RC[-1]),"""",1)"
          .value = .value
          .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
          .Clear
      End With
      
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-20
        • 2015-11-12
        • 1970-01-01
        • 2013-10-08
        • 2015-11-10
        • 2015-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多