Excel 以更高效的方式隐藏/显示行

Excel 以更高效的方式隐藏/显示行,excel,vba,Excel,Vba,我想做的是加速当前的进程。我有一个5周的生产计划。下面是一个userform的示例代码,我使用它根据用户希望看到的内容确定哪些行需要隐藏(例如,如果你计划在4周内完成某项工作,并且它有自己的行,你不想在2周视图选项中看到它,所以你需要隐藏这一行。下面的总体代码很好,但只在我的机器上运行,这台机器功能非常强大。不幸的是,有很多用户的电脑速度慢得多,我想探索可能的操作来帮助他们。)加快速度。我阅读了其他类似的主题,其中一个建议是创建一个帮助器列并使用自动筛选。还有其他选项吗 Sub show2wee

我想做的是加速当前的进程。我有一个5周的生产计划。下面是一个userform的示例代码,我使用它根据用户希望看到的内容确定哪些行需要隐藏(例如,如果你计划在4周内完成某项工作,并且它有自己的行,你不想在2周视图选项中看到它,所以你需要隐藏这一行。下面的总体代码很好,但只在我的机器上运行,这台机器功能非常强大。不幸的是,有很多用户的电脑速度慢得多,我想探索可能的操作来帮助他们。)加快速度。我阅读了其他类似的主题,其中一个建议是创建一个帮助器列并使用自动筛选。还有其他选项吗

Sub show2weeks()

    Dim hideRange As Range
    Dim myRow As Range
    Dim wc As Integer
    Dim wr As Range: Set wr = ThisWorkbook.Worksheets("2 week plan").Range("G4:AD4")
    Dim week As String
    week = "week 2"  'zmienic tutaj
Range(Cells(1, 7), Cells(1, 30)).EntireColumn.Select
Selection.EntireColumn.Hidden = False

    Application.ScreenUpdating = False

    wc = wr.Find(what:=week, SearchDirection:=xlPrevious, LookAt:=xlWhole, LookIn:=xlValues).Column

    Application.Calculation = xlCalculationManual

    Set hideRange = Sheets("2 Week plan").Range(Cells(7, 7), Cells(1000, wc)) 'you must set this to apply to the range you want (you could use active selection if you wanted)
    For Each myRow In hideRange.Rows
        If Application.WorksheetFunction.Sum(myRow) = 0 Then 'if the sum of the row=0 then hide
            myRow.EntireRow.Hidden = True
            Else
            myRow.EntireRow.Hidden = False
        End If
    Next

Range(Cells(1, 7), Cells(1, 30)).EntireColumn.Select
Selection.EntireColumn.Hidden = False

Range(Cells(1, wc + 1), Cells(1, 30)).EntireColumn.Select
Selection.EntireColumn.Hidden = True

Application.Calculation = xlCalculationAutomatic

End Sub'''


查看您的代码,切换屏幕更新开/关将进一步提高计算之外的性能。因此,请尝试:

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

'// your code here //

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub
另一种方法是先隐藏所有行,然后一次隐藏。
在循环中,尝试这样先隐藏所有行:

Dim forHide As Range '// add another variable to hold all the ranges //

For Each myRow In hideRange.Rows
  If Application.WorksheetFunction.Sum(myRow) = 0 Then
    If Not forHide Is Nothing Then
      Set forHide = Union(forHide, myRow) '// get all the ranges together //
    Else
      Set forHide = myRow
    End If
  End If
Next

forHide.EntireRow.Hidden = True '// hide all rows in one go //

除了
AutoFilter
之外,还有另外两个选项。但如果有办法实现
AutoFilter
,那将是最快的。希望这会有所帮助。

查看您的代码,打开/关闭屏幕更新将在计算之外进一步提高性能。因此,请尝试:

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

'// your code here //

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub
另一种方法是先隐藏所有行,然后一次隐藏。
在循环中,尝试这样先隐藏所有行:

Dim forHide As Range '// add another variable to hold all the ranges //

For Each myRow In hideRange.Rows
  If Application.WorksheetFunction.Sum(myRow) = 0 Then
    If Not forHide Is Nothing Then
      Set forHide = Union(forHide, myRow) '// get all the ranges together //
    Else
      Set forHide = myRow
    End If
  End If
Next

forHide.EntireRow.Hidden = True '// hide all rows in one go //

除了
AutoFilter
,还有另外两个选项。但是如果有办法实现
AutoFilter
,那将是最快的。希望这会有帮助。

冒着脱离主题的风险(你有工作代码),这可能是一篇很好的帖子。我建议你把你的问题贴在那里=)是的。我认为使用
autofilter
是最快的方法。另一种方法是先获取所有受影响的行,然后一次性隐藏。如果禁用屏幕更新,您的代码也会运行得更快。
Select
通常会减慢速度,您可能希望阅读。有可能会偏离主题(您有工作代码),这可能是一个很好的帖子。我建议你把你的问题贴在那里=)是的。使用
autofilter
是我认为最快的方法。另一种方法是先获取所有受影响的行,然后在一次遍历中隐藏。如果禁用屏幕更新,您的代码也会运行得更快。
Select
通常会减慢速度,您可能需要阅读。