我有一个数据透视图,它通常显示 15 个系列中的 6-8 个,其中很多系列往往为零。因此,每次刷新时,它都有 15 个系列,而图例只需列出数字不为零的系列,以保持图表整洁且易于阅读。
我正在尝试使用虚拟专用网络删除系列全为零(最大值 = 0)的特定项目,遇到的问题比预期的要多:
我正在循环遍历图表中的每个项目全系列收藏品,逐一浏览系列列表。但是,由于图例是与系列分开的对象,你不能使用我的循环中的当前系列来引用它,因此需要一个循环计数器。
无法找到 LegendEntries 项的名称/值,因此您必须将 Series 与 Legend 进行匹配,而无法确认哪个 LegendEntries 项是哪个。
(显然以下功能在 Excel 2007 及更高版本中存在?)
看起来 FullSeriesCollection 对象在循环时会按 1 到 13 的顺序排列项目(合理),但是LegendEntries 对象按相反顺序排列项目,从
13 到 1。LegendEntries 对象的索引从 0 开始,因此它的物品实际上是从 12 到 0 排序的。
当你从 LegendEntries 对象中删除项目时,它会重新编号。因此,当您删除项目 1 时,列表中的所有项目都会从 11 重新编号为 0。
每次数据透视表更新时我都需要刷新图表,重新捕获所有已删除的 LegendEntries 项(这些项现在可能为非零)。
鉴于这些复杂情况,我真的很难删除需要从图表中删除的特定项目。
如何有效地循环遍历数据透视表的项目并删除所有项目为零的相应 LegendEntries 系列?
答案1
从 Worksheet_PivotTableUpdate 事件开始
包含数据透视表的工作表需要以下代码,因此每当此特定情况发生时,它都会调用模块 1 中的新函数“RefreshAbsenceLabels”命名数据透视表已刷新:
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
If Target.Name = "This Specific Table" Then
Module1.RefreshAbsenceLabels
MsgBox "The PivotTable has been updated."
End If
End Sub
与正确的图表对话,并刷新其图例
Public Function RefreshAbsenceLabels()
Set DaysAbsent = ActiveWorkbook.Worksheets("Dashboard").ChartObjects("Department Absences")
With DaysAbsent.Chart
If .HasLegend Then
.HasLegend = False
End If
.HasLegend = True
设置计数器,并将其设置为系列计数减一
减一是为了说明 FullSeriesCollection 的编号为 1 到 X,而 LegendEntries 项的编号为 X-1 到 0
Dim x As Integer
x = .FullSeriesCollection.Count - 1
循环遍历系列,删除相应的 LegendEntries 项
计数器循环下降至零。LegendEntries 反向编号的优点是,您不必在每次删除内容时都抵消缺失的项目:任何重新编号的项目都已处理,它们的数字不再重要。
应用程序.工作表函数.Max从序列中找出最高值
For Each ser In .FullSeriesCollection
If Application.WorksheetFunction.Max(ser.Values) = 0 Then
'MsgBox "Deleting" & ser.Name & " - " & x
.Legend.LegendEntries(x).Delete
End If
x = x - 1
Next
End With
End Function