Poc*_*rus 47 excel charts vba excel-vba
我在我公司的Excel 2003中创建的应用程序有问题.应用程序从源检索数据并使用SetSourceData
VBA例程更新图表,该例程传递包含写入相关数据的单元格的范围.
该应用程序在Office 2003中运行得很好,但是当在Office 2010中执行该应用程序时,它会出现以下错误:
运行时错误'1004':对象'_Chart'的方法'SetSourceData'失败.
我For
在Office 2010中的一个简单的Excel文件中创建了一个循环,并且根据Range中传递给Chart的列数,错误迟早会出现.在Range中传递的列越多,它就会越早出现.我想这必须与图表中的系列数量相关(更多列更多系列).
这是在Office 2010中实现的图表对象或系列中的某种机制/缓冲区,在Office 2003中不存在吗?For
在Office 2003中运行时,相同的循环从不显示问题,我不知道如何解决此问题.
到目前为止,我只能删除所有使用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
Run Code Online (Sandbox Code Playgroud)
Jea*_*ett 15
这并不能解决错误发生的原因.这是一种解决方法.
在调用之前SetSourceData
,删除当前图表中的所有现有系列,代码将按预期运行.
For j = cht.Chart.SeriesCollection.Count To 1 Step -1
cht.Chart.SeriesCollection(j).Delete
Next j
Run Code Online (Sandbox Code Playgroud)
我不确定为什么错误发生在第一位,但这使它消失了.