我正在尝试找出如何根据计算得出的总和列(数据字段)正确过滤数据透视表的方法,以使我能够收集过滤后剩余的标签和值。 示例胜于文字,这是我的数据透视表(使用以下代码中的代码创建):
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
我真的不知道为什么这些过滤后的元素仍然被认为是可见的
感谢您的帮助
答案 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}}重叠,以避免在这种情况下进行复制。