Поле данных фильтра сводной таблицы - PullRequest
0 голосов
/ 10 сентября 2018

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

Row Labels Sum of things XXXXXXXXX 0 YYYYYYYYY 0 ZZZZZZZZZ 2045 AAAAAAAAA 0 BBBBBBBBB 0

Мне бы хотелось отфильтровать сводную таблицу на основеЗначение поля (сумма вещей), и только держать строки больше 0.

Так что это оставило бы меня с

Row Labels Sum of things ZZZZZZZZZ 2045

Как только я получу всеосталось элементов, Я хотел бы получить все эти значения (метка строки + сумма вещей больше 0) и скопировать их на другой лист.

Вот что я сделал такfar:

Создание сводной таблицы

  workBk.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
            workBk.Sheets(workSht.Name).Range("A1").CurrentRegion).CreatePivotTable _
            TableDestination:=workBk.Sheets(workShtPivot.Name).Cells(1, 1), _
            TableName:="PivotTableTest"

        With workBk.Sheets(workShtPivot.Name).PivotTables("PivotTableTest").PivotFields(whatToPivot)
            .Orientation = xlRowField
            .Position = 1
        End With

        workBk.Sheets(workShtPivot.Name).PivotTables("PivotTableTest").AddDataField workBk.Sheets(workShtPivot.Name).PivotTables("PivotTableTest").PivotFields("Net " & whatToPivot & " Amount"), "Sum of things", xlSum

Выполнение фильтра, который я хотел: оставляйте только строки, у которых «Sum of вещ» больше 0

workBk.Sheets(workShtPivot.Name).PivotTables("PivotTableTest").PivotFields(whatToPivot).PivotFilters.Add2 Type:=xlValueIsGreaterThan, _
                                                            DataField:=workBk.Sheets(workShtPivot.Name).PivotTables("PivotTableTest").PivotFields("Sum of things"), Value1:=0

Наконец, при попытке перебрать оставленные элементы (после фильтрации) кажется, что они все еще видны, даже если они отфильтрованы (я перебираювесь набор сводных элементов, даже те, которые равны 0, которых я бы хотел избежать)

Dim cellRange As Range
For Each pivotItm In workBk.Sheets(workShtPivot.Name).PivotTables("PivotTableTest").PivotFields(whatToPivot).PivotItems
    If pivotItm.Visible = True Then
        MsgBox (pivotItm.Value)
    End If
Next pivotItm

Что бы я хотелтолько циклы

ZZZZZZZZZ         2045

Я действительно не могу понять, почему эти отфильтрованные элементы все еще считаются видимыми

Спасибо за любую помощь

1 Ответ

0 голосов
/ 11 сентября 2018

Мне удалось воспроизвести вашу проблему: хотя фильтр значений применяется, PivotItm.Visible по-прежнему True. Кажется, что свойство Visible не применяется к элементам, отфильтрованным фильтрами Label или Value .

Если вы хотите получить видимые метки строк и их соответствующие значения, вы можете использовать DataRange из PivotField s. Например, что-то вроде этого, чтобы скопировать видимые метки строк и их соответствующие значения:

Sub FilterPTable()
    Dim pivotTbl As PivotTable
    Dim labelField As PivotField, sumField As PivotField
    Dim copyRng As Range

    Set pivotTbl = ThisWorkbook.Sheets("Sheet1").PivotTables("PivotTable2")
    Set labelField = pivotTbl.PivotFields("Labels")
    Set sumField = pivotTbl.PivotFields("Sum of Things")

    With labelField
        .ClearAllFilters
        .PivotFilters.Add2 Type:=xlValueIsGreaterThan, _
            DataField:=sumField, Value1:=0

        Set copyRng = Union(.DataRange, sumField.DataRange)
        copyRng.Copy ThisWorkbook.Sheets("Sheet2").Range("A1")
    End With
End Sub

Или, если в вашей сводной таблице не отображается Grand Totals , вы можете использовать DataBodyRange для ссылки на весь диапазон значений в сводной таблице:

Set copyRng = Union(.DataRange, pivotTbl.DataBodyRange)

Джон Пельтье Диапазоны ссылочной сводной таблицы - полезное руководство.

N.B. Если все элементы отфильтрованы, при таком подходе будут скопированы заголовки, например. «Метки строк» ​​и «Сумма вещей». Вы можете использовать Intersect, чтобы проверить, перекрывает ли copyRng LabelRange PivotField, чтобы избежать копирования в этом случае.

...