我有一个跟踪公司不同财务状况的仪表板。此仪表板上的一个图表显示了用户在切片机中选择的任何值的年度总计。
我遇到的问题是图表始终会显示每个月的值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
答案 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
更改为切片器的名称。此代码假定只有一个切片器选择足以判断是否使用平均值或总和,但您可以修改它以在更改计算类型之前需要多个选择。