PDA

Vollständige Version anzeigen : PivotItems mit Abbruchkriterium


Ishaell
21.07.2014, 09:40
Hallo liebe Excel-Gemeinde,

ich arbeite gerade daran mir in einer Pivot-Tabelle die Werte per Schleife filtern zu lassen. Dabei möchte ich noch ein sauberes Abbruchkriterium realisieren um mit "Exit For" die Schleife verlassen bzw. beenden zu können.

Wenn in den Quelldaten und damit in der Pivottabelle der Wert nicht vorhanden ist nachdem ich filtern möchte kommt der sicherlich bekannte Laufzeitfehler 1004: Die Visible-Eigenschaft.....

Um diesen Fehler zu umgehen möchte ich, falls mein gewünschter Wert nicht vorhanden ist, die Schleife nach verlassen und per "MsgBox" einfach eine Nachricht ausgeben. Das müsste ich doch feststellen können falls meine Laufvariable intT = .PivotItems.count annimmt und .PivotItems(intT) <> x
Dadurch möchte die Schleife auch den letzten Wert .visible = false setzen was Pivot aber nicht zulässt.

Habt ihr mir einen Denkanstoss? Anbei der bis dato existierende Code.

Danke schonmal im Voraus und Gruss,
Isha
:)


Sub test()

Application.ScreenUpdating = False

Dim x As Variant
Dim pivot_Item As PivotItem
Dim PivotField As PivotField
Dim intT As Integer

x = "21"


ActiveSheet.PivotTables("PivotFehlerEUR").PivotCache.Refresh


With ActiveSheet.PivotTables("PivotFehlerEUR").PageFields("Hauptsegment Aplatz")
.EnableMultiplePageItems = True

Set PivotField = ActiveSheet.PivotTables("PivotFehlerEUR").PageFields("Hauptsegment Aplatz")

For Each pivot_Item In PivotField.PivotItems
pivot_Item.Visible = True
Next

For intT = 1 To .PivotItems.Count
If .PivotItems(intT) = x Then
.PivotItems(intT).Visible = True
Else
.PivotItems(intT).Visible = False

End If
Next
End With
Application.ScreenUpdating = True
End Sub

Ishaell
23.07.2014, 10:46
Mittlerweile habe ich das Problem selber auf eine etwas andere Art gelöst.
Ich habe die gewünschten Werte aus der Tabelle ausgelesen und in ein dynamisches Array geschrieben. Über eine Listbox kann ich in einer Userform per Häckchen meine gewünschten Elemente auswählen die ich in der Pivot Angezeigt haben möchte. Die ausgewählten Werte werden wieder in ein dynamisches Array geschrieben welches die Pivotfilter aktiviert oder deaktiviert.

Ein Dank hier an Hajo und Beverly Karin. Von den beiden habe ich einige Codeteile im Netz gefunden.

Die Deklarierungen und Definierungen der Variablen sind unvollständig da oftmals Public!

Gruss, Isha

Private Sub UserForm_Initialize()
Application.ScreenUpdating = False

' Code von Beverly Karin
Dim objDictionary As Object
Dim varBereich As Variant
Dim loZaehler, lngLetzte As Long

Sheets("DATA").Select
lngLetzte = IIf(IsEmpty(Cells(Rows.Count, 1)), Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count)
Set objDictionary = CreateObject("Scripting.Dictionary")

With Worksheets("DATA")
varBereich = .Range(.Cells(2, 1), Cells(lngLetzte, 1))
End With
' Schleife über alle Werte des Bereichs
For loZaehler = LBound(varBereich) To UBound(varBereich)
' Eintrag wird nur übernommen wenn er im DictionaryObject noch nicht enthalten ist
objDictionary(varBereich(loZaehler, 1)) = 0
Next
' Werte in ein Array übergeben
arrDaten = objDictionary.keys

' sortieren von A nach Z
' Lbound kleinster Wert,UBound Größter Wert
ListBox1.List = arrDaten

End Sub

Private Sub WeiterButton_Click()
Application.ScreenUpdating = False
Unload Me
ReDim arrSektor(0)
iArr = "0"

For lListbox = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(lListbox) = True Then 'Falls Segment angewählt -> Array+1 und Wert an diese Stelle
ReDim Preserve arrSektor(iArr)
arrSektor(iArr) = ListBox1.List(lListbox)
iArr = iArr + 1
End If
Next lListbox
End Sub


d = "0"

For iM = 8 To intlastrowM

If d <= UBound(arrSektor) Then

SegmentKurz = arrSektor(d)
Segment2 = Sheets(SheetMaster).Cells(iM, 1)

If SegmentKurz = Segment2 Then

Worksheets("Produktionsleistung").Range("B21") = SegmentKurz
SegmentLang = Sheets(SheetMaster).Cells(iM, 2)
Call Segmentwechseln
Call Drucken
d = d + 1
Else
End If
End If

Next