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" & i)
用于使用联合,因为如果没有 2 个范围,联合就会出错。所以对于第一个范围(当 rng 为空或什么都没有时),你设置rng=new_rng=ws.Range("A" & i)
并参考this question了解如何使用自动过滤器和循环删除以上是关于excel vba 删除行直到条件的主要内容,如果未能解决你的问题,请参考以下文章