Eu tenho uma tabela dinâmica com uma segmentação de dados na qual um usuário pode fazer várias seleções. Estou tentando listar os valores selecionados na segmentação de dados para que possam ser unidos em outra célula usando CONCATENATE. Estou usando o código abaixo.
No momento, as células L5:L7 são preenchidas com a primeira seleção feita na segmentação de dados, mas nenhuma outra.
Fiz algumas pesquisas e encontrei uma possível solução com a função CUBESET, mas não consigo fazer funcionar na minha planilha. Daí a tentativa do VBA. Alguém sabe o que há de errado com isso?
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
Responder1
Aqui está uma função definida pelo usuário que você pode chamar diretamente da pasta de trabalho que faz isso para você e pode ser executada em qualquer tipo de Slicer, seja uma tabela dinâmica 'tradicional', uma tabela dinâmica OLAP/PowerPivot ou um Slicer de tabela. Basta colocar isso em um módulo de código padrão e, em seguida, na pasta de trabalho, digite o seguinte:
=SlicerItems("Slicer_Cidade")
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
E é assim que parece: