根据列中的条件删除行

我在网上search,但在这里找不到任何似乎符合法案和工作的东西。 我有一些代码可以工作,但是因为范围的长度会随着删除行而变化,所以它不能捕获所有要删除的行,所以我最终运行了好几次,这不是很好,现在尝试按照这个线程推荐的AutoFilter方法。

我有一个电子表格,有几列,其中之一是“成本”。 我需要通过'成本'栏(有时可能是第9列,有时10,因此'find'位下面),并删除任何成本为0的行…

下面是我写的代码,任何帮助将非常,非常感谢!

– 编辑3:更多的代码更改已经完成…新的代码如下。

Sub RemoveRows() Dim cell As Range Dim lastRow As Long Dim lastColumn As Integer Dim criteraColumn As Integer Dim criteriaRange As Range lastRow = Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row lastColumn = Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column Rows(1).EntireRow.Select criteriaColumn = Selection.Find(What:="Cost", After:=ActiveCell, LookIn:= _ xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _ xlNext, MatchCase:=False, SearchFormat:=False).Column Set criteriaRange = Range("A1", Cells(lastRow, lastColumn)) criteriaRange.AutoFilter Field:=criteriaColumn, Criteria1:="£0.00" AutoFilter.Range.Delete ActiveSheet.AutoFilterMode = False End Sub 

当我运行这个,它适用于正确的范围和正确的列filter。 然后我得到错误信息:“运行时错误”424“:所需的对象”适用于AutoFilter.Range.Delete行。 当我按下“结束”或“debugging”,看看电子表格,filter已被应用到正确的列,并检查正确的选项(0.00英镑),但没有结果返回(我知道我需要做在将来会出现这种情况时会出现一些error handling,但是现在应该至less有10个由这个filter返回的行)。 如果我手动按电子表格中的filter设置“确定”(不改变任何人)!我的10个结果显示正确,所以我不知道为什么他们没有显示,当我这样做以编程?

很高兴提供电子表格的例子,如果需要的话,这真是令我困惑!

电子表格可以在这里find

您应该能够使用Excel自动筛选删除行。

 Cells.AutoFilter Field:=criteriaColumn, Criteria1:="£0.00" ActiveSheet.AutoFilter.Range.Offset(1).Delete ActiveSheet.ShowAllData 

这将过滤cost = 0,然后删除所有匹配filter的行。

操作员自动等于是不需要“=£0.00”作为参数。

我在ActiveSheet中添加了AutoFilter来摆脱找不到的对象,Offset使它不会删除标题。

我会做另一种方式,出于性能原因(读取+逐行删除速度慢)。 我以前回答过类似的问题,我觉得这个也适合你的post。

我build议你可以这样做:

  • 不是逐行读取表格,而是将整个范围加载到一个数组中,
  • 而不是逐行删除,将所需的值传输到内存中的第二个数组中;
  • 当你有你需要的数据,应用oRange.clearcontents清除当前范围;
  • 通过应用oRange = vArray将新的数据数组显示到工作表中。

读取/转换数据在内存中执行,读写仅执行一次。

在这个线程中,你有我之前编写的代码: 执行VBA代码后很多迭代变得缓慢

让我知道这是否可以帮助你,或者如果你希望收到更多的具体信息/代码。

您需要做的是向后退一步,因为在Excel中,删除行会自动将行向上移动一行。

更换:

  For Each cell In criteriaRange.Cells If cell.Value = 0 Then cell.EntireRow.Delete End If Next cell 

附:

 Dim i As Integer For i = criteriaRange.Rows.Count To 1 Step -1 If criteriaRange.Cells(i) = 0 Then criteriaRange.Cells(i).EntireRow.Delete End If Next 

此外, ScreenUpdating对macros的方法没有影响。 它基本上closures了“macros观屏幕闪烁”的每一个动作,使其运行速度更快,更平滑的用户体验。

你可以这样做,只要它删除一行,它可以返回到列的顶部,或者你可以从计数中减去一个。 无论哪种方式,它不会跳过任何行。 我会提供实际的代码,但我是新的VBA,并不知道如何做到这一点。