筛选枢纽分析表资料栏位

时间:2018-09-10 16:42:57

标签: excel vba excel-vba pivot pivot-table

我正在尝试找出如何根据计算得出的总和列(数据字段)正确过滤数据透视表的方法,以使我能够收集过滤后剩余的标签和值。 示例胜于文字,这是我的数据透视表(使用以下代码中的代码创建):

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

我想要基于值字段(总和)过滤数据透视表,并且仅保留大于0的行。

这样我就可以离开

Row Labels Sum of things ZZZZZZZZZ 2045

一旦我剩下所有元素,我想获取所有这些值(行标签+大于零的总和)并将其复制到另一个工作表中。

这是我到目前为止所做的:

创建数据透视表

  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

执行我想要的过滤器:仅保留“总和”大于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

最后,当尝试遍历剩下的项目(过滤后)时,即使它们已经被滤除,它们似乎仍然仍然可见(我遍历整个PivotItems,甚至等于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 :(得分:1)

我能够复制您的问题:尽管应用了值过滤器,但PivotItm.Visible仍然是True。似乎Visible属性不适用于 Label Value 过滤器过滤的项目。

如果要获取可见行标签及其对应的值,则可以使用DataRange中的PivotField。例如,类似这样的操作可以复制可见的行标签及其对应的值:

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

或者,如果您的数据透视表没有显示总计,那么您可以使用DataBodyRange来引用数据透视表中的整个值范围:

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

Jon Peltier的Referencing Pivot Table Ranges是有用的指南。

N.B。如果所有元素被过滤掉,则此方法将复制标头,例如“行标签”和“总和”。您可以使用Intersect来测试copyRng是否与LabelRange的{​​{1}}重叠,以避免在这种情况下进行复制。