如何使用VBA从Excel图表中删除系列

如何使用VBA从Excel图表中删除系列

问题描述:

我试图使用VBA从Excel 2003中的图表中删除空系列。我已经看到其他人在过去曾经遇到过这个问题,并且我尝试了在他们的帖子中提到的所有方法,但一直无法找到任何可以一致工作的方法。如何使用VBA从Excel图表中删除系列

该图表中有14个系列,其中3个或9个之间的任何位置都可以为空。空的总是系列4之间 - 我试过的代码有一些变化,但是这主要是它:

Sheets("chart-1").Select 
ActiveChart.PlotArea.Select 
For i = 12 To 4 Step -1 
    Dim theSeries As Series 
    MsgBox (ActiveChart.SeriesCollection(i).Name) 
    Set theSeries = ActiveChart.SeriesCollection(i) 
    MsgBox (theSeries.Name) 
    theSeries.Delete 
Next 

我可以为一个图表成功运行一次,但所有后续周期失败,出现Unable to get the Name property of the Series class错误。它在调用.Name时失败。

我能够通过直接插入整数来获得它的工作,但它只会为除1以外的所有整数运行一次。它运行多次为Series(1)。例如,如果我只是简单地调用:ActiveChart.SeriesCollection(1).Delete,那么系列将被删除,但是如果我用另一个整数(4,9,12)运行它,它将不会运行。它会重新工作1,但只有1.它也将工作一次与其他整数(如4),但所有后续调用将失败,即使我将整数更改为1或保持为4,或将其更改为其他数。

这种行为真的很奇怪。

任何想法将不胜感激。我不能简单地打电话ActiveChart.SeriesCollection(1).Delete,因为前3个系列总是非空的。

谢谢。

** **更新

我只是跑测试手动执行以下操作:

Sheets("ch-v2-12mth").Select 
ActiveChart.PlotArea.Select 
MsgBox (ActiveChart.SeriesCollection(1).Name) 

我通过循环的SeriesCollection试图数字1 - 16(只有14个图表中系列)来查看结果。 13工作得很好 4 - 13误用Unable to get the Name property of the Series class 14工作得很好 15 - 16误用Method 'SeriesCollection' of object '_Chart' failed < - 并不奇怪,因为在图中序列的数量。

这种行为让我觉得Excel有一个bug。任何其他想法?

+0

这是你正在尝试? http://*.com/questions/7875326/deleting-empty-series-out-of-graph-with-vba – 2012-08-09 12:31:38

+0

@Siddharth基本上是这就是我正在尝试,而实际上不需要数据标签。我已经使用我已经完成的一些更多测试的结果更新了最初的请求。结果很奇怪。感谢您的帮助,但我仍然得到相同的行为和错误。任何其他想法? – 2012-08-10 03:07:22

+1

你可以加载一个示例excel文件,以便我可以玩弄它吗?这样我就不必创建一个示例文件。您可以在wikisend.com上传文件,然后在此分享链接。 – 2012-08-10 03:28:21

当您从图表中删除全部系列时,Excel中存在一些错误。我的解决方法是始终在图表中留下至少一个系列(即使它中没有数据)。这似乎对我有用。

只是想到另一件事。删除一个系列时,其余所有系列的索引都会减1,因此您无法通过从1循环到系列数来删除它们。你可以做的是有一个do循环,删除它们直到SeriesCollection.Count = 0(或1,请参阅我之前的评论)。或者是一个for循环,向后迭代并总是删除最后一个序列(即SeriesCollection(SeriesCollection.Count).Delete

+0

什么样的错误? – 2015-06-29 14:58:44

您不能删除所有序列,否则图表将自行删除。我为解决这个问题所做的是重命名所有现存的系列;然后输入你的代码来建立新的东西;然后运行另一个片段删除,重命名

'rename existing series 
With ActiveChart 
DoEvents 
    For i = .FullSeriesCollection.Count To 1 Step -1 
     .FullSeriesCollection(i).Name = "remove" & i 
    Next i 
End With 

'your code here to build new charts 

'last piece of code to remove the earlier series marked for deletion 
With ActiveChart 
DoEvents 
    For c = .SeriesCollection.Count To 1 Step -1 
     If .SeriesCollection(c).Name Like "*Series*" Then .SeriesCollection(c).Delete 
    Next c 
End With 
'also, you need to step backwards because each time you remove a series it will re-index 
+0

不要忘记你的Doevents和步骤-1 – 2016-12-09 18:15:19

+0

你可能是指'如果.SeriesCollection(c).Name像“remove *”那么...''? – 2017-01-01 06:19:33

+0

You _can_删除所有系列。图表将保留,但在添加更多数据之前它将保持空白。当数据被清除时,许多消失的元素将丢失格式,并且标题将丢失文本。 – 2017-01-06 14:41:47

您可以简化代码,此系列:

Sheets("chart-1").Select 
For i = 12 To 4 Step -1 
    MsgBox "Series " & i & ": """ ActiveChart.SeriesCollection(i).Name & """" 
    ActiveChart.SeriesCollection(i).Delete 
Next 

我不知道为什么代码不为你工作,但更简单,通常是更好。而且您不需要知道系列名称即可删除系列。