【问题标题】:Excel Advanced Filter Very slow to run, but only after autofilter has been runExcel 高级筛选器运行速度非常慢,但仅在运行自动筛选器之后
【发布时间】:2016-01-18 14:44:03
【问题描述】:

我有一个非常困难的问题,我已经尝试解决了几天,非常感谢一些帮助,因为我已经尝试完全研究这个问题。 一张纸我在 32 位 Excel 2010 中有一个数据库(18 列和 72,000 行),因此它是一个大型数据库。在这张表上,我还有一些条目可以自动过滤某些列,以及一个高级过滤器。当我运行高级过滤器时,数据过滤器正好在 1 秒内。如果我运行自动过滤器(通过 vba 宏)然后运行高级过滤器后记,高级过滤器需要 60 秒才能运行,即使 将 autofiltermode 设置为 false。这是我尝试过但没有运气的方法

  • 删除工作表上的所有形状
  • 工作表上没有 cmets,因此无需删除
  • 删除所有常规和条件格式
  • 关闭自动过滤模式
  • 将工作表上的所有单元格文本设置为 WrappedText = False
  • 取消保护工作表
  • 取消隐藏任何行和列
  • 删除任何排序 (.sort.sortfields.clear)

还有什么可能导致此代码运行速度慢 60 倍,但只有在自动过滤器先前在工作表上运行之后,我怎样才能将其返回到该状态?任何和所有的帮助将不胜感激

【问题讨论】:

  • 如果您可以发布一组精​​确的步骤来复制问题,或者显示问题的示例工作簿,将会有所帮助。
  • 感谢蒂姆的建议。该工作簿很大并且是为客户设计的,所以我不能在此处包含它,但是导致问题的步骤相对简单。
  • 我忘记添加我已将自动计算设置为手动、禁用事件并将屏幕更新设置为 False数据过滤器集。一旦我运行自动过滤器(就地过滤器),然后清除自动过滤器。然后再次尝试高级过滤器,它需要 60 倍的时间
  • 看来您的情况很难复制。使用 30k 行时我没有看到任何减速:自动过滤前后没有不同。

标签: excel excel-2010 vba


【解决方案1】:

在我的例子中,我以编程方式创建命名范围以供以后使用,这些命名范围使用 .End(xlDown) 功能来查找数据集的结尾。例如:

Set DLPRange = .Range(.Cells(2, indexHeaders(2)), .Cells(i, indexHeaders(2)).End(xlDown))
DLPRange.Name = "DLPRangeName"

... 在我的例子中,它创建了一个从起始单元格到文档结尾的列范围。最初,这种查找范围的“坏”方式没有引起注意,因为工作簿的文件格式是 .xls 并且最大为 65k 行。当我需要更多时,我强迫它创建一个 .xlsm 格式的工作簿,它有大约 1M 行。过滤器在整个列上运行,即使其中大部分是空的,导致巨大的时间开销。

tl;dr:您欺骗了 excel,认为它有大量数据需要过滤。通过检查并确保它只过滤您认为应该过滤的范围来取消它。

【讨论】:

    【解决方案2】:

    经过试验和大部分错误后,我找到了解决方案。我确定几乎任何操作,即使没有自动过滤器也会导致这种减速,我觉得这只是 Excel 的所有数据的内存问题(即使它有时会运行查找,我猜的“缓存”会填满然后运行缓慢。 所以我所做的是使用一个新的临时工作簿,其中高级过滤器将在过滤器上添加数据。然后我把这些数据复制到我的工作簿中。然后我关闭了这个临时工作簿而不保存它。这也使代码运行时间从 1 秒缩短到 0.3 秒,而且无论我运行什么代码或在原始工作簿上做了什么,我都没有遇到过缓慢的高级过滤器运行时间。 我发布了这个,所以如果其他人有类似的问题,他们可能会使用它作为大量数据的解决方案。

    【讨论】:

      【解决方案3】:

      有点晚了,但最近我在一个不太大的数据库(4000 多行,70 列)上遇到了同样的问题并解决了它,所以只是分享。 就我而言,问题在于数据范围内的包装文本。如您所说,将 WrappedText 设置为 false 有帮助是不够的,您需要在您过滤的范围内替换 Chr(10) 。巨大的差异。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-12
        • 2020-09-25
        • 1970-01-01
        • 1970-01-01
        • 2012-05-25
        • 1970-01-01
        相关资源
        最近更新 更多