excel - name - Las llamadas repetidas de Chart.SetSourceData dan error 1004
how to create a graph macro in excel (2)
Esto no explica por qué ocurre el error. Esta es una solución.
Antes de llamar a SetSourceData
, elimine todas las series existentes actualmente en el gráfico, y el código se ejecutará como se espera.
For j = cht.Chart.SeriesCollection.Count To 1 Step -1
cht.Chart.SeriesCollection(j).Delete
Next j
No estoy seguro de por qué ocurre el error en primer lugar, pero esto hace que desaparezca.
Tengo un problema con una aplicación que se creó en Excel 2003 en mi empresa. La aplicación recupera datos de una fuente y actualiza una Tabla usando SetSourceData
en una rutina VBA que pasa un Rango que contiene las celdas donde se escriben los datos relevantes.
La aplicación funciona perfectamente en Office 2003, pero cuando la aplicación se ejecuta en Office 2010 da este error:
Error ''1004'' en tiempo de ejecución: el método ''SetSourceData'' de object''_Chart ''falló.
He creado un bucle For
en un archivo simple de Excel en Office 2010 y, dependiendo del número de columnas pasadas en el rango al gráfico, el error aparecerá tarde o temprano. Mientras más columnas pasen en el rango, más pronto saldrá. Supongo que esto tiene que estar relacionado con el número de series en el Gráfico (más columnas más series).
¿Es esto algún tipo de mecanismo / búfer en el Objeto Chart o Serie implementado en Office 2010 que no existía en Office 2003? El mismo bucle For
nunca muestra un problema cuando se ejecuta en Office 2003 y no estoy seguro de cómo resolver este problema.
Hasta ahora solo he podido eliminar todas las Series que controlan el Error con una instrucción Goto para eliminar todas las series de la Colección de Series usando un bucle For Each
para seleccionar todos los objetos en la Colección de Series del Gráfico. Si hago esto y reanudo la ejecución de la aplicación cuando paso nuevamente el Rango, todos los datos se pintan correctamente en el Objeto del Gráfico.
Ejemplo para reproducir el error. El siguiente código debe colocarse en un módulo de VBA en un nuevo libro de trabajo de Excel 2010. Ejecute Sub setDataChart
y la aplicación se ejecutará hasta que se muestre el mensaje de error.
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
Otra posibilidad es definir un rango con nombre para los datos que se definen utilizando la fórmula de Offset
y las celdas de referencia apropiadas. Esto requiere que los datos sean contiguos, no cambien la fila y columna inicial en la que comienza, y que configure al menos una fórmula de referencia ( =COUNTA()
en la columna / fila que contiene los datos) que se puede usar para configurar el alto / ancho del rango de desplazamiento.
De lo contrario, sería muy útil trabajar para sacar esto de las macros y ponerlo en la lógica de la hoja de trabajo.