Les appels répétés de Graphique.SetSourceData donne l'erreur 1004
J'ai un problème avec une application qui a été créée dans Excel 2003 dans mon entreprise. L'application récupère les données d'une source et met à jour un graphique en utilisant le SetSourceData
dans une routine VBA passant une plage contenant les cellules où les données pertinentes sont écrites.
, L'application fonctionne très bien dans Office 2003, mais lorsque l'application est exécutée dans Office 2010, il donne cette erreur:
Erreur D'exécution '1004': méthode 'SetSourceData' de object'_chart' échouer.
J'ai créé une boucle For
dans un simple fichier Excel dans Office 2010 et en fonction du nombre de colonnes passées dans la plage du graphique, l'erreur apparaîtra tôt ou tard. Plus il y a de colonnes passées dans la plage, plus tôt il apparaîtra. Je suppose que cela doit être lié au nombre de séries dans le graphique(plus de colonnes plus de séries).
Est-ce une sorte de mécanisme / tampon dans l'objet graphique ou la série implémentée dans Office 2010 qui n'existait pas dans Bureau 2003? La même boucle For
ne montre jamais de problème lorsqu'elle est exécutée dans Office 2003 et je ne sais pas comment résoudre ce problème.
Jusqu'à présent, j'ai seulement été en mesure de supprimer toutes les séries contrôlant l'erreur avec une instruction Goto pour supprimer toutes les séries dans la SeriesCollection en utilisant une boucle For Each
pour sélectionner tous les objets dans la SeriesCollection du graphique. Si je fais cela et que je reprends l'exécution de l'application lorsque je passe à nouveau la plage toutes les données sont peintes dans le graphique Objet correctement.
Exemple pour reproduire l'erreur. le code suivant doit être placé dans un module VBA dans un nouveau classeur Excel 2010. Exécutez le sous setDataChart
et l'application s'exécutera jusqu'à ce que le message d'erreur s'affiche.
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
2 réponses
Cela ne répond pas à la raison pour laquelle l'erreur se produit. C'est une solution de contournement.
Avant d'appeler SetSourceData
, Supprimez toutes les séries existantes actuellement dans le graphique, et le code fonctionnera comme prévu.
For j = cht.Chart.SeriesCollection.Count To 1 Step -1
cht.Chart.SeriesCollection(j).Delete
Next j
Je ne sais pas pourquoi l'erreur se produit en premier lieu, mais cela la fait disparaître.
Une autre possibilité consiste à définir une plage nommée pour les données définies à l'aide de la formule Offset
et des cellules de référence appropriées. Cela nécessite que les données soient contiguës, ne modifient pas la ligne et la colonne initiales dans lesquelles elles commencent, et que vous configuriez au moins une formule de référence (=COUNTA()
sur la colonne/ligne contenant les données) qui peut être utilisée pour définir la hauteur/largeur de la plage de décalage.
Sinon, un petit travail très pratique pour sortir cela des macros et le mettre dans la feuille de calcul logique.