2014-10-22 27 views
46

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 
+1

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. –

+0

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

+2

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. –

Antwort

15

Dies spricht nicht an, warum der Fehler auftritt. Dies ist eine Problemumgehung.

Bevor Sie SetSourceData aufrufen, löschen Sie alle vorhandenen Serien im Diagramm, und der Code wird wie erwartet ausgeführt.

Ich bin nicht sicher, warum der Fehler an erster Stelle auftritt, aber das macht es weggehen.

+0

Danke für Ihre Hilfe Jean-François. Leider habe ich bis jetzt noch keine Informationen zu diesem Problem mit der Chart/Serie gefunden. Ich werde versuchen, etwas näher auf dieses Problem einzugehen und Ihre vorgeschlagene Lösung vorläufig zu verwenden. – Pocerus

0

Eine weitere Möglichkeit besteht darin, einen benannten Bereich für die Daten zu definieren, die mit der Formel Offset und entsprechenden Referenzzellen definiert sind. Dies erfordert, dass die Daten zusammenhängend sind, nicht die Anfangszeile & Spalte ändern, in der es beginnt, und für Sie mindestens eine Referenzformel (=COUNTA() für die Spalte/Zeile mit den Daten) einrichten, die zum Festlegen der Höhe/Breite verwendet werden kann des Offset-Bereichs.

Sonst ein sehr handliches kleines umher arbeiten, um dies aus Makros herauszunehmen und es in Arbeitsblattlogik zu setzen.

Verwandte Themen