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

时间:2012-08-09 12:23:56

标签: excel vba excel-vba 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
    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,因为前三个系列总是非空的。

感谢。

**更新**

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

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 <1的错误 - 鉴于图表中的系列数量,这并不奇怪。

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

import { 
  NativeScriptModule,
  NativeScriptFormsModule, 
  NativeScriptHttpModule, 
  NativeScriptRouterModule 
} from "nativescript-angular";
import { NgModule, NO_ERRORS_SCHEMA } from "@angular/core";
import { AppRoutes, AppComponents } from "./app.routing";
import { AppComponent } from './app.component';

@NgModule({
  declarations: [AppComponent, ...AppComponents],
  imports: [
    NativeScriptModule,
    NativeScriptFormsModule,
    NativeScriptHttpModule,
    NativeScriptRouterModule.forRoot(AppRoutes)
  ],
  schemas: [NO_ERRORS_SCHEMA],
  bootstrap: [AppComponent]
})
export class AppModule { }

答案 2 :(得分:0)

您可以将代码简化为:

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

我不知道为什么代码不适合你,但更简单通常更好。而且您不需要知道系列名称就可以删除系列。