【问题标题】:Hiding rows is extremely slow隐藏行非常慢
【发布时间】:2020-08-08 01:22:27
【问题描述】:

我在隐藏工作表中的行时遇到问题,我希望能得到一些建议。 该工作表总共有 1380 行,一直到 DM 列,所以它并不大。 这 1380 行被分成由命名范围(例如 GOTO_GA)识别的部分,命名范围内包含所有内容(_FilterDatabase),我需要通过单击顶部的一些按钮来单独显示每个部分。我通过隐藏 _FilterDatabase 并仅取消隐藏 GOTO_GA 来做到这一点。

问题是,即使我关闭了所有我能想到的东西,请参阅下面的代码,rngToHide.Hidden = True 仍然非常慢,30 秒。

我还有什么可以加快速度的吗?

Sub testHideRows()
    Dim rngToHide As Range, rngToShow As Range

    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    ActiveSheet.DisplayPageBreaks = False

    Set rngToHide = Range("_FilterDatabase").EntireRow  '1273   ROWS
    Set rngToShow = Range("GOTO_GA").EntireRow          '16 ROWS , INCLUDED IN rngToShow
    TIME0 = Now()
    rngToHide.Hidden = True                             'THIS IS EXTREMLY SLOW 28 SECONDS
    TIME1 = Now()
    Debug.Print Format(TIME1 - TIME0, "hh:NN:SS")
    rngToShow.Hidden = False                            'THIS IS INSTANT

    setProgramAlertsOn
End Sub

我已经运行了以下测试以试图找出问题所在(重申一下,我只是接管了模板,我没有这样做,所以我需要测试一下):

  1. 我删除了所有条件格式,看看它是否来自这里,隐藏行同样慢。
  2. 我已恢复文件并将所有公式替换为值,并且处理时间从 30 秒下降到大约 3 秒,因此绝对是公式中的某些东西减慢了速度。

但是现在我问你们:Application.Calculation 设置为 xlCalculationManual,那么在这种情况下仍然计算什么公式?

【问题讨论】:

  • 我无法用我用过的任何测试范围重现这种缓慢。对我来说一切都很快。您能否与我们分享_FilterDatabase 的 Range.Address 值?只是想知道这个范围是否有什么不寻常的地方。
  • 您还能将Range("GOTO_GA").EntireRow 中的Range 限定为工作表吗?我不是 100% 确定它会在这里有所帮助,但它也是最佳代码执行(和无错误编码)的最佳实践。
  • 同意,我无法在 O365 中重现此内容。使用这个宏,_FilterDatabase连续1300行,show非连续10行,时间过去了00:00:00
  • _FilterDatabase 是之前开发者创建的一个简单的命名范围,它指向一个静态地址。唯一特别的是它的命名范围 .hidden 属性设置为 true,所以我在公式 - 名称管理器中看不到它,你认为这会导致问题吗?
  • 抱歉,我错过了那一行:(。几点:1. Application.EnableEvents = False 仅禁用工作簿和工作表事件。但在你的情况下,我认为这不是问题;2.如果隐藏的行与其他工作表或图表(尤其是)相关,那么即使将计算设置为手动,其他计算仍然可能触发;3. 尝试在工作表上使用“Worksheets("XXX").EnableCalculation = False"-逐页查看是否可以完全关闭计算。

标签: excel vba show-hide


【解决方案1】:

我在 Excel 2016 中遇到了同样的问题。 设置

Application.ScreenUpdating = False 
Application.EnableEvents = False 
ActiveSheet.DisplayPageBreaks = False 

没有帮助。

DID 的帮助在于确定应该显示/隐藏的行范围并一步完成,所以我有一个循环来确定哪些行应该将 Hidden 属性分别更改为 rg_to_hide/rg_to_show 和在循环之后,如果确定的范围不是 Nothing,我会更改确定范围的所有行的 Hidden 属性。 对于我的数据,我将执行时间从大约 25 秒减少到了 2 秒。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-15
    • 2019-04-06
    • 2013-02-18
    • 1970-01-01
    • 2012-07-08
    • 2018-10-06
    • 1970-01-01
    • 2014-08-07
    相关资源
    最近更新 更多