在Excel VBA 2016中删除图表中的数据

我有一个dynamic的图表,我很难清除数据。

据我所知,这些数据指标是累积的。 这意味着,如果我从另一张表中复制了12个数据集的“图表4”,并且干净地制作完成。 数据库的数量= 12 = ActiveSheet.ChartObjects(“Chart 4”)。Chart.SeriesCollection.count。 而这些系列的指数从1到12。

现在,如果我删除1个系列和一个新系列,数据库的数量将继续为12,但是指数现在将从1到11和13运行。

所以,当我试图通过计算序列数量和删除序列的数字删除它们:1:ActiveSheet.ChartObjects(“Chart 4”)。Chart.SeriesCollection.count如果系列已被删除和添加将失败。

所以为了克服这个问题,我尝试了“对于每个..在图表4 ..选项:

For Each Series In ActiveSheet.ChartObjects("Chart 4") 'For Each FullSeriesCollection In ActiveSheet.ChartObjects("Chart 4") ActiveChart.FullSeriesCollection.Delete Next 

为此,我得到一个错误,指出:“对象不支持此属性或方法”

所以我在堆栈溢出问题上看了这个问题,发现由于图中数据库索引的努力程序,计数器需要下去:

因此,我从VBA删除图表系列复制和调整:

 Dim iSrs As Long With ActiveChart For iSrs = .SeriesCollection.count To 1 Step -1 If InStr(LCase$(.SeriesCollection(iSrs).name), "series") > 0 Then .SeriesCollection(iSrs).Delete End If Next End With MsgBox (count_non_existant_series & " and the nr of series still present = " & ActiveSheet.ChartObjects("Chart 4").Chart.SeriesCollection.count) 

这不会删除所有的数据系列,因为之后它仍显示:count = 27

我尝试了几个其他的公式,其结果是不删除所有的(有时用“在错误恢复下一个”上,它会删除一半,四舍五入时)和完整的代码是:

 'select workbook, worksheet Workbooks("N.xlsm").Worksheets("day_visual").Activate Workbooks("N.xlsm").Worksheets("day_visual").range("A1").Select 'select chart ActiveSheet.ChartObjects("Chart 4").Activate ActiveSheet.ChartObjects("Chart 4").Select 'remove all series(0 to xx?) MsgBox (ActiveSheet.ChartObjects("Chart 4").Chart.SeriesCollection.count) 'For Remove = 1 To ActiveSheet.ChartObjects("Chart 4").Chart.SeriesCollection.count ' 'On Error Resume Next ' ActiveChart.FullSeriesCollection(Remove).Select ' Selection.Delete ' ' 'ActiveChart.FullSeriesCollection(Remove).Delete ' 'MsgBox ("hi") ' count_non_existant_series = 1 + count_non_existant_series 'Next Remove ActiveSheet.ChartObjects("Chart 4").Activate ActiveSheet.ChartObjects("Chart 4").Select 'For x = Workbooks("N.xlsm").Worksheets("day_visual").ChartObjects("Chart 4").SeriesCollection.count To 2 Step -1 'For x = Workbooks("N.xlsm").Worksheets("day_visual").ChartObjects("Chart 4").FullSeriesCollection.count To 2 Step -1 ' ActiveSheet.ChartObjects("Chart 4").SeriesCollection(x).Delete 'Next x Dim iSrs As Long With ActiveChart For iSrs = .SeriesCollection.count To 1 Step -1 If InStr(LCase$(.SeriesCollection(iSrs).name), "series") > 0 Then .SeriesCollection(iSrs).Delete End If Next End With 'For Each Series In ActiveSheet.ChartObjects("Chart 4") For Each FullSeriesCollection In ActiveSheet.ChartObjects("Chart 4") ActiveChart.FullSeriesCollection.Delete Next MsgBox (count_non_existant_series & " and the nr of series still present = " & ActiveSheet.ChartObjects("Chart 4").Chart.SeriesCollection.count) 'With ActiveSheet.ChartObjects("Chart 4") ''Do While .SeriesCollection.count >= 1 '.SeriesCollection(.SeriesCollection.count).Delete 'Loop 'End With Dim add_chartlabels As Long 

我对Excel如何存储指数的确切性质的理解是缺乏的,导致我尝试不正确的解决scheme。 任何人都可以:

  1. 告诉我,我对图表系列索引的理解是否不正确。
  2. 解释为什么代码在“for each”方法上产生运行时错误483?
  3. 解释为什么手动迭代代码不会删除所有系列?
  4. 显示一个function代码,从图表中删除任何和所有系列,同时不删除图表本身?

或者如果你有任何其他的贡献带来的洞察力,你会让我很高兴。

For Each方法的运行时483错误 – 因为使用这个方法意味着你从第一个循环到最后一个。 删除对象时,你需要向后循环。 因此,为此,您需要使用For iSrs = .SeriesCollection.count To 1 Step -1

尝试下面的代码,在代码中的解释(作为评论):

 Option Explicit Sub DeleteChartSer() Dim Sht As Worksheet Dim ChtObj As ChartObject Dim Ser As Series Dim iSrs As Long ' set the worksheet object (this will work only if "Nutrition planner v42.xlsm" is open) Set Sht = Workbooks("Nutrition planner v42.xlsm").Worksheets("day_vita_visual") ' set the ChartObject Set ChtObj = Sht.ChartObjects("Chart 4") MsgBox ChtObj.Chart.SeriesCollection.Count With ChtObj.Chart ' <-- there's no need to select the Chart, use fullay qualified objects instead If .SeriesCollection.Count >= 0 Then For iSrs = .SeriesCollection.Count To 1 Step -1 ' allways loop backwards when deleting objects If LCase(.SeriesCollection(iSrs).Name) Like "*series*" Then .SeriesCollection(iSrs).Delete End If Next iSrs End If End With 'MsgBox (count_non_existant_series & " and the nr of series still present = " & ActiveSheet.ChartObjects("Chart 4").Chart.SeriesCollection.Count) End Sub 

编辑1 :如果你想删除所有的Series ,只是评论一If ,下面的一个,因为在这里你检查如果Series.Name包含作品“系列”:

 If LCase(.SeriesCollection(iSrs).Name) Like "*series*" Then 

所以用下面的代码replace你的代码的最后部分:

 With ChtObj.Chart ' <-- there's no need to select the Chart, use fullay qualified objects instead If .SeriesCollection.Count >= 0 Then For iSrs = .SeriesCollection.Count To 1 Step -1 ' allways loop backwards when deleting objects .SeriesCollection(iSrs).Delete Next iSrs End If End With 

删除if语句后,它将工作。

 With ActiveChart If .SeriesCollection.count >0 then For iSrs = .SeriesCollection.count To 1 Step -1 'If InStr(LCase$(.SeriesCollection(iSrs).name), "series") > 0 Then .SeriesCollection(iSrs).Delete 'End If Next end if End With