excel vba 删除行直到条件

Posted

技术标签:

【中文标题】excel vba 删除行直到条件【英文标题】:excel vba Delete rows until criteria 【发布时间】:2018-03-14 20:08:52 【问题描述】:

我是 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】:

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

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 尝试的方法。

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

【讨论】:

提前道歉,因为我对此很陌生。我试图应用上面的代码,但它似乎不起作用。我正在查看您的代码,但我不确定我是否理解。我想我理解代码的概念,但我无法掌握其中的某些行。为什么是“如果 rng 什么都没有然后设置”..?不应该是“如果 rng 不是什么就设置”?而且我不明白“rng = Union(rng,new_rng)”这一行。 rng 怎么可能等于它自己的一个 Union 和一个新的 rng? 另外,我不确定过滤器和删除方法如何解决这个特定问题。因为宏需要继续删除,直到满足条件。但是,只要可行,我愿意接受任何解决方案。 联合用于创建非连续范围,如Range("B1:B5","C42:C65","Z300"),因此您可以使用 delete 一次删除所有内容。因为删除动作很慢,所以如果你只删除一次,它可以优化执行这些动作的时间。而If rng Is Nothing Then Set rng = ws.Range("A" &amp; i) 用于使用联合,因为如果没有 2 个范围,联合就会出错。所以对于第一个范围(当 rng 为空或什么都没有时),你设置rng=new_rng=ws.Range("A" &amp; i) 并参考this question了解如何使用自动过滤器和循环删除

以上是关于excel vba 删除行直到条件的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA:从最大值循环并检查条件

VBA Excel - 将行复制到另一个带有条件的工作簿表

excel vba中如何获取筛选数据的正确行号

Excel VBA自动筛选器会继续删除与条件不匹配的数据

Excel VBA 根据某些遭遇删除行

excel文件打开时 vba满足条件弹窗提醒?