Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在带有嵌套If循环的Excel VBA For循环中提高性能?_Vba_Excel_Nested Loops_Ranged Loops - Fatal编程技术网

如何在带有嵌套If循环的Excel VBA For循环中提高性能?

如何在带有嵌套If循环的Excel VBA For循环中提高性能?,vba,excel,nested-loops,ranged-loops,Vba,Excel,Nested Loops,Ranged Loops,这是我的第一篇帖子,所以如果我需要做任何修改,请告诉我 我已经找到了一些优化循环的方法,但我似乎无法将其中任何一种有效地应用到我的代码中。我要做的是在一列中循环大约170个单元格,并根据单元格值是否为0隐藏或显示整行 我希望每次激活某些工作表时都运行代码。现在,这段代码运行大约需要4秒钟。看起来它应该比那快得多!这就是我来这里寻求帮助的原因 下面是我正在使用的代码(FormatSheet返回一个布尔值,其中True表示可以在此工作表上执行此代码,False表示跳过在此工作表上执行此代码: Pri

这是我的第一篇帖子,所以如果我需要做任何修改,请告诉我

我已经找到了一些优化循环的方法,但我似乎无法将其中任何一种有效地应用到我的代码中。我要做的是在一列中循环大约170个单元格,并根据单元格值是否为0隐藏或显示整行

我希望每次激活某些工作表时都运行代码。现在,这段代码运行大约需要4秒钟。看起来它应该比那快得多!这就是我来这里寻求帮助的原因

下面是我正在使用的代码(FormatSheet返回一个布尔值,其中True表示可以在此工作表上执行此代码,False表示跳过在此工作表上执行此代码:

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