Agregar selecciones de segmentación a la hoja en una lista - Excel VBA

Agregar selecciones de segmentación a la hoja en una lista - Excel VBA

Tengo una tabla dinámica con una segmentación en la que un usuario puede realizar múltiples selecciones. Estoy tratando de enumerar los valores seleccionados en la segmentación para que luego puedan unirse en otra celda usando CONCATENAR. Estoy usando el siguiente código.

Por el momento, las celdas L5:L7 se rellenan con la primera selección realizada en la segmentación de datos, pero no con otras.

Investigué un poco y encontré una posible solución con la función CUBESET, pero no logro que funcione en mi hoja de cálculo. De ahí el intento de VBA. ¿Alguien sabe qué tiene de malo?

    Sub City_Click()

Dim cache As Excel.SlicerCache
Set cache = ActiveWorkbook.SlicerCaches("Slicer_City")
Dim sItem As Excel.SlicerItem
For Each sItem In cache.SlicerItems

If sItem.Selected = True Then Range("L5").Value = sItem.Name
If sItem.Selected = True Then Range("L6").Value = sItem.Name
If sItem.Selected = True Then Range("L7").Value = sItem.Name

Next sItem

End Sub

Respuesta1

Aquí hay una función definida por el usuario a la que puede llamar directamente desde el libro de trabajo que hace esto por usted y que se puede ejecutar en cualquier tipo de segmentación, ya sea una tabla dinámica "tradicional", una tabla dinámica OLAP/PowerPivot o una segmentación de tablas. Simplemente coloque esto en un módulo de código estándar y luego, en el libro de trabajo, escriba lo siguiente:

=SlicerItems("Slicer_Ciudad")

Public Function SlicerItems(SlicerName As String, Optional sDelimiter As String = "|") As String

    Dim oSc As SlicerCache
    Dim oSi As SlicerItem
    Dim i As Long
    Dim lVisible As Long
    Dim sVisible() As String

    On Error Resume Next
    Application.Volatile
    Set oSc = ThisWorkbook.SlicerCaches(SlicerName)
    If Not oSc Is Nothing Then
        With oSc
            If .FilterCleared Then
                SlicerItems = "(All)"
            Else
                If .OLAP Then
                    SlicerItems = Join(.VisibleSlicerItemsList, sDelimiter)
                    SlicerItems = Replace(SlicerItems, .SourceName, "")
                    SlicerItems = Replace(SlicerItems, ".&[", "")
                    SlicerItems = Replace(SlicerItems, "]", "")
                Else

                    lVisible = .VisibleSlicerItems.Count
                    If .VisibleSlicerItems.Count = 1 Then
                        SlicerItems = .VisibleSlicerItems(1).Name
                    Else
                        ReDim sVisible(1 To lVisible)
                        For i = 1 To lVisible
                            sVisible(i) = .VisibleSlicerItems(i).Name
                        Next i
                        SlicerItems = Join(sVisible, sDelimiter)
                    End If
                End If
            End If
        End With
    Else
        SlicerItems = SlicerName & " not found!"
    End If

End Function

Y así es como se ve:

ingrese la descripción de la imagen aquí

información relacionada