Ich habe ein Problem mit einer Anwendung, die in Excel 2003 in meiner Firma erstellt wurde. Die Anwendung ruft Daten aus einer Quelle ab und aktualisiert ein Diagramm unter Verwendung der SetSourceData
in einer VBA-Routine, wobei ein Bereich übergeben wird, der die Zellen enthält, in die die relevanten Daten geschrieben werden.Wiederholte Aufrufe von Chart.SetSourceData geben Fehler 1004
Die Anwendung läuft ganz gut in Office 2003, aber wenn die Anwendung in Office 2010 ausgeführt wird, es gibt diesen Fehler:
Run-time error '1004': Method 'SetSourceData' of object'_Chart' failed.
ich eine For
Schleife in einer einfachen Excel-Datei in Office 2010 erstellt haben, und je Bei der Anzahl der Spalten im Bereich zum Diagramm wird der Fehler früher oder später angezeigt. Je mehr Spalten in der Range passieren, desto schneller wird es kommen. Ich denke, das muss mit der Anzahl der Reihen im Chart zusammenhängen (mehr Spalten mehr Reihen).
Ist dies eine Art von Mechanismus/Puffer in dem in Office 2010 implementierten Diagrammobjekt oder der Serie, die in Office 2003 nicht vorhanden war? Die gleiche For
Schleife zeigt nie ein Problem, wenn es in Office 2003 ausgeführt wird, und ich bin mir nicht sicher, wie Sie dieses Problem lösen.
Bisher konnte ich nur alle Serien löschen, die den Fehler mit einem Goto-Befehl steuern, um alle Serien in der SeriesCollection mit einer For Each
-Schleife zu löschen, um alle Objekte in der SeriesCollection des Diagramms auszuwählen. Wenn ich dies tue und die Ausführung der Anwendung wiederaufnahme, wenn ich den Bereich erneut überlasse, werden alle Daten im Chart-Objekt korrekt dargestellt.
Beispiel, um den Fehler zu reproduzieren. Der folgende Code wird in ein VBA-Modul in einer neuen Excel 2010-Arbeitsmappe eingefügt. Führen Sie den Sub setDataChart
aus, und die Anwendung wird ausgeführt, bis die Fehlermeldung angezeigt wird.
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
Es schlägt nach 209 Iterationen fehl; Ich weiß nicht warum. Wenn ich jedoch alle Serien zu Beginn jeder Iteration lösche (z. B. mit 'For j = cht.Chart.SeriesCollection.Count To 1 Step -1: cht.Chart.SeriesCollection (j) .Delete: Next j'), dann ist es funktioniert gut. –
Hallo Jean-François, wenn Sie die Anzahl der Serien ändern, wird es bei einer anderen Anzahl von Iterationen fehlschlagen, je größer die Anzahl der Serien ist, desto eher wird es fehlschlagen. Ich war nur neugierig darauf, warum das gleiche Objekt und derselbe Code in verschiedenen Versionen von Office unterschiedliche Ergebnisse produzieren. Ich schätze, ich muss den Fehler kontrollieren und fortfahren, die Reihe im Diagramm mit Ihrem Code zu löschen und die Ausführung des Codes fortzusetzen, nachdem die Reihen gelöscht worden sind.Vielen dank für Deine Hilfe. – Pocerus
Die Excel-Charting-Engine wurde für Excel 2007 komplett neu erstellt und diese wird seither verwendet. Es gab viele Veränderungen, die meisten gut, ein paar schlecht. Auch viele kleine Verhaltensweisen in VBA sind unterschiedlich. Sie könnten fragen, warum etwas ist, und niemand weiß wirklich, außer, um die aktualisierte Charting-Engine zu zitieren. Wenn Sie einen Workaround für eines Ihrer Probleme bekommen können, wie das, das Jean-François gepostet hat, dann laufen Sie damit. –