在pivot + VBA + Dynamic Solution中运行所有可能的页面filter组合

我正在尝试创build一个dynamic的macros,并通过页面filter的所有可能的组合并生成报告。

现在,我只有两个filter:AccountManager和CostCenter,下面的macros运行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 

我不知道如何扩展这个function是dynamic的,即它读取了多less个页面filter,然后为每个可能的组合准备报告。

比方说,我介绍另一个filter – 区域。 那么它应该产生所有可能的组合报告。 下面是一个例子:

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

不知道我是否清楚。 我试图看遍,但找不到解决scheme。 我被问了这个问题的2页filter,我已经实现了上述解决scheme,但我从昨天起头痛,因为我想它是在我的脑海里dynamic。

使用recursion过程,如下所示

例如

 Sub RunForALlItems(PT as pivotTable, count as integer) numFields= PT.pageFields.count for each PI in PT.pageFields(num).PivotItems PT.pageFields(num).CurrentPage = PI.Name if (num=numFields) then call run_Report elseif (num<numFields) then call RunForAllItems(PT, count+1) end if next end sub 

然后用它来调用

 RunForAllItems(PT, 1) 

我还没有testing过 ,但是应该稍微调整一下

这是对我有用的东西!

这遍历所有可能的页面字段的组合。 我相信存在一个更优化的版本。 但是我不是从计算背景出发,这是一个让我感兴趣的问题

 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