我正在尝试创建一个动态宏,并通过所有可能的页面过滤器组合运行并生成报告。
现在,我只有两个过滤器: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个页面过滤器中被问到这个问题,我已经实现了上面的解决方案,但是从昨天开始我就很头疼,因为我想让它在我的脑海中是动态的。
使用递归过程,如下所示
。
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)
我还没有测试它,但它应该-稍加调整-工作
这就是我的工作!
循环遍历所有可能的页面字段组合。我确信存在一个更优化的版本。但我没有计算机背景,这是我感兴趣的一个问题
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