Vba 筛选数据透视表数据字段

Vba 筛选数据透视表数据字段,vba,excel,pivot,pivot-table,Vba,Excel,Pivot,Pivot Table,我正试图找出如何根据计算和列(数据字段)正确过滤数据透视表,以便能够收集过滤后留下的标签和值。 示例优于文字,这是我的透视表(使用下面代码中的代码创建): 行标记事物的总和 XXXXXXXX 0 YYYYYYYY 0 zzzzzzzz2045 aaaaaaaa0 BBB 0 我想要的是基于值字段(事物的总和)过滤数据透视表,并且只保留大于0的行 那就留给我 行标记事物的总和 zzzzz2045 一旦我把所有元素都保留下来,我想得到所有这些值(行标签+大于0的事物之和),并将它们复制到另一张表中。

我正试图找出如何根据计算和列(数据字段)正确过滤数据透视表,以便能够收集过滤后留下的标签和值。 示例优于文字,这是我的透视表(使用下面代码中的代码创建):

行标记事物的总和
XXXXXXXX 0
YYYYYYYY 0
zzzzzzzz2045
aaaaaaaa0
BBB 0

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

那就留给我

行标记事物的总和
zzzzz2045

一旦我把所有元素都保留下来,我想得到所有这些值(行标签+大于0的事物之和),并将它们复制到另一张表中。

以下是我迄今为止所做的工作:

创建数据透视表

  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
最后,当尝试循环浏览剩下的项目(过滤后)时,似乎它们都仍然可见,即使它们已被过滤掉(我正在循环浏览整个数据透视项目集,即使是那些等于0的项目,我希望避免)

我想要的只是循环

ZZZZZZZZZ         2045
我真的不明白为什么这些过滤后的元素仍然被认为是可见的


感谢您的帮助

我能够重现您的问题:虽然应用了值过滤器,
pivottm.Visible
仍然是
True
Visible
属性似乎不适用于通过标签或值过滤器过滤的项目

如果要获取可见行标签及其对应值,可以使用数据透视字段的数据范围。例如,要复制可见的行标签及其对应的值,请执行以下操作:

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)
乔恩·佩尔蒂埃的书是一本有用的指南


注意:如果过滤掉所有元素,这种方法将复制标题,例如“行标签”和“事物总和”。您可以使用
Intersect
来测试
copyRng
是否与
PivotField
LabelRange
重叠,以避免在这种情况下进行复制。

非常感谢您的帮助,尽管我的解释很不清楚,但您的解决方案非常有效。我已经找到了一个使用基本循环的解决方案,但这不是我喜欢做的,现在我得到了一个好的解决方案
Set copyRng = Union(.DataRange, pivotTbl.DataBodyRange)