none
Lesen der VisibleItems oder HiddenItems für PageFields (Excel 2003) RRS feed

  • Allgemeine Diskussion

  • VisibleItems / HiddenItems für PageFields (Excel 2003)

    Problemstellung

    Ich habe eine Pivot Tabelle, die mit Berichtfilter (PageField) ausgestattet ist. Für dieses Berichtfilterfeld wähle ich manche Elemente als unsichtbar aus. Jetzt möchte ich programmatisch finden, welche Elemente sichtbar sind und welche Elemente unsichtbar sind.

    Schwierigkeit

    Mit Excel 2007 und 2010 funktioniert es. Es gibt aber einen Bug in Excel 2003 in Bezug zu PageField.VisibleItems, PageField.HiddenItems und PageField.PivotItem.Visible. Es werden immer für ein Berichtfilterfeld nur ein Element in VisibleItems Kollektion zurückgegeben und alle Elemente in HiddenItems Kollektion zurückgegeben, egal wie viele Elemente unsichtbar sind. Also folgender Code sollte funktionieren, tut er aber nicht:

    Sub GetVisiblePageFieldItems_NotWorking()
        Dim sh As Worksheet
        Dim p As PivotTable
        Dim i As PivotItem
        Dim f As PivotField
        Dim c As Integer
        
        Set sh = ActiveWorkbook.Worksheets("Sheet2")
        Set p = sh.PivotTables(1)
        If p.PageFields.Count > 0 Then
            Set f = p.PageFields(1)
            'using PageField.PivootItem.Visible
            For Each i In f.PivotItems
                If i.Visible Then
                    c = c + 1
                End If
            Next i
            'because of a bug, c is always 0
            MsgBox CStr(c)
            'using VisibleItems, c is always 1
            MsgBox CStr(f.VisibleItems.Count)
            
        End If
        
    End Sub
    


     

    Wie schafft man das

    Field.PivotItem.Visible funktioniert nicht richtig für PageField Felder, aber es funktioniert richtig für Spaltenbeschriftungen (ColumnFields) und Zeilenbeschriftungen (RowFields). Also man könnte die Aktualisierung der Excel Tabelle blockieren und die Eigenschaft Orientation des Berichtfilterfelds von xlPageField nach xlColumnField ändern, sichtbare Felder lesen, dann Orientation zurücksetzen und Aktualisierung der Oberfläche wieder erlauben:

     

    Sub GetVisiblePageFieldItems()
        Dim sh As Worksheet
        Dim p As PivotTable
        Dim i As PivotItem
        Dim f As PivotField
        Dim c As Integer
        
        Set sh = ActiveWorkbook.Worksheets("Sheet2")
        Set p = sh.PivotTables(1)
        If p.PageFields.Count > 0 Then
            Application.ScreenUpdating = False
            Set f = p.PageFields(1)
            f.Orientation = xlColumnField
            
            'using PageField.PivootItem.Visible
            For Each i In f.PivotItems
                If i.Visible Then
                    c = c + 1
                End If
            Next i
            'now c returns correct value
            MsgBox CStr(c)
            'ualso sing VisibleItems, Count returns correct value
            MsgBox CStr(f.VisibleItems.Count)
            
            f.Orientation = xlPageField
            Application.ScreenUpdating = True
        End If
        
    End Sub
    

     


    Ich bin gerne bei den Foren. Es kommt von Herzen. Es wird aber keine implizite oder sonstige Garantie für die geposteten Antworte / Informationen gewährt. Hier auch die Forenregeln.
    Dienstag, 29. November 2011 09:29