【问题标题】:Performance of deleting many rows from an autofilter in VBA从 VBA 中的自动过滤器中删除多行的性能
【发布时间】:2015-05-29 03:08:32
【问题描述】:

我想知道是否有比我使用的代码更快的方法。我使用 xlUp 从记录器中获取了代码。

 rCnt = Cells(Rows.Count, "B").End(xlUp).Row
 ActiveSheet.Range("$B$1:$J" & rCnt).AutoFilter Field:=5, _
      Criteria1:=Application.Transpose(arrCodes), Operator:=xlFilterValues
 Rows("2:" & rCnt).Delete Shift:=xlUp

实际上,如果有某种方法可以翻转过滤器,我根本不需要删除,因为这是我从中复制的临时表。然而,我所有的研究都未能找到解决办法

Criteria1:=Application.Transpose(<>arrCodes)

并且 arrCodes 有太多元素无法在过滤器中列出。不在 arrCodes 中的东西太多了,无法从中创建一个数组。谢谢。

【问题讨论】:

  • 我认为“翻转”是指反向/相反,如Not。有了这个,如果我在 VBA 之外执行此操作,我将通过过滤、着色可见单元格然后过滤非着色单元格来进行“反向”搜索。然后,您可以将反向过滤器复制到其他地方。您还可以使用Advanced Filter 专门搜索一长串&lt;&gt;item 类型条件。
  • 我可以试试你的颜色创意。如果我过滤我想要删除的内容,然后将其涂成红色,然后在非红色单元格上重新过滤,我将拥有我需要的内容而无需删除。无论如何,这是我的假设。
  • 这就是我通常的做法。使用普通 UI 而不是 VBA 更容易测试,看看它是否符合您的要求。
  • 这很好用。这几乎是瞬间的。它允许我操纵表格并获得我想要的可见内容,因此我只需将其快速复制到主表格即可。谢谢。我可以将评论标记为答案,还是您需要将此想法作为答案提交?
  • 我将其添加为答案,因此您可以接受它是否有效。我稍后会删除 cmets。

标签: excel performance vba filter


【解决方案1】:

如果您只想使用 Excel UI 而不是公式或 VBA,您可以执行以下简单步骤来获取“反向”过滤器。如果需要,可以将其移植到 VBA:

  • 在相反的条件下应用过滤器
  • 为一列中的单元格着色(字体或背景)
  • 清除过滤器
  • 再次过滤,但这次是按该列中没有颜色的单元格
  • 将这些结果复制到您想要的位置

如果列已经有一些背景颜色,这将无法正常工作。如果是这种情况,您可以添加一个新列并为其着色。如果这是在 VBA 中,您可以自动执行这些步骤。有限制,但如果适用的话,这将是快速和简单的。

【讨论】:

  • 这非常有帮助。我确实必须将所有可见单元格设置为 NoFill,因为电子表格的报告是从彩色单元格中导出的。我也在 VBA 中执行了此操作,但我不知道如何将代码放入 cmets 中以显示它。
【解决方案2】:

我过去在构建然后删除范围方面取得了成功。您可以将范围与Union() 结合使用。我附上了一些示例代码,它并不精彩,但它显示了基本概念。此示例删除第 2 行到第 11 行的 A 列中的奇数行。

Public Sub DeleteRows()
  Dim deleteThis As Range

  For i = 2 To 11
    If Sheet1.Cells(i, 1).Value Mod 2 = 1 Then
      If deleteThis Is Nothing Then
        Set deleteThis = Sheet1.Rows(i)
      Else
        Set deleteThis = Union(deleteThis, Sheet1.Rows(i))
      End If
    End If
  Next i

  deleteThis.Delete xlShiftUp
End Sub

【讨论】:

  • 如果您不确定如何以这种方式测试您的 arrCode,请询问。我假设这是你的移调范围。
  • arrCodes 是我从列中读取的数组(允许将来添加项目)。它需要被转置以使过滤器工作。查看每一行,建立一个范围,然后删除它比仅仅删除过滤器的结果更快吗?我问是因为过滤器部分是即时的,然后您就可以删除所有可见的内容。
  • 如果您必须使用 AutoFilter 对象,我建议使用 rangeObjectg.SpecialCells(xlCellTypeVisible) 选择可见单元格,清除过滤器,然后删除它们。如果您正在复制单元格,在复制之前仍然选择可见单元格,但您不必清除过滤器。如果编写正确,在 VBA 中进行过滤并在 VBA 中构建选择(范围对象)应该一样快或更快。您还可以在 VBA 代码运行时关闭屏幕更新和计算。
猜你喜欢
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多