2017-04-17 111 views
3

我有一个子过程删除包含大约1000行的范围中的行。 行在critera上被删除。下面的代码工作。Excel VBA删除for循环中的行缺失行

但是,当我运行宏时,通常必须在删除包含删除条件的所有行之前运行它4次。

我想这是因为for循环在删除一行时突然消失的情况下会错过它的索引。

我的第一个代码看起来像这样。

Set StatusRange = Range("B2", Range("B2").End(xlDown)) 

     For Each StatusCell In StatusRange 
        If StatusCell = "FG" Then 
         StatusCell.EntireRow.Delete 
        ElseIf StatusCell = "QC" Then 
         StatusCell.EntireRow.Delete 
        ElseIf StatusCell = "CS" Then 
         StatusCell.EntireRow.Delete 
        Else 
       End If 
    Next StatusCell 

当我尝试更新范围每个循环,它仍然无法正常工作。

Set StatusRange = Range("B2", Range("B2").End(xlDown)) 
    For Each StatusCell In StatusRange 
      If StatusCell = "FG" Then 
       StatusCell.EntireRow.Delete 
      ElseIf StatusCell = "QC" Then 
       StatusCell.EntireRow.Delete 
      ElseIf StatusCell = "CS" Then 
       StatusCell.EntireRow.Delete 
      Else 
     End If 

     Set StatusRange = Range("B2", Range("B2").End(xlDown)) 
     Next StatusCell 

有没有人知道这个问题?谢谢。

+1

从德自下而上的工作。如果你删除一行,一切都向上移动并昱欧上跳过该行下一次迭代 – Jeeped

+1

这几乎肯定是一个重复的问题,当我找到合适的重复项时,我会将其标记为这样。无论何时从集合中删除项目,您都必须从Rows.Count中删除1 Step -1 ''否则你会跳过行。 –

+0

继续前进,并认为这@DavidZemens - 我已经通过显示Case语句进行多重比较增加了一些价值,但这仍然是一个骗局。 – Jeeped

回答

6

从下往上工作。如果删除一行,则所有内容都会向上移动,并在下一次迭代中跳过该行。

下面是从底部开始工作的代码的'胆量'。

With Worksheets("Sheet1") 
    For rw = .Cells(.Rows.Count, "B").End(xlUp).Row To 2 Step -1 
     Select Case UCase(.Cells(rw, "B").Value2) 
      Case "FG", "QC", "CS" 
       .Rows(rw).EntireRow.Delete 
     End Select 
    Next rw 
End With 
+0

我正在写字面相同的答案(完成与'Case'语句)哈哈:D –

+0

该死的,我刚刚完成键入和张贴几乎完全相同的代码;) –

1

由于是为For Each你需要使用一个稍微不同的方法没有反向循环。

而且,你的代码有多个If S和OR是“尖叫的使用Select Case

Dim StatusRange As Range 
Dim i As Long 

Set StatusRange = Range("B2", Range("B2").End(xlDown)) 

' loop backward when deleting Ranges, Rows, Cells 
For i = StatusRange.Rows.Count To 1 Step -1 
    Select Case StatusRange(i, 1).Value 
     Case "FG", "QC", "CS" 
      StatusRange(i, 1).EntireRow.Delete 
     Case Else ' for the future if you need it 

    End Select 
Next i