在公式或VBA中使用切片器的选择

时间:2016-08-25 21:38:55

标签: excel excel-vba excel-formula vba

我有一个非常复杂的数据模型(内置于PowerPivot中),我在仪表板中有一些切片器。 但是,我希望那些切片器能够应用于另一个不是(也可能不是)DataModel的表。

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

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

1 个答案:

答案 0 :(得分:0)

我设法用一点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数据透视表基于OLAP的事实有关,因此我需要使用SlicerCacheLevel,而不是像我的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