【发布时间】: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
我已经运行了以下测试以试图找出问题所在(重申一下,我只是接管了模板,我没有这样做,所以我需要测试一下):
- 我删除了所有条件格式,看看它是否来自这里,隐藏行同样慢。
- 我已恢复文件并将所有公式替换为值,并且处理时间从 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"-逐页查看是否可以完全关闭计算。