如何仅删除 Excel VBA 中堆叠条形图(甘特图)中不需要的额外图例条目?

How to Delete only extra Legend Entries that are not needed in a stacked bar chart(Gantt) in Excel VBA?

我发现问题 "Deleting legend entries with blank series name using VBA" 与我遇到的问题非常相似,但有所不同。

我有两个按钮,"Load Chart" 和 "Clear Chart" 像这样

该图表是一个堆叠条形图,每个都有多个系列。我有一些填充颜色和线条边框已被删除,因此它看起来像甘特图。目前看起来像这样(Dummy)

还必须删除名为 padding 的图例条目和末尾的一些额外图例条目。我尝试了以下在加载图表宏结束时触发的代码:

With ActiveChart
        For i = .Legend.LegendEntries.Count To UptoRequiredSeries + 1 Step -1
                    .Legend.LegendEntries(i).Delete
'            Debug.Print .Legend.LegendEntries(i - 1)
        Next i
End With

我不想按照链接问题中的建议使用 IsFiltered 属性。我真的想删除我不想要的图例条目。问题变得复杂,因为我发现图表在清除图表后保留了图例条目的数量。所以下次我加载图表时,现有的图例条目也会被删除。

请求您的帮助,在此先感谢。

EDIT1:我遇到这个问题是因为系列的数量多于图例,这是因为某些系列的颜色必须重复。例如:系列 A 之后是 B,然后是关闭,然后是 A 系列。当一种颜色需要重复时,我创建一个新系列并在数据数组中为它的其他情况设置零。我使用切片操作来设置值数组。

您需要做一些簿记,以跟踪要删除的图例条目。不幸的是,系列和图例条目没有通过对象模型关联,这是一个严重的缺点。

然后你需要从最后一个(最大的数字)到第一个删除它们。

您没有进入删除图例条目的条件,但假设您知道要删除最后两个和第一个,"padding"。你会做这样的事情:

Dim iSrs As Long
For iSrs = ActiveChart.SeriesCollection.Count To ActiveChart.SeriesCollection.Count - 1 Step -1
    ActiveChart.Legend.LegendEntries(iSrs).Delete
Next
ActiveChart.Legend.LegendEntries(1).Delete

如果比较复杂,可能只需要建立一个数组(1到.SeriesCollection.Count),在这个数组中输入True或False是否删除对应的图例条目,然后从last 到 first,如果对应的数组元素为 True,则删除图例条目。

如果您删除了一些条目并需要恢复它们,请删除图例并恢复它。恢复后的图例将包含所有图例条目,您可以重新开始。