Скрытие нескольких строк одновременно, когда ячейка в строке соответствует другой ячейке - PullRequest
0 голосов
/ 23 апреля 2020

Вариант использования: для каждой ячейки в столбце A (RangeK5: K700), в которой указан текст c (в данном примере «Неделя 1») в ячейке B2, строка в таблице, содержащая указанный c текст будет скрыт

У меня есть код, который работает, но это занимает много времени, так как таблица, которую я сейчас «фильтрую», велика и со временем получит больше строк. Мне интересно, есть ли способ ускорить код. Я не большой объектно-ориентированный эксперт, поэтому я склонен кодировать «длинный» путь. Я думаю (моя терминология будет неправильной, поэтому извините), что если бы я мог как-то отслеживать все строки, чтобы скрыть, а затем скрыть их в конце, а не в каждом l oop, это было бы быстрее. Это возможно?

Я «понял» это с помощью поиска и молитвы в Google, поэтому, если есть какие-либо изменения, которые я могу сделать, я буду признателен, если вы их услышите. Большое спасибо заранее !!

Примечание: В2 может иметь до 13 различных опций (неделя 1 -> неделя 13 и c). Я покажу код, только если B2 "Неделя 1"

Sub CycleThroughWorksheet()
    Set Target = Range("B2")
    If Target.Value = "Week 1" Then
        Call HideWeek2
        Call HideWeek3
        Call HideWeek4
        Call HideWeek5
        Call HideWeek6
        Call HideWeek7
        Call HideWeek8
        Call HideWeek9
        Call HideWeek10
        Call HideWeek11
        Call HideWeek12
        Call HideWeek13
    End If
End Sub

------

Sub HideWeek1()
For Each Cell In Worksheets("Gantt Table").Range("K5:K700").Cells
If Cell.Text = "Week 1" Then
Cell.EntireRow.Hidden = True
End If
Next
End Sub

-------

Sub RunWeekView()
Call PreventScreenFlicker
Rows.EntireRow.Hidden = False
Call CycleThroughWorksheet
End Sub

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Вы можете использовать событие Worksheet_Change для AutoFilter ваших данных на основе значения в Range("B2"). Щелкните правой кнопкой мыши на вкладке своего рабочего листа и выберите View Code, скопируйте и поместите этот код в окно кода объекта рабочего листа в окне Visual Basi c для приложений (должна быть включена вкладка РАЗРАБОТЧИК). Когда вы изменяете Week # в целевой ячейке (B2), код будет скрывать строки, содержащие целевой Week # в Column K, и отображать другие недели, используя "<>", в Criteria1 ,

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("B2")) Is Nothing Then
        With Range("K4", Range("K" & Rows.Count).End(xlUp))
            .AutoFilter 1, Criteria1:="<>" & Target.Value
        On Error Resume Next
        End With
    End If
End Sub

Если вы действительно хотите показать только Week #, вы можете изменить код, удалив "<>" ...

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("B2")) Is Nothing Then
        With Range("K4", Range("K" & Rows.Count).End(xlUp))
            .AutoFilter 1, Criteria1:= Target.Value
        On Error Resume Next
        End With
    End If
End Sub
0 голосов
/ 23 апреля 2020

Пакетная операция скрытия может быть выполнена следующим образом:

Sub HideWeek(WeekNum As Long)
    Dim rng As Range
    For Each Cell In Worksheets("Gantt Table").Range("K5:K700").Cells
        If Cell.Text = "Week " & WeekNum Then
            If rng is nothing then
                Set rng = Cell
            Else
                Set rng = Application.Union(rng, Cell)
            End If  
        End If
    Next
    If not rng is nothing then rng.entirerow.hidden = true
End Sub

Вызов (например)

HideWeek 1
HideWeek 2

et c.

В зависимости от того, что Остальная часть вашего кода выглядит так, как будто есть другие изменения, которые вы могли бы сделать, чтобы уменьшить размер вашего кода. Если вы обычно скрываете большинство строк, то лучше сначала спрятать все, а затем показывать только те строки, которые вы хотите.

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