Excel高级过滤器运行速度很慢,但仅在运行自动过滤后

时间:2015-10-20 04:46:05

标签: excel excel-vba excel-2010 vba

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

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

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

3 个答案:

答案 0 :(得分:2)

在我的情况下,我以编程方式创建命名范围供以后使用,这些命名范围使用.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,认为它有大量的数据需要过滤。通过检查并确保它仅过滤您认为应该过滤的范围来取消它。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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