У меня есть сводная таблица со срезом, в которой пользователь может сделать несколько выборов. Я пытаюсь перечислить выбранные значения в срезе, чтобы затем их можно было объединить в другой ячейке с помощью CONCATENATE. Я использую код ниже.
На данный момент ячейки L5:L7 заполнены первым выбором, сделанным в слайсере, но больше никакими.
Я провел некоторые исследования и нашел возможное решение с функцией CUBESET, но я не могу заставить ее работать в моей таблице. Отсюда попытка VBA. Кто-нибудь знает, что с ней не так?
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
решение1
Вот определяемая пользователем функция, которую вы можете вызвать напрямую из рабочей книги, которая делает это за вас и может быть запущена на любом типе среза, будь то «традиционная» сводная таблица, сводная таблица OLAP/PowerPivot или срез таблицы. Просто поместите это в стандартный модуль кода, а затем в рабочей книге введите следующее:
=SlicerItems("Город_слайсера")
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
И вот как это выглядит: