1

我在网上和这里搜索过,但找不到任何似乎符合要求和工作的东西。我有一些有效的代码,但是因为范围的长度在删除行时会发生变化,因此它不会捕获所有要删除的行,所以我最终运行了几次,这不是很好......所以我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 个结果会正确显示,所以我不确定为什么当我以编程方式执行此操作时它们没有显示?

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

电子表格可以在这里找到

4

4 回答 4

5

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

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

这将过滤成本 = 0,然后删除与过滤器匹配的所有行。

运算符自动等于,因此您不需要“=£0.00”作为参数。

我在 ActiveSheet 中添加了 AutoFilter 以摆脱未找到的对象,并且 Offset 使其不删除标题。

于 2012-07-19T13:55:06.017 回答
2

出于性能原因,我会以另一种方式来做(逐行阅读+删除很慢)。我之前回答过一个类似的问题,我认为它也很适用于你的帖子。

我建议你可以做的:

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

读/转换数据在内存中进行,读写只进行一次。

在这个线程中,你有我之前写的代码: Execution of VBA code get slow after many iterations

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

于 2012-07-19T13:50:56.817 回答
1

您需要做的是在范围内后退一步,因为在 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对宏的方法没有影响。它基本上会为宏执行的每个操作关闭“屏幕闪烁”,使其运行得更快、更流畅,从而获得用户体验。

于 2012-07-19T13:50:36.453 回答
0

你可以拥有它,所以每当它删除一行时,它要么回到列的顶部,要么你可以从计数中减去一个。无论哪种方式,它都不会跳过任何行。我会提供实际的代码,但我是 VBA 的新手,不太知道该怎么做。

于 2012-07-19T13:44:46.393 回答