2

動的で、可能なすべてのページ フィルターの組み合わせを実行してレポートを生成するマクロを作成しようとしています。

現在、AccountManager と CostCenter の 2 つのフィルターしかありません。以下のマクロは、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

この機能を動的に拡張する方法がわかりません。つまり、いくつのページ フィルタが存在するかを読み取り、可能な組み合わせごとにレポートを作成します。

たとえば、もう 1 つのフィルター、Area を紹介します。次に、考えられるすべての組み合わせについてレポートを作成する必要があります。以下に例を示します。

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

私が十分に明確かどうかはわかりません。私はすべてを見ようとしましたが、解決策を見つけることができませんでした。2 つのページ フィルターについてこの質問を受け、上記のソリューションを実装しましたが、頭の中で動的にしたいので、昨日から頭痛がします。

4

2 に答える 2

0

これは私のために働くものです!

これは、可能なすべてのページ フィールドの組み合わせをループします。より最適化されたバージョンが存在すると確信しています。しかし、私はコンピューティングのバックグラウンドを持っていません。これは私が興味を持った問題の 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
于 2013-05-04T19:18:31.763 に答える