excelhidepivot-tablepivotitemvba

Error '1004': Unable to set the Visible property of the PivotItem class


i got the below code from here: Looping through report filters to change visibility doesn't work where the solution is marked as working. After modifying according to my need, it is like this:

With pt.PivotFields(6)
    .ClearAllFilters
     If .PivotItems.Count > 0 Then

        'goofy but necessary
        Set firstPi = .PivotItems(1)

        For Each pi In .PivotItems

            If firstPi.Visible = False Then
                firstPi.Visible = True
            End If

             'Don't loop through firstPi
            If pi.Value <> firstPi.Value Then
                itemValue = pt.GetPivotData("[Measures].[Nr of Cancelled]", "[Characteristics].[Reason]", pi.Name).Value

                rw = rw + 1
                nwSheet.Cells(rw, 1).Value = pi.Name
                nwSheet.Cells(rw, 2).Value = pi.Visible
                If itemValue < 2000 Then
                    If pi.Visible = True Then
                        pi.Visible = False 'Error here
                    End If
                Else
                    MsgBox pi.Value
                    If pi.Visible = False Then
                        pi.Visible = True 'Error here
                    End If
                End If
            End If
        Next

              'Finally perform the check on the first pivot item
              If firstPi > 2000 Then
                  firstPi.Visible = True
              Else
                  firstPi.Visible = False
              End If
           End If
    End With

I see that the whole code is working fine and I'm facing error only the lines pi.Visible = True or pi.Visible = False

I'm not sure where I've done wrong for the code not to work.

When I was searching internet for the soltuion, I came across this link: https://support.microsoft.com/en-us/kb/114822 where MS mentioned that Only contiguous items in a PivotTable Field can be hidden. Does that mean that items in my table are not contiguous? Can anyone help me? I'm lost here.


Solution

  • I didn't find any solution for the Error. But I found another way to achieve the task. I used array to store all the Items to hide and Items to be visible so that I can call either HiddenItemsList or VisibleItemsList:

        For Each pvtitem In pt.PivotFields(6).PivotItems
            On Error GoTo skipreason
            itemValue = pt.GetPivotData("[Measures].[Cancelled]", "[Characteristics].[Reason]", pvtitem.Name).Value
            If itemValue < 2000 Then
                hiddenReasons(hiddenCount) = pvtitem.Name
                hiddenCount = hiddenCount + 1
            Else
                visibleReasons(visibleCount) = pvtitem.Name
                visibleCount = visibleCount + 1
            End If
    
    Sheets("Cancels").PivotTables("Cancels").PivotFields( _
        "[Characteristics].[Reason].[Reason]" _
        ).VisibleItemsList = Array(visibleReasons())