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

如何使用VBA从Excel图表中删除系列,vba,excel,charts,excel-2003,Vba,Excel,Charts,Excel 2003,我正在尝试使用VBA从Excel 2003中的图表中删除空序列。我看到其他人在过去也有过这个问题,我尝试过他们帖子中提到的所有方法,但都找不到任何一致有效的方法 图表中有14个系列,其中3到9个系列中的任何一个都可以为空。空的总是在系列4-12之间 我尝试了一些代码变体,但主要是: Sheets("chart-1").Select ActiveChart.PlotArea.Select For i = 12 To 4 Step -1 Dim theSeries As Series

我正在尝试使用VBA从Excel 2003中的图表中删除空序列。我看到其他人在过去也有过这个问题,我尝试过他们帖子中提到的所有方法,但都找不到任何一致有效的方法

图表中有14个系列,其中3到9个系列中的任何一个都可以为空。空的总是在系列4-12之间

我尝试了一些代码变体,但主要是:

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
我可以为图表成功运行一次,但所有后续循环都会失败,并出现
无法获取Series类的Name属性的错误。调用.Name时失败

我可以通过直接插入整数来让它工作,但是除了1之外,它只能对所有整数运行一次。它为
系列(1)
运行多次

例如,如果我简单地调用:ActiveChart.SeriesCollection(1).Delete,那么该系列将被删除,但是如果我使用另一个整数(4,9,12)运行它,它将不会运行。它将再次为1工作,但仅为1。它还可以处理其他整数(比如4),但即使我将整数更改为1或保持为4,或将其更改为其他数字,所有后续调用都将失败

这种行为真的很奇怪

任何想法都将不胜感激。我不能简单地重复调用
ActiveChart.SeriesCollection(1)。删除
,因为前3个系列总是非空的

谢谢

**更新**

我刚刚手动运行了一个测试,执行以下操作:

Sheets("ch-v2-12mth").Select
ActiveChart.PlotArea.Select
MsgBox (ActiveChart.SeriesCollection(1).Name)
我在序列集合中循环尝试数字1-16(图表中只有14个序列)以查看结果。 1-3个很好 4-13出现错误,
无法获取Series类的Name属性
14个很好
15-16对象“\u Chart”的
方法“SeriesCollection”出错失败
从图表中删除所有序列时,Excel中存在错误。我的解决方法是始终在图表中保留至少一个系列(即使其中没有数据)。这似乎对我有用


只是想到了另一件事。删除一个系列时,所有剩余系列的索引都会减少一个,因此不能通过从1循环到系列数来删除它们。您可以改为使用do循环删除它们,直到
SeriesCollection.Count=0
(或1,请参阅前面的注释)。或向后迭代并始终删除最后一个系列(即
SeriesCollection(SeriesCollection.Count))的for循环.Delete

您无法删除所有序列,否则图表将自行删除。解决此问题的方法是重命名所有现有序列;然后输入代码以生成新内容;然后运行另一个代码段以删除您重命名的序列

'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

您可以将代码简化为:

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

我不知道为什么代码对您不起作用,但越简单通常越好。而且您不需要知道序列名称就可以删除序列。

这就是您正在尝试的吗?@Siddharth本质上是的,这就是我正在尝试的,实际上不需要数据标签。我已经用我正在进行的一些测试的结果更新了初始请求我已经做了。结果很奇怪。谢谢你的帮助,但我仍然得到相同的行为和错误。还有其他想法吗?你能加载一个excel示例文件,这样我就不用创建示例文件了。你可以在wikisend.com上传该文件,然后在这里共享链接。我刚刚测试了你输入的代码如果在新工作簿中重建图表,然后重新运行代码呢?不要忘记Doevents和步骤-1您可能指的是
if.SeriesCollection(c)。名称类似于“remove*”然后…
?您可以删除所有系列。图表将保留,但在添加更多数据之前它将为空。清除数据时消失的许多元素将丢失格式,标题将丢失文本。