2016-03-21 3 views
1

Ich habe mit normalen PivotTables in VBA gearbeitet, aber kürzlich habe ich einige Funktionen in den Pivot-Tabellen gefunden, die das Datenmodell verwenden, das ich wirklich mag - hauptsächlich "Distinct Count". Ich habe etwas Code in einer normalen Pivot-Tabelle, die die Tabelle für Datensätze "Like" eine Zeichenfolge filtert, und es funktioniert einwandfrei. Wie kann ich diesen Code mithilfe des Datenmodells in die Pivot-Tabelle konvertieren?Wie durchläuft ich die Filterelemente und blendet Elemente in einer Excel-PivotTable mithilfe des Datenmodells aus?

With ActiveSheet.PivotTables("Metrics").PivotFields("Reference number") 
    .Orientation = xlPageField 
    .Position = 1 
    .EnableMultiplePageItems = True 

    For i = 1 To .PivotItems.Count 
     If .PivotItems(i).Name Like "*oran*" Then 
      .PivotItems(i).Visible = False 
     End If 
    Next i 

End With 

Hier ist der Code, der erstellt wird, wenn ich ein Makro aufzeichnen und wählen Sie die Elemente manuell unter dem Datenmodell anzuzeigen:

ActiveSheet.PivotTables("Metrics").PivotFields("[RawData].[Status].[Status]"). _ 
VisibleItemsList = Array("[RawData].[Status].&[apple_434]", _ 
"[RawData].[Status].&[banana_689]", _ 
"[RawData].[Status].&[orange_1346]", _ 
"[RawData].[Status].&[orange_1454]") 

Dies ist die Richtung, die ich in Richtung bin, aber ich habe einige Mühe, den VisibleItemsList Array zugreifen:

With ActiveSheet.PivotTables("Metrics").PivotFields("[RawData].[Status].[Status]")  
    For i = 0 To UBound(.VisibleItemsList) 
     If i Like "*oran*" Then 
      i = "" 
      Debug.Print i 
     End If 
    Next i 
End With 

der Ausgang i numerisch 0,1,2,3,4 --not Text und die Zahlen scheinen nicht auf die Anzahl der Elemente in den Filter lis entsprechen t. Ich kann nicht herausfinden, wie ich auf die Objekte zugreifen soll, damit ich die Codes anzeigen oder ausblenden kann, die ich verwenden möchte. Ich werde ehrlich sein, dass ich nicht sehr lange mit Arrays gearbeitet habe.

+0

Muss es VBA sein? Können Sie dieses kostenlose Add-In installieren und die Filterlistenfunktion nutzen, um dies für Sie zu tun? http://olappivottableextend.codeplex.com/wikipage?title=Filter%20List&referringTitle=Home – GregGalloway

+0

Ich hatte jemanden auf eine ähnliche Anfrage als Antwort auf einige nicht-OLAP-Filter-Code, die ich auf http: // dailydoseofexel veröffentlicht hatte .com/archives/2013/11/14/filtering-pivots-based-on-external-bereiche/ Es hat lange gedauert und viele Hacks über VBA zu erreichen. Ich baue durch Code in ein kommerzielles Add-In, das auch komplexe Platzhalter und Ausschlüsse behandelt und auf eine Reihe von Suchbegriffen verweisen kann. Vorschau auf http://dailydoseofexcel.com/archives/2015/11/17/filtering-pivottables-with-vba-deselect-slicers-first/. Hinterlasse einen Kommentar, wenn du mehr wissen willst. – jeffreyweir

+0

-GregGalloway, Es muss VBA sein und ich habe nicht die Flexibilität, ein Add-In zu installieren. Wenn ich das getan hätte, hätte dieser Link mein Problem gelöst. Danke für das Teilen. –

Antwort

0

Ich endete mit Slicer zum Filtern der Daten.

Dim sC As SlicerCache 
Dim sL As SlicerCacheLevel 
Dim aArray() As Variant 

'create a slicer cache. I just used a recorded macro to get the cache code 
ActiveWorkbook.SlicerCaches.Add2(ActiveSheet.PivotTables("Metrics"), _ 
    "[RawData].[Status]").Slicers.Add ActiveSheet, "[RawData].[Status].[Status]", _ 
    "Status", "Status", 141.75, 424.5, 144, 198.75 

Set sC = ActiveWorkbook.SlicerCaches("Slicer_Status") 
Set sL = sC.SlicerCacheLevels(1) 'this will start with the first item in the slicer 

    With sL 
     For i = 1 To .Count 
      If sL.SlicerItems.Item(i).Name Like "*oran*" Then 
       GoTo nextiteration 'this will skip over anything 
            'like oran when saving to the array 
      End If 

      ReDim Preserve aArray(0 To i) As Variant 
      aArray(i) = sL.SlicerItems.Item(i).Name 

      nextiteration: 
     Next i 
      sC.VisibleSlicerItemsList = aArray 'this set the visible items 
               '= to the array you just created 
      'ActiveSheet.Shapes("Status").Visible = False 
      'to hide this slicer, uncomment the line above 
    End With 

This Post by Paul te Braak bereitgestellt, um die Masse der Lösung. Ich habe auch this tutorial für einige Hilfe beim Speichern von Elementen in Arrays verwendet. This stackoverflow answer hat mir auch geholfen, wenn ich mit dynamischen Arrays arbeiten musste. Danke an -GregGalloway und -jeffreyweir: Beim Durchsehen der von Ihnen bereitgestellten Links kam ich auf die Idee, mit Slicern nach Lösungen zu suchen.

Verwandte Themen