3

我正在尝试使用 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

我可以为图表成功运行一次,但所有后续循环都失败并出现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 个系列)以查看结果。1 - 3 工作正常 4 - 13 出错Unable to get the Name property of the Series class 14 工作正常 15 - 16 出错Method 'SeriesCollection' of object '_Chart' failed<- 考虑到图表中的系列数量,这并不奇怪。

这种行为让我认为 Excel 存在错误。还有其他想法吗?

4

3 回答 3

3

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

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

于 2013-05-09T20:35:07.430 回答
1

您不能删除所有系列,否则图表将自行删除。我要做的就是重命名所有现有的系列;然后输入你的代码来构建新的东西;然后运行另一个片段以删除您重命名的系列

'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
于 2016-12-09T18:01:32.053 回答
0

您可以将代码简化为:

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

我不知道为什么代码不适合您,但通常越简单越好。而且您无需知道系列名称即可删除系列。

于 2017-01-06T14:46:11.037 回答