excel vba删除行直到条件

时间:2017-10-03 15:06:39

标签: vba excel-vba loops conditional delete-row

我是Excel VBA的新手,可以真正使用一些帮助。我尝试在整个网络上搜索解决方案,但无法找到类似的问题。

我正在尝试创建一个有助于根据特定条件删除行的宏,并继续删除行,直到满足另一个特定条件。

所以举个例子。在下表中,我想删除Col A = 1 AND Col C = 0的行,然后继续删除该行下面的行 UNTIL Col A = 1和Col C<> 0

  A  |  B  |  C
-----|-----|-----
 1   |  TC |  2 
-----|-----|-----
 2   |  TC |  1 
-----|-----|-----
 1   |  TC |  0 
-----|-----|-----
 2   |  TC |  2 
-----|-----|-----
 3   |  TC |  1 
-----|-----|-----
 1   |  TC |  2 
-----|-----|-----
 1   |  TC |  0
-----|-----|-----
 1   |  TC |  1
-----|-----|-----
 2   |  TC |  0
-----|-----|-----
 3   |  TC |  2

因此宏的最终结果是:

  A  |  B  |  C
-----|-----|-----
 1   |  TC |  2 
-----|-----|-----
 2   |  TC |  1 
-----|-----|-----
 1   |  TC |  2 
-----|-----|-----
 1   |  TC |  1
-----|-----|-----
 2   |  TC |  0
-----|-----|-----
 3   |  TC |  2

理想情况下,我想再次使用删除行进行循环,其中Col A = 2且Col C = 0并删除该行下面的行,直到Col A = 2且Col C<> 0

以下是我提出的宏。对所有建议开放并渴望学习。

Sub deleterow()

Range("C2").Select
Do Until ActiveCell.Offset(0, -2) = "1" And ActiveCell.Value <> "0"
If ActiveCell.Value = "0" And ActiveCell.Offset(0, -2) = "1" Then
Rows(ActiveCell.Row & ":" & Rows.Count).Delete
End If
Loop

End Sub

期待收到回复!

谢谢

1 个答案:

答案 0 :(得分:0)

您的循环在第一行停止,因为符合条件。因此,下面的代码从第一行循环到最后一行,以搜索标准。

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets(1) 'Set the first worksheet to work
Dim n As Long, i As Long
Dim rng As Range, new_rng As Range

lastrow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row 'lastrow number
For n = 1 To 2 'Criteria is Col A = 1 To 2
    For i = 1 To lastrow 'Loop from 1 to last row
        If ws.Cells(i, 1) = n And ws.Cells(i, 3) = 0 Then
            If rng Is Nothing Then Set rng = ws.Range("A" & i) 'Set first Range so Union won't give an error
            Set new_rng = ws.Range("A" & i)
            Set rng = Union(rng, new_rng) 'create a non contiguous range to delete
        End If
    Next i
Next n

rng.EntireRow.Delete
  

请注意,如果工作表很大,则不是最佳方法。有提高代码性能的最佳方法。使用循环,因为它是OP尝试的方法。

另一种方法是过滤多标准并删除显示的行。