【问题标题】:Use Slicers's Selection in Formula or in VBA在公式或 VBA 中使用切片器的选择
【发布时间】:2016-08-25 21:38:55
【问题描述】:

我有一个非常复杂的数据模型(内置于 PowerPivot),其中我在仪表板中有一些切片器。 一切都很好,但是,我希望将这些切片器应用于另一个表,该表不是(也不能是)DataModel 的一部分。

因此,我使用 Excel UDF 来捕获切片器的选择。 我正在努力的部分从这里开始。我需要使用从切片器捕获的选择并使用 VBA 过滤 UnLinked Table,或者使用 SUMPRODUCT/SUMIFS 公式从 UnLinkedTable 计算我想要的结果。 例如,如果在“PRODUCTS”切片器中选择“A”、“B”、“C”和“D”,我的 UDF 公式将返回:“A、B、C、D”。 如果在切片器中选择了所有内容,则公式将返回“所有项目”。

现在,如何在 VBA 中使用“A、B、C、D”结果过滤 UnLinkedTable[PRODUCT] 列,或者如何在 Excel 中编写 SUMPRODUCT 或 SUMIFS 公式?请记住,我在 UnLinked 表中有多个切片器和多个列。 非常感谢您的帮助!

【问题讨论】:

  • 所以你在这之前问了 7 个问题,但从未接受过一个答案.. 嗯...
  • 澄清一下,当您说“表格”时,您是指 Excel 表格(又名 ListObject)吗?还是您在谈论数据透视表?
  • 我的意思是 Excel 表,而不是数据透视表

标签: excel excel-formula vba


【解决方案1】:

我设法用一点 VBA 解决了我的问题。 如果有人对此解决方案感兴趣,请点击此处:

[SelectionsInSlicerBrand] -> this is the named range for the cell where my UDF brings the slicer selection
BrandFilters = Split([SelectionsInSlicerBrand], ",")
If [SelectionsInSlicerBrand] <> "All Items" Then
 ActiveSheet.ListObjects("TableFilterVBA").Range.AutoFilter Field:=1, Criteria1:=(BrandFilters), Operator:=xlFilterValues
 Else
 ActiveSheet.ListObjects("TableFilterVBA").Range.AutoFilter Field:=1
End If

但是,我现在有一个不同的问题。我已经在一个普通的数据透视表上测试了我的 Slicer UDF 公式,它工作得很好。但是,当我创建 PowerPivot 数据透视表时,UDF 不再起作用。 根据我在以下链接上阅读的内容,这可能与 PowerPivot PivotTable 基于 OLAP 的事实有关,因此我需要使用 SlicerCacheLevel,而不是 SlicerCache,就像我的 UDF 使用的那样:PowerPivot Slicer selection based on cell value using VBA 我将在这里发布我的 UDF 的完整代码,它再次带来了正常数据透视表切片器的选择。如果您可以将其更改为也适用于 PowerPivot,那就太棒了。在这里可以找到 UDF:'http://www.jkp-ads.com/Articles/slicers05.asp

Public Function GetSelectedSlicerItems(SlicerName As String) As String
    Dim oSc As SlicerCache
    Dim oSi As SlicerItem
    Dim lCt As Long
    On Error Resume Next
    Application.Volatile
    Set oSc = ThisWorkbook.SlicerCaches(SlicerName)
    If Not oSc Is Nothing Then
        For Each oSi In oSc.SlicerItems
            If oSi.Selected Then
                GetSelectedSlicerItems = GetSelectedSlicerItems & oSi.Name & ", "
                lCt = lCt + 1
            ElseIf oSi.HasData = False Then
                lCt = lCt + 1
            End If
        Next
        If Len(GetSelectedSlicerItems) > 0 Then
            If lCt = oSc.SlicerItems.Count Then
                GetSelectedSlicerItems = "All"
            Else
                GetSelectedSlicerItems = Left(GetSelectedSlicerItems, Len(GetSelectedSlicerItems) - 2)
            End If
        Else
            GetSelectedSlicerItems = "No items selected"
        End If
    Else
        GetSelectedSlicerItems = "No slicer with name '" & SlicerName & "' was found"
    End If
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多