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

时间:2014-10-22 08:34:03

标签: excel vba excel-vba charts

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

应用程序在Office 2003中运行得很好,但是当在Office 2010中执行应用程序时,它会出现此错误:

  

运行时错误'1004':对象'_Chart'的方法'SetSourceData'失败。

我在Office 2010中的简单Excel文件中创建了一个For循环,并且根据Range中传递到图表的列数,迟早会出现错误。在Range中传递的列越多,它就会越早出现。我想这必须与图表中的系列数量相关(更多列更多系列)。

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

到目前为止,我只能删除所有使用Goto指令控制Error的系列,以使用For Each循环删除SeriesCollection中的所有系列,以选择Chart的SeriesCollection中的所有对象。如果我执行此操作并在再次传递Range时继续执行应用程序,则所有数据都将正确地绘制在图表对象中。

重现错误的示例。以下代码将放入新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

2 个答案:

答案 0 :(得分:15)

这并不能解决错误发生的原因。这是一种解决方法。

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

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

我不确定为什么错误发生在第一位,但这会让它消失。

答案 1 :(得分:0)

另一种可能性是为使用Offset公式和适当的参考单元定义的数据定义命名范围。这要求数据是连续的,而不是改变初始行和&列开始,并为您设置至少一个参考公式({/ 1}}在包含数据的列/行上),可用于设置偏移范围的高度/宽度。

否则一个非常方便的小工作就是把它从宏中取出并放在工作表逻辑中。