我公司使用Excel 2003创建了一个应用程序,该应用程序存在问题。该应用程序从数据源检索数据,并使用VBA例程中的SetSourceData
更新图表,传递包含编写相关数据的单元格的范围。
该应用程序在Office 2003中运行良好,但当在Office 2010中执行应用程序时,它会显示以下错误:
运行时错误“1004”:对象“_Chart”的方法“SetSourceData”失败。
我已在Office 2010的简单Excel文件中创建了一个For
循环,并根据传递给图表的范围中的列数,错误将更快或更晚地出现。传递的列数越多,错误就越快出现。我认为这必须与图表中系列的数量有关(列数越多,系列越多)。
这是Office 2010中的Chart对象或Series中实施的某种机制/缓冲区吗?当在Office 2003中运行时,相同的For
循环永远不会出现问题,我不确定如何解决此问题。
到目前为止,我只能通过使用Goto指令删除所有Series来控制错误,然后使用For Each
循环选择Chart的SeriesCollection中的所有对象来删除所有Series。如果我这样做并在再次传递范围时恢复应用程序的执行,则所有数据都会正确地绘制在Chart对象中。
重现错误的示例。将以下代码放入新的Excel 2010工作簿的VBA模块中。运行子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
For j = cht.Chart.SeriesCollection.Count To 1 Step -1 : cht.Chart.SeriesCollection(j).Delete : Next j
),那么它就可以正常工作。 - Jean-François Corbett