【发布时间】:2012-07-27 20:45:08
【问题描述】:
我已经在网上和这里搜索过,但找不到任何似乎符合要求和工作的东西。我有一些有效的代码,但是因为范围的长度在删除行时会发生变化,所以它不会捕获所有要删除的行,所以我最终运行了几次,这不是很好......所以我m 现在正在尝试此线程上推荐的 AutoFilter 方法。
我有一个包含几列的电子表格,其中一列是“成本”。我需要遍历“成本”列(有时可能是第 9 列,有时是第 10 列,因此下面的“查找”位)并删除成本为 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
当我运行它时,它会将过滤器应用于正确的范围和正确的列。然后我收到错误消息:“运行时错误'424':需要对象”,适用于AutoFilter.Range.Delete 行。当我按下“结束”或“调试”并查看电子表格时,过滤器已应用于正确的列并检查了正确的选项(0.00 英镑),但没有返回任何结果(我知道我需要这样做将来出现这种情况时会进行一些错误处理,但目前该过滤器应该至少返回 10 行)。如果我在电子表格中的过滤器设置上手动按“确定”(不更改任何设置!)我的 10 个结果会正确显示,所以我不确定为什么当我以编程方式执行此操作时它们没有显示?
如果需要,很乐意提供电子表格示例,这真的让我很困惑!
电子表格可以找到here
【问题讨论】:
-
如前所述,遍历范围是效率最低的方法。将范围存储在一个数组中,然后在其中循环将提供一些速度提升。另一种更快的方法是使用
Find或MATCH函数而不是循环。但是,我发现最快的方法是使用自动过滤器。 SO上有许多其他示例(尽管此处提供了答案):delete special rowsdelete row based on condition等 -
谢谢 Zairja - 这也是我将按照其他几个人的建议使用的方法,非常感谢大家的帮助!
标签: vba excel excel-2007