Сокрытие строк на основе разных диапазонов данных столбцов - PullRequest
3 голосов
/ 06 марта 2019

Я довольно плохо знаком с использованием VBA и пытаюсь создать код, который будет просматривать два разных столбца с различными диапазонами данных и скрывать строки за последней точкой данных (ссылаясь на оба столбца).

На данный момент у меня есть это;

    Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
'Updateby Extendoffice 20160913
    Dim xRg As Range
    Application.ScreenUpdating = False
        For Each xRg In Range("G24:G71, N24:N71")
            If xRg.Value = "" Then
                xRg.EntireRow.Hidden = True

            Else
                xRg.EntireRow.Hidden = False
            End If
        Next xRg
    Application.ScreenUpdating = True
End Sub

Столбец G и столбец N являются именами людей в двух отдельных сводных таблицах. Таким образом, в зависимости от дня диапазон данных в каждом из этих столбцов может различаться (сводная таблица имеет разные фильтры). Например, сегодня может быть 50 строк данных в столбце G и 40 в столбце N. В этом случае приведенная выше формула сработает и скроет строки с 51 по 71 без данных. Однако, если столбец G содержит 40 строк данных и столбец N имеет 50 строк, тогда он будет ссылаться на столбец G и скрывать строки 41–71, скрывая ненужные данные из столбца N.

Есть ли способ заставить код смотреть на столбцы G & N, определять, который имеет больший диапазон данных, и скрывать строки за этой точкой.

Заранее спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Попробуйте это:

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
    Dim xRg As Range, xCell As Range, bHide As Boolean
    Application.ScreenUpdating = False
        For Each xRg In Range("G24:G71, N24:N71").Rows
            bHide = True
            For Each xCell In xRg.Cells
                If IsEmpty(xRg.Value) = False Then
                    bHide = False
                End If
            Next xCell
            xRg.EntireRow.Hidden = bHide
        Next xRg
    Application.ScreenUpdating = True
End Sub

Объяснение ошибки: ваш код перебирает все ячейки и принимает решение на основе отдельных ячеек. Это неверно, потому что вы хотите знать, являются ли обе ячейки в строке пустыми.

Решение. Таким образом, вы должны перебирать строки во внешнем цикле, а ячейки внутри данной строки во внутреннем цикле. Обратите внимание на наличие непустой ячейки и примите решение о скрытии строки, основываясь на этом.

Обновление

Извините, мой код не работал, потому что Range("G24:G71, N24:N71") состоит из 2 .Areas, и хотя .Rows.Count возвращает 48, For Each перечисляет 96 "строк", каждая из которых состоит из 1 ячейки (48 строк для каждой области).

Я изменил код, чтобы учесть Области:

Private Sub Worksheet_PivotTableUpdate()
    Application.ScreenUpdating = False
    With Range("G24:G71,N24:N71")
        Dim r As Long: For r = 1 To .Areas(1).Rows.Count
            Dim bHide As Boolean: bHide = True
            Dim xArea As Range: For Each xArea In .Areas
                If IsEmpty(xArea.Cells(r, 1).Value) = False Then
                    bHide = False
                End If
            Next xArea
            .Rows(r).EntireRow.Hidden = bHide
        Next r
    End With
    Application.ScreenUpdating = True
End Sub
0 голосов
/ 06 марта 2019

Это еще один способ зацикливания сводной таблицы. Приведенный ниже кодовый цикл в двух разных столбцах («Предметы и количество») и скрытых строках:

Option Explicit

Sub Hide()

    Dim pvtTable As PivotTable
    Dim pvtItem As PivotItem
    Dim pvtRow As Long

    'Set table with name
    Set pvtTable = ThisWorkbook.Worksheets("Sheet1").PivotTables("PivotTable1")
    'Loop Items in a specific field
    For Each pvtItem In pvtTable.PivotFields("Item").PivotItems
        'Check conditions
        pvtRow = pvtRow + 1

        If pvtItem.Value = "A" Then
            pvtTable.DataBodyRange.Rows(pvtRow).EntireRow.Hidden = True
        ElseIf pvtItem.Value <> "A" And pvtTable.DataBodyRange.Rows(pvtRow).EntireRow.Hidden = True Then
            pvtTable.DataBodyRange.Rows(pvtRow).EntireRow.Hidden = False
        End If

    Next pvtItem

    'Loop Items in a specific field
    For Each pvtItem In pvtTable.PivotFields("Quantity").PivotItems
        'Check conditions
        pvtRow = pvtRow + 1

        If pvtItem.Value = "A" Then
            pvtTable.DataBodyRange.Rows(pvtRow).EntireRow.Hidden = True
        ElseIf pvtItem.Value <> "A" And pvtTable.DataBodyRange.Rows(pvtRow).EntireRow.Hidden = True Then
            pvtTable.DataBodyRange.Rows(pvtRow).EntireRow.Hidden = False
        End If

    Next pvtItem

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