For Each循环不会删除具有特定值的所有行

时间:2017-12-18 16:20:57

标签: excel vba

我想删除所有不包含值的行" Total"在范围内(" B11:B25")。

以下是我的代码。

Dim cell As Range

For Each cell In Range("B11:B25")
    If cell.Value <> "Total" Then
    cell.EntireRow.Delete
End If

Next

End Sub

上面的代码只会删除一些单元格中没有值&#34; Total&#34;的行。如果我必须删除所有不包含&#34; Total&#34;的行,我将不得不多次运行这是不切实际的。

2 个答案:

答案 0 :(得分:3)

修改你正在迭代的集合总是一个坏主意。当然你可以从底部开始并称之为一天,但接下来的问题是“我的代码速度很慢,如何让它更快?”

CombineRanges函数负责Union - 范围:

Private Function CombineRanges(ByVal source As Range, ByVal toCombine As Range) As Range
    If source Is Nothing Then
        Set CombineRanges = toCombine
    Else
        Set CombineRanges = Union(source, toCombine)
    End If
End Function

现在,更改循环,以便不是删除行,而是确定需要删除哪些行:

Dim toDelete As Range
Dim cell As Range
For Each cell In ActiveSheet.Range("B11:B25")
    If cell.Value <> "Total" Then Set toDelete = CombineRanges(toDelete, cell)
Next

If Not toDelete Is Nothing Then toDelete.EntireRow.Delete

现在你有一个有效的循环(总是迭代带有For Each循环的对象集合),它不会修改它迭代的对象集合,只做一件事,而你有一个Delete正在进行的操作,只会触发单个工作表Changed事件,一次重新计算,无论您是删除20行还是2000行,都会表现良好。

答案 1 :(得分:1)

试试这个,它将从第25行向后循环到11并找到任何不是“总计”

的东西
select t.*
from (select t.*,
             lead(value) over (partition by itemid order by date) as next_value
      from t
     ) t
where next_value is null or next_value <> value;