【发布时间】:2014-12-17 15:46:52
【问题描述】:
我在公司的 Excel 2003 中创建的应用程序有问题。应用程序从源检索数据并使用 VBA 例程中的 SetSourceData 更新图表,传递包含写入相关数据的单元格的 Range。
该应用程序在 Office 2003 中运行良好,但在 Office 2010 中执行该应用程序时出现以下错误:
运行时错误“1004”:对象“_Chart”的方法“SetSourceData”失败。
我在 Office 2010 中的一个简单 Excel 文件中创建了一个For 循环,并且根据在范围中传递给图表的列数,迟早会出现错误。 Range 中传递的列越多,它就会越早出现。我想这必须与图表中的系列数量有关(更多列更多系列)。
这是在 Office 2010 中实现的图表对象或系列中的某种机制/缓冲区,但在 Office 2003 中不存在?相同的For 循环在 Office 2003 中运行时从未出现问题,我不知道如何解决此问题。
到目前为止,我只能删除所有控制错误的系列,使用 Goto 指令删除 SeriesCollection 中的所有系列,使用 For Each 循环选择图表的 SeriesCollection 中的所有对象。如果我这样做并在我再次传递 Range 时恢复应用程序的执行,则所有数据都会正确地绘制在 Chart 对象中。
重现错误的示例。以下代码将放入新 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
【问题讨论】:
-
209次迭代失败;我不知道为什么。但是,如果我在每次迭代开始时删除所有系列(使用例如
For j = cht.Chart.SeriesCollection.Count To 1 Step -1 : cht.Chart.SeriesCollection(j).Delete : Next j),那么它可以正常工作。 -
您好 Jean-François,如果您更改系列数,它将在不同的迭代次数下失败,系列数越大,失败越快。我只是好奇为什么相同的对象和相同的代码在不同版本的 Office 中会产生不同的结果。我想我将不得不控制错误并继续使用您的代码删除图表中的系列,并在系列被删除后恢复代码的执行。非常感谢您的帮助。
-
Excel 图表引擎是为 Excel 2007 完全重建的,从那时起这个引擎一直在使用。有很多变化,大多数是好的,一些是坏的。 VBA 中的许多小行为也有所不同。您可能会问为什么会这样,除了引用更新的图表引擎之外,没有人真正知道。如果您可以找到任何问题的解决方法,例如 Jean-François 发布的问题,请使用它。
-
感谢 Jon 的评论,我想我必须坚持 Jean-François 建议的解决方法才能继续在最新版本的 MS Office 中使用该应用程序。