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: