更快的VBA隐藏行

我有一个代码,检查每一行,如果该行中的单元格是零(或空)。 如果某行适用于该规则,则该行将被隐藏。 如果不是,它仍然可见。

代码完美的工作,但是它非常非常慢(每次我运行它需要大约40秒完成)..

我想知道是否有人可以看到为什么我的代码是慢的(或有一个替代品,我可以使用哪个是比我现在的代码更快)..

Sub hide() ' Macro hides all rows with position "zero" or "blank" Dim wb As Workbook Dim ws As Worksheet Dim c As Range Dim targetRange As Range Set wb = ThisWorkbook Set ws = wb.Sheets("Sheet 1") Set targetRange = ws.Range("I10:N800") targetRange.EntireRow.Hidden = False For Each c In targetRange.Rows If (WorksheetFunction.CountIf(c, "<>0") - WorksheetFunction.CountIf(c, "") = 0) And (WorksheetFunction.CountA(c) - WorksheetFunction.Count(c) = 0) Then c.EntireRow.Hidden = True End If Next c End Sub 

在你的代码中最耗时的操作是每次你在你的工作表上执行操作,在你的情况下,当你隐藏每一行(多次),在这里:

 c.EntireRow.Hidden = True 

为了节省时间,每当满足条件时,只要将范围c添加到MergeRng ,并在最后(退出循环时),一次隐藏整行。

试试下面的代码:

 Dim MergeRng As Range ' define range object For Each c In targetRange.Rows If (WorksheetFunction.CountIf(c, "<>0") - WorksheetFunction.CountIf(c, "") = 0) And (WorksheetFunction.CountA(c) - WorksheetFunction.Count(c) = 0) Then If Not MergeRng Is Nothing Then Set MergeRng = Application.Union(MergeRng, c) Else Set MergeRng = c End If End If Next c ' hide the entire rows of the merged range at one time MergeRng.EntireRow.Hidden = True