Добавление срезов на лист в списке-Excel VBA

У меня есть сводная таблица с срезом, в которой пользователь может сделать несколько выборов. Я пытаюсь перечислить выбранные значения в срезе, чтобы их можно было объединить в другую ячейку с помощью CONCATENATE. Я использую приведенный ниже код.

на данный момент, клеток Л5:Л7 заполняются первого среза, но не другим.

Я провел некоторое исследование и нашел возможное решение с функцией 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
23
задан user767772
25.04.2023 3:33 Количество просмотров материала 2535
Распечатать страницу

1 ответ

вот определяемая пользователем функция, которую можно вызвать непосредственно из книги, которая делает это за вас, и может быть запущена на любом типе среза, будь то "традиционная" сводная таблица, сводная таблица OLAP/PowerPivot или срез таблицы. Просто поместите это в стандартный модуль кода, а затем в книге введите следующее:

=SlicerItems("Slicer_City")

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

и вот как это выглядит:

enter image description here

0
отвечен jeffreyweir 2023-04-26 11:21

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх