首页 > 解决方案 > 循环通过过滤数据透视表,将每个可见值添加到范围中的下一个单元格

问题描述

我目前在循环过滤数据透视表并将每个可见值添加到预定范围内的下一个单元格时处于停顿状态。

到目前为止,我已经整理了以下业余的 vba 代码。但我的输出不如预期。它似乎只将最终值添加到提供范围内的所有单元格。

请参阅编辑,代码正在从数据透视表中提取所有数据,忽略适当的过滤器并且在到达联合结束时不会停止(A,B,C,D)

Private Sub GenerateConsumableCard_Click()

Dim Pt As PivotTable
Dim Pf As PivotField
Dim Pi As PivotItem
Dim C As Range

Set Pt = Sheets("Cards").PivotTables("PivotTable1")
Set Pf = Pt.PivotFields("Consumable Name")
Set KB1 = Sheets("Cards").Range("D11")
Set KB2 = Sheets("Cards").Range("K11")
Set KB3 = Sheets("Cards").Range("D22")
Set KB4 = Sheets("Cards").Range("K22")
Set CRange = Union(KB1, KB2, KB3, KB4)

With Pt
    .PivotCache.Refresh
    .PivotCache.MissingItemsLimit = xlMissingItemsNone

For Each C In CRange.Cells
    For Each Pi In Pf.PivotItems
        If Pi.Visible = True Then
           C.Value = Pi
        End If
    Next Pi
Next C

End With
End Sub

我整理的背后的想法是;根据数据透视表中当前存在的信息,范围中的每个单元格将具有不同的值。IE 数据透视表中的第一个可见值将转到单元格 D11,第二个到单元格 K11,第三个到单元格 D22.... 等等。

任何帮助将不胜感激!

编辑:

看来我的问题不止一个。我相信我可能引用了我的数据透视表的完全错误的部分?下面是当前表格的图像。

和以前一样,我想拉出“Consumable Name”下的各个值,并将它们按顺序放入“CRange”中的单元格值中。

示例数据透视表

编辑2:

所以我又做了一些改变,但都没有奏效。

Private Sub GenerateConsumableCard_Click()

Dim Pt As PivotTable
Dim Pf As PivotField
Dim Pi As PivotItem
Dim C As Range

Set Pt = Sheets("KanBans").PivotTables("PivotTable1")
Set Pf = Pt.PivotFields("Consumable Name")
Set KB1 = Sheets("KanBans").Range("D11")
Set KB2 = Sheets("KanBans").Range("K11")
Set KB3 = Sheets("KanBans").Range("D22")
Set KB4 = Sheets("KanBans").Range("K22")
Set CRange = Union(KB1, KB2, KB3, KB4)

With Pt
    .PivotCache.Refresh
    .PivotCache.MissingItemsLimit = xlMissingItemsNone

For Each Pi In Pf.VisibleItems
For Each C In CRange.Cells
           C.Value = Pi
     Next
Next

End With
End Sub

它现在似乎正确地循环通过数据透视表,但忽略了放置在数据上的过滤器并提取所有项目,直到最后一个项目。我相信我可能也对自己感到困惑:

For Each C In CRange

因为它正确地遍历范围,但一旦所有范围都被填满,它就不会停止。

温暖的问候

标签: excelvba

解决方案


示例中的代码在枢轴中的所有项目上运行,每个项目进入所有 CRange 单元格,最后一个项目留在所有单元格中。

由于它始终是枢轴中的 4 个项目,以及 CRange 中的 4 个项目,因此我们可以遍历其中任何一个,但不能同时遍历两者,因此您不需要嵌套循环。

然后VisibleItems不是你要找的,你应该使用DataRange.

 i = 1
 For Each C In CRange.Cells
       C.Value = Pf.DataRange.Item(i)
       i = i + 1
 Next

推荐阅读