在pivot&x2B;中运行所有可能的页面过滤器组合;VBA和x2B;动态解

在pivot&x2B;中运行所有可能的页面过滤器组合;VBA和x2B;动态解,vba,dynamic,excel,combinations,Vba,Dynamic,Excel,Combinations,我正在尝试创建一个动态宏,它可以运行所有可能的页面过滤器组合并生成报告 现在,我只有两个过滤器:AccountManager和CostCenter,下面的宏将遍历AccountManager的所有值及其对应的CostCenter值,并准备一份报告 Sub Run_All_Reports() Dim PT As PivotTable Dim PF As PivotField Dim PI As PivotItem, PI2 As PivotItem Sheets(

我正在尝试创建一个动态宏,它可以运行所有可能的页面过滤器组合并生成报告

现在,我只有两个过滤器:AccountManager和CostCenter,下面的宏将遍历AccountManager的所有值及其对应的CostCenter值,并准备一份报告

Sub Run_All_Reports()
    Dim PT As PivotTable
    Dim PF As PivotField
    Dim PI As PivotItem, PI2 As PivotItem

    Sheets("Pivot").Activate
    Set PT = ActiveSheet.PivotTables("Budget")

    For Each PI In PT.pageFields(1).PivotItems
        PT.pageFields(1).CurrentPage = PI.Name
        For Each PI2 In PT.pageFields(2).PivotItems
            PT.pageFields(2).CurrentPage = PI2.Name
            Call Run_Report
        Next
    Next
End Sub
我不知道如何将此功能扩展为动态功能,即它读取存在多少页面筛选器,然后为每个可能的组合准备报告

比方说,我引入了另一个过滤区域。然后,它应该为所有可能的组合生成报告。下面是一个例子:

John, Marketing, London
John, Marketing, NewYork
John, Sales, London
Sam, Sales, London
Sam, Sales, NewYork

不知道我是否足够清楚。我试着到处找,但找不到解决办法。有人问我这个关于2页过滤器的问题,我已经实现了上面的解决方案,但从昨天开始我就很头疼,因为我希望它在我的头脑中是动态的。

使用递归过程,类似于以下内容

e、 g


我还没有测试过它,但是它应该——稍微调整一下——起作用

这对我来说是有效的

这将遍历所有可能的页面字段组合。我确信存在一个更优化的版本。但我不是计算机出身,这是我感兴趣的一个问题

Sub All_Comb()
    Dim PT As PivotTable
    Dim PI As PivotItem, PI2 As PivotItem
    Dim totPF As Integer, i As Integer
    Dim elemCountArray() As Integer

    Sheets("Pivot").Activate
    Set PT = ActiveSheet.PivotTables("Budget")
    totPF = PT.PageFields.Count

    ReDim elemCountArray(0 To totPF)
    For i = 1 To totPF
        elemCountArray(i) = PT.PageFields(i).PivotItems.Count
    Next i

    For i = 1 To totPF
        For y = 1 To elemCountArray(i)
            PT.PageFields(i).CurrentPage = PT.PageFields(i).PivotItems(y).Name
            If (i < totPF) Then
                Call SetUpFields(PT, i + 1, elemCountArray(i + 1), totPF, elemCountArray())
            End If
        Next y
    Next i
End Sub

Sub SetUpFields(PT As PivotTable, PFid As Integer, elemCount As Integer, totPF As Integer, elemCountArray() As Integer)
    For y = 1 To elemCount
        PT.PageFields(PFid).CurrentPage = PT.PageFields(PFid).PivotItems(y).Name
        If (PFid < totPF) Then
                Call SetUpFields(PT, PFid + 1, elemCountArray(PFid + 1), totPF, elemCountArray())
        End If
    Next y
End Sub
Sub All_Comb()
数据透视表
将PI作为数据透视项,将PI2作为数据透视项
Dim totPF为整数,i为整数
Dim elemCountArray()作为整数
图纸(“枢轴”)。激活
Set PT=ActiveSheet.PivotTables(“预算”)
totPF=PT.PageFields.Count
ReDim elemCountArray(0到totPF)
对于i=1到totPF
elemCountArray(i)=第页字段(i).PivotItems.Count
接下来我
对于i=1到totPF
对于y=1到elemCountArray(i)
PT.PageFields(i).CurrentPage=PT.PageFields(i).数据透视项(y).名称
如果(i
RunForAllItems(PT, 1)
Sub All_Comb()
    Dim PT As PivotTable
    Dim PI As PivotItem, PI2 As PivotItem
    Dim totPF As Integer, i As Integer
    Dim elemCountArray() As Integer

    Sheets("Pivot").Activate
    Set PT = ActiveSheet.PivotTables("Budget")
    totPF = PT.PageFields.Count

    ReDim elemCountArray(0 To totPF)
    For i = 1 To totPF
        elemCountArray(i) = PT.PageFields(i).PivotItems.Count
    Next i

    For i = 1 To totPF
        For y = 1 To elemCountArray(i)
            PT.PageFields(i).CurrentPage = PT.PageFields(i).PivotItems(y).Name
            If (i < totPF) Then
                Call SetUpFields(PT, i + 1, elemCountArray(i + 1), totPF, elemCountArray())
            End If
        Next y
    Next i
End Sub

Sub SetUpFields(PT As PivotTable, PFid As Integer, elemCount As Integer, totPF As Integer, elemCountArray() As Integer)
    For y = 1 To elemCount
        PT.PageFields(PFid).CurrentPage = PT.PageFields(PFid).PivotItems(y).Name
        If (PFid < totPF) Then
                Call SetUpFields(PT, PFid + 1, elemCountArray(PFid + 1), totPF, elemCountArray())
        End If
    Next y
End Sub