Chart.SetSourceData的重复调用会出现错误1004

我在我公司的Excel 2003中创build的应用程序出现问题。 应用程序从源检索数据并使用VBA例程中的SetSourceData更新Chart,从而传递包含写入相关数据的单元格的Range。

应用程序在Office 2003中运行良好,但在Office 2010中执行应用程序时,会出现此错误:

运行时错误“1004”:object'_Chart的方法'SetSourceData'失败。

我在Office 2010中的一个简单的Excel文件中创build了一个For循环,并且取决于在范围内传递给图表的列数,迟早会出现错误。 越来越多的列通过范围越早出现。 我想这必须与图表中的系列数量相关(更多系列更多)。

这是在Office 2010中实现的图表对象或系列中的某种机制/缓冲区吗? 当它在Office 2003中运行时, For循环从不显示问题,我不知道如何解决此问题。

到目前为止,我只能使用Goto指令删除控制错误的所有系列,使用For Each循环删除SeriesCollection中的所有系列,以select图表的SeriesCollection中的所有对象。 如果我这样做,并在再次通过范围时继续执行应用程序,则所有数据都将正确绘制在“图表对象”中。

重现错误的示例。 以下代码将放入新的Excel 2010工作簿中的VBA模块中。 运行Sub setDataChart ,应用程序将运行,直到显示错误消息。

  Sub setDataChart() Call createAColValues ActiveSheet.Shapes.AddChart.Select ActiveChart.ChartType = xlXYScatterSmoothNoMarkers ActiveChart.SetSourceData Source:=Range("A1:FA6"), PlotBy:=xlColumns ActiveSheet.ChartObjects(1).Activate With ActiveChart.Parent .Height = 325 .Width = 900 .Top = 120 .Left = 10 End With Call updateValues Call sendData End Sub Sub sendData() Dim cht As ChartObject Set cht = ActiveSheet.ChartObjects(1) 'On Error GoTo delSeries: For i = 0 To 1000 cht.Chart.SetSourceData Source:=ActiveSheet.Range("A1:FA6"), PlotBy:=xlColumns Next i End Sub Sub createAColValues() Range("A1").Select ActiveCell.FormulaR1C1 = "1" Range("A2").Select ActiveCell.FormulaR1C1 = "2" Range("A1:A2").Select Selection.AutoFill Destination:=Range("A1:A6"), Type:=xlFillDefault Range("A1:A6").Select End Sub Sub updateValues() Range("B1").Select ActiveCell.FormulaR1C1 = "=RANDBETWEEN(0,10)" Range("B1").Select Selection.AutoFill Destination:=Range("B1:B6"), Type:=xlFillDefault Range("B1:B6").Select Selection.AutoFill Destination:=Range("B1:FA6"), Type:=xlFillDefault Range("B1:FA6").Select End Sub 

这并不解决为什么发生错误。 这是一个解决方法。

在调用SetSourceData之前,删除当前在图表中的所有现有系列,代码将按预期方式运行。

 For j = cht.Chart.SeriesCollection.Count To 1 Step -1 cht.Chart.SeriesCollection(j).Delete Next j 

我不知道为什么错误首先发生,但这使它消失。

另一种可能性是使用Offset公式和适当的参考单元定义数据的命名范围。 这要求数据是连续的,不要改变它开始的最初的行和列,并且要设置至less一个引用公式( =COUNTA()包含数据的列/行上的=COUNTA() ),可以用来设置偏移范围的高度/宽度。

否则,一个非常方便的小工作就可以把这个macros放在工作表逻辑中。