如何在带有嵌套If循环的Excel VBA For循环中提高性能?
这是我的第一篇帖子,所以如果我需要做任何修改,请告诉我 我已经找到了一些优化循环的方法,但我似乎无法将其中任何一种有效地应用到我的代码中。我要做的是在一列中循环大约170个单元格,并根据单元格值是否为0隐藏或显示整行 我希望每次激活某些工作表时都运行代码。现在,这段代码运行大约需要4秒钟。看起来它应该比那快得多!这就是我来这里寻求帮助的原因 下面是我正在使用的代码(FormatSheet返回一个布尔值,其中True表示可以在此工作表上执行此代码,False表示跳过在此工作表上执行此代码:如何在带有嵌套If循环的Excel VBA For循环中提高性能?,vba,excel,nested-loops,ranged-loops,Vba,Excel,Nested Loops,Ranged Loops,这是我的第一篇帖子,所以如果我需要做任何修改,请告诉我 我已经找到了一些优化循环的方法,但我似乎无法将其中任何一种有效地应用到我的代码中。我要做的是在一列中循环大约170个单元格,并根据单元格值是否为0隐藏或显示整行 我希望每次激活某些工作表时都运行代码。现在,这段代码运行大约需要4秒钟。看起来它应该比那快得多!这就是我来这里寻求帮助的原因 下面是我正在使用的代码(FormatSheet返回一个布尔值,其中True表示可以在此工作表上执行此代码,False表示跳过在此工作表上执行此代码: Pri
Private Sub mobjWb_SheetActivate(ByVal Sh As Object)
Dim r As Long
Dim z As Long
Dim varray As Variant
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
If Not FormatSheet(Sh) Then
Exit Sub
End If
Set varray = Range("$F$1", Cells(Rows.count, "F").End(x1up)).Value
For Each r In varray
z = r.Value
If z = 0 Then
Range("F" & r).EntireRow.Hidden = True
Else
Range("F" & r).EntireRow.Hidden = False
End If
Next r
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
End Sub
有几个非常微小的变化:
Sub qwerty()
Dim r As Range
Dim z As Long, N As Long
Dim varray As Range
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
N = Cells(Rows.Count, "F").End(xlUp).Row
Set varray = Range("F1:F" & N)
For Each r In varray
z = r.Value
If z = 0 Then
r.EntireRow.Hidden = True
Else
r.EntireRow.Hidden = False
End If
Next r
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
End Sub
运行速度相当快有一件事可能会加快一点速度。我不会使用z变量。您可以对现有的r执行同样的操作
For Each r In varray
If r.Value = 0 Then
Range("F" & r).EntireRow.Hidden = True
Else
Range("F" & r).EntireRow.Hidden = False
End If
Next r
我认为最快的方法可能是使用autofilter。将autofilter设置为值0,瞧!您尝试过autofilter吗?这行
Set varray=Range($F$1),Cells(Rows.count,“F”)。End(x1up)).Value
有一个输入错误。在xlup
中有一个1
而不是l
。如果这不仅仅是一个传输输入错误,我敢打赌你在100多万行中循环。@ScottCraner-很好的捕获。另一个总是使用选项Explicit
的好理由是这样编译的吗?我不认为你可以“针对每个”wi这是一个长变量。另外,为什么要将范围指定给变量?范围本身是一个非常有用的数组。最后,我认为“Find”函数通常比循环范围更快。@ScottCraner这实际上是一个“1”在那一行。复制时它看起来一定不一样。此外,我确实使用了Option Explicit——它只是在这个类模块的代码中的更高级。谢谢!我现在正在尝试。这部分还可以吗(在For Each语句之前)?code
如果不是格式表(Sh),那么如果code