为什么一个小的Excel VBAmacros运行速度非常慢

我正在撰写一个简短的macros,以隐藏当前没有当前销售额的所有客户。 年初至今的销售额在K列(特别是K10-250)。 这些单元格使用vlookup从另一个选项卡中抽取数据,在这里我们转储数据。 我的问题是为什么这个macros需要10-15分钟才能运行? 在另一个电子表格中,我有一个类似的macros,超过1,500行只需要2-3分钟。 我已经closures了屏幕更新。 我想不出任何会加快速度的东西。

Sub HideNoSlackers() ' ' HideNoSlackers Macro ' ' Application.ScreenUpdating = False ' Sheets("CONSOLIDATED DATA").Select Dim cell As Range For Each cell In Range("K10:K250") If cell.Value = 0 Then cell.EntireRow.Hidden = True Else cell.EntireRow.Hidden = False End If Next End Sub 

隐藏行之前,您可能需要将计算设置为手动? 你也可以摆脱你的情况下的If语句。 尝试这个:

 Sub HideNoSlackers() Dim cell As Range, lCalcState As Long Application.ScreenUpdating = False ' Record the original Calculation state and set it to Manual lCalcState = Application.Calculation Application.Calculation = xlCalculationManual For Each cell In ThisWorkbook.Worksheets("CONSOLIDATED DATA").Range("K10:K250") cell.EntireRow.Hidden = (cell.Value = 0) Next ' Restore the original Calculation state Application.Calculation = lCalcState Application.ScreenUpdating = True ' Don't forget set ScreenUpdating back to True! End Sub 
 Sub HideNoSlackers() Dim cell As Range, rng As Range, rngHide As Range Set rng = Sheets("CONSOLIDATED DATA").Range("K10:K250") rng.EntireRow.Hidden = False For Each cell In rng.Cells If cell.Value = 0 Then If Not rngHide Is Nothing Then Set rngHide = Application.Union(rngHide, cell) Else Set rngHide = cell End If End If Next If Not rngHide Is Nothing Then rngHide.EntireRow.Hidden = True End Sub 

你为什么用macros来做这个?

如果您在数据上创build了一个表格,则可以在销售列中设置一个filter,该filter仅显示销售额<> 0的filter。

macros在excel中很有用,但是大多数人为了macros而采取的行动可以在excel中本地完成。

一定有其他的东西是错的。 尝试没有。select表,但这并不是一个巨大的改善

注意行默认是可见的,所以Else语句应该是可选的。

 Sub HideNoSlackers() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False Sheets("CONSOLIDATED DATA").Cells.EntireRow.Hidden = False Dim cell As Range For Each cell In Sheets("CONSOLIDATED DATA").Range("K10:K250") If cell.Value = 0 Then cell.EntireRow.Hidden = True Next Application.EnableEvents = True Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub 

最短的代码以非常不同的方式实现相同的目标:

 Sub column_K_not_NULL Sheets("CONSOLIDATED DATA").Select If ActiveSheet.FilterMode Then Selection.AutoFilter 'if an autofilter already exists this is removed ActiveSheet.Range("$K$10:$K$250").AutoFilter Field:=1, Criteria1:="<>0" End Sub 

当然你可以把标准的最低标准像

 application.calculation = Manual Application.ScreenUpdating = False 

并在最后的其他方式。 马克斯

尝试禁用分页符。 我有一个类似的问题,会发生在从工作表打印的人之后。 这打开了分页符,随后的脚本运行将永远持续下去。

 ActiveSheet.DisplayPageBreaks = False 

我们发现,版本4.1.0.1533中的Syncplicity程序将macros速度降低了15倍,因为事件触发了同步性。

Application.EnableEvents = False

;在这里做你的工作

Application.EnableEvents = True

速度又回来了。