Excel:根据选择的切片器值动态更改图表计算类型

时间:2016-02-20 16:12:49

标签: excel vba excel-vba pivot

我有一个跟踪公司不同财务状况的仪表板。此仪表板上的一个图表显示了用户在切片机中选择的任何值的年度总计。

我遇到的问题是图表始终会显示每个月的值sum,有时候average会更合适。

有没有办法让图表根据选择的切片器更新计算类型?

这是代码(工作不正常)(归功于@ARich):

Private Sub Workbook_SheetPivotTableUpdate(ByVal Sh As Object, ByVal Target As PivotTable)
    On Error GoTo err1
    Dim S   As Slicer
    Dim sI  As SlicerItem
    Dim PT  As PivotTable
'    Application.EnableEvents = False

    Set S = ThisWorkbook.SlicerCaches("Slicer_Type").Slicers("Type")

    For Each sI In S.SlicerCache.SlicerItems
        If sI.HasData And sI.Selected Then
            If sI.Caption = "Headcount" Then
                With Target.PivotFields("Sum of Value")
                        .Caption = "Average of Value"
                        .Function = xlAverage
                End With
                Exit For
            Else
                With Target.PivotFields("Average of Value")
                        .Caption = "Sum of Value"
                        .Function = xlSum
                End With
                Exit For
            End If
        End If
    Next
err1:
'    Application.EnableEvents = True
End Sub

2 个答案:

答案 0 :(得分:1)

简而言之:不。您正在寻找的是当您从一个切片机切换到另一个切片机时会触发的事件。但Excel中没有事件可以捕获切片器的selection或其activation或任何其他可用事件。

然而,如果您愿意使用悬停形式(无模式)创建自己的切片器,那么您将能够捕获该事件。

答案 1 :(得分:1)

正如拉尔夫所说,没有切片选择事件。但是,有一个数据透视表事件,其中一个是PivotTable_Update event。我们可以使用此活动来完成您所说的内容:

Private Sub Workbook_SheetPivotTableUpdate(ByVal Sh As Object, ByVal Target As PivotTable)
    On Error GoTo err1
    Dim S   As Slicer
    Dim SI  As SlicerItem
    Dim PT  As PivotTable
    Application.EnableEvents = False

    Set S = ThisWorkbook.SlicerCaches(1).Slicers("YourSlicer")

    For Each SI In S.SlicerCache.SlicerItems
        If SI.HasData And SI.Selected Then
            If SI.Caption = "Your Criteria" Then
                Target.PivotFields("YourField").Function = xlAverage
                Exit For
            Else
                Target.PivotFields("YourField").Function = xlSum
                Exit For
            End If
        End If
    Next
err1:
    Application.EnableEvents = True
End Sub

这种方法的工作方式是每次进行切片器选择时,切片器会过滤它所连接的数据透视表。过滤透视的行为被视为对透视的更新,因此会触发透视表更新事件。

此代码将放在工作簿的ThisWorkbook模块中。 (还有一个名为Worksheet_PivotTableUpdate的事件的工作表特定版本,您可以将其放置在数据透视表所在的工作表的工作表模块中。其余代码将保持不变。)

您必须对代码进行一些更改才能适合您的工作簿。例如,我不知道您的工作簿中有多少个切片器缓存,上面的代码使用第一个。您还需要使用您要使用的条件将Slicer_Name更改为切片器的名称。此代码假定只有一个切片器选择足以判断是否使用平均值或总和,但您可以修改它以在更改计算类型之前需要多个选择。