скрыть / показать строки более эффективным способом - PullRequest
1 голос
/ 10 января 2020

Я пытаюсь ускорить текущий процесс. У меня есть план производства с 5 неделями. Ниже приведен пример кода пользовательской формы, который я использую, чтобы определить, какие строки нужно скрыть, в зависимости от того, что пользователь хотел бы видеть (например, если у вас что-то запланировано через 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'''

1 Ответ

0 голосов
/ 10 января 2020

Глядя на ваш код, включение / выключение обновления экрана будет дополнительно улучшать производительность помимо расчета. Поэтому попробуйте:

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

'// your code here //

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

Другой способ - сначала спрятать все строки, а затем просто спрятать их в один go.
. В вашем l oop попробуйте сначала получить все строки следующим образом:

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 //

Это 2 других варианта, кроме AutoFilter. Но если есть способ реализовать AutoFilter, это будет самый быстрый способ. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...