Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在VBA中从自动筛选中删除多行的性能_Excel_Performance_Vba_Filter - Fatal编程技术网

Excel 在VBA中从自动筛选中删除多行的性能

Excel 在VBA中从自动筛选中删除多行的性能,excel,performance,vba,filter,Excel,Performance,Vba,Filter,我想知道是否有比我正在使用的代码更快的方法来实现这一点。我从录音机里用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

我想知道是否有比我正在使用的代码更快的方法来实现这一点。我从录音机里用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)
Criteria1:=应用程序转置(arrCodes)

而且arrCodes的元素太多,无法在筛选器中列出。而arrCodes中没有的东西太多了,无法用它们组成一个数组。谢谢

过去,我成功地先构建然后删除一个范围。您可以将范围与
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

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

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

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

如果您不确定如何以这种方式测试您的ARRcode,请询问。我假设这是一个转置范围。arrCodes是我从列中读取的数组(允许将来添加项)。它需要转换以使过滤器工作。查看每一行,建立一个范围,然后删除它是否比删除过滤器的结果更快?我这样问是因为过滤器部分是即时的,然后您就可以看到所有要删除的内容。如果您必须使用AutoFilter对象,我建议您使用
rangeObjectg.SpecialCells(xlCellTypeVisible)
选择可见单元格,清除过滤器,然后删除它们。如果要复制单元格,在复制之前仍然选择可见单元格,但不必清除过滤器。如果写得正确,在VBA中进行过滤和在VBA中构建选择(范围对象)应该同样快或更快。您还可以在VBA代码运行时关闭屏幕更新和计算。我将“flip”理解为与
Not
相反的意思。这样,如果我在VBA之外执行此操作,我将通过过滤、着色可见单元格,然后过滤非着色单元格来执行“反向”搜索。然后,您可以将反向过滤器复制到其他地方。您还可以使用
高级过滤器
专门搜索一长串
项目
类型标准。我可以试试您的颜色想法。如果我过滤掉我想删除的内容,然后把它涂成红色,再过滤掉非红色的单元格,我就可以得到我需要的而不需要删除。不管怎样,这是我的假设。我通常是这样做的。用普通的用户界面而不是VBA来测试它是否符合你的要求要容易得多。这很有效。这几乎是瞬间的。它允许我操作表并获得我想要的可见内容,因此我只需快速将其复制到主表。谢谢我是否能够将评论标记为答案,或者您是否需要将此想法作为答案提交?我将其添加为答案,以便您可以接受它是否有效。我会删除一些评论。这非常有帮助。我确实必须将所有可见单元格设置为NoFill,因为电子表格是从这些单元格导出的。我也在VBA中执行了此操作,但我不知道如何将代码放在注释中以显示它。