【问题标题】:Looping through pivot items that have been filtered循环遍历已过滤的枢轴项目
【发布时间】:2019-03-13 11:58:54
【问题描述】:

我正在尝试将数据透视表的数据值复制到另一个工作表中,但是因为我在“隐藏”一些行标签的数据透视表中进行过滤,所以当我遍历数据透视字段的数据透视项时在行标签中,它比实际应该循环的次数多。为了说明我的问题,这里是我使用的代码。

Sub Prob()
Dim Ptable1 as PivotTable
Dim PField as PivotField
Dim PField2 as PivotField
Dim NumOfPItem as Long
Dim PItem as PivotItem
Dim aCell as Range

Set Ptable1 = ActiveSheet.PivotTables("PivotTable1")

With Ptable1.PivotFields("DataCol5")
    .CurrentPage = "12/2/2018"
End With

PField = Ptable1.PivotFields("DataCol1")
NumOfPItem = PField.PivotItems.Count

For each PItem in PField.PivotItems
   'Some code to get a cell reference in another worksheet

   'and then some code to copy the value from the pivot table to cells.
   aCell.Offset(0,1).Value = PField2.PivotItems("XX01").DataRange.Cells(PItem.Position,1)
Next PItem
End Sub

我只是准备了一些简单的东西,以便抓住我面临的主要问题。

未过滤的数据透视表:

场地安排:

这是过滤后的数据透视表。

我尝试循环遍历使用 PivotItems.Visible 属性可见的枢轴项目,但这些项目都是可见的,因此循环遍历存在的每个枢轴项目。导致我的下一个屏幕截图。

正如所见,所有项目都被选中,因此当从枢轴字段循环遍历所有“可见”枢轴项目时,它将循环遍历 5 次,因为有 5 个不同的项目。然而,在这个例子中,在我进行一些过滤之后,我最终只得到了 1 个行标签,所以它应该只针对数据透视表中存在的内容循环一次。我在这里做错了什么?

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    您需要查看pivotitem 是否可见。另外,我注意到您正在使用 PI,这可能会与 PI 混淆,因此可能值得更改。

    这是一个例子

    Sub x()
    
    Dim p As PivotTable
    Dim pf As PivotField
    Dim pit As PivotItem
    
    Set p = ActiveSheet.PivotTables(1)
    Set pf = p.PivotFields("Name")
    
    For Each pit In pf.PivotItems
        Debug.Print pit.Visible
    Next pit
    
    End Sub
    

    【讨论】:

    • 我确实尝试过使用PivotItems.Visible 属性,但是它们都返回true,因此它会循环遍历每个数据透视项目,而不是过滤后显示的数据。这样做是因为如果您查看我的上一个屏幕截图,就会选择所有的数据透视项目。
    • 好的,你是如何过滤的,过滤器在顶部还是在返回的数据中?我稍后再试。
    • 是的。我在顶部进行过滤。
    • 复制数据可以使用databodyrange复制到aCell.Offset(0,1).
    • 如果我有 6-7 行数据,我怎么知道我需要循环多少次?
    【解决方案2】:
    Sub Solution()
    Dim Ptable1 as PivotTable
    Dim PField as PivotField
    Dim PField2 as PivotField
    Dim NumOfRows as Long
    Dim PItem as PivotItem
    Dim aCell as Range
    Dim PFRng as Range
    Dim i as long
    
    Set Ptable1 = ActiveSheet.PivotTables("PivotTable1")
    
    With Ptable1.PivotFields("DataCol5")
        .CurrentPage = "12/2/2018"
    End With
    
    PField = Ptable1.PivotFields("DataCol1")
    PFRng = PField.DataRange
    NumOfRows = PFRng.Rows.Count
    
    For i = 1 to NumOfRows
       'Some code to get a cell reference in another worksheet
    
       'and then some code to copy the value from the pivot table to cells.
       aCell.Offset(0,1).Value = PField2.PivotItems("XX01").DataRange.Cells(i,1)
    Next i
    End Sub
    

    我找到了解决方案。我不会循环遍历在数据透视字段中找到的每个数据透视项,而是获取数据透视字段的数据范围,查找数据范围中有多少行,然后从 1 开始循环到最后一行。这样我就不必担心什么是可见的。我可以使用“i”代替枢轴项位置来获取同一行但不同字段中的值。

    【讨论】:

    • 如果有更好的解决方案,请告诉我,因为这个解决方案是我能想到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    相关资源
    最近更新 更多