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
47
demandé sur Jean-François Corbett 2014-10-22 12:34:02

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.

15
répondu Jean-François Corbett 2014-10-23 08:24:49

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.

0
répondu JMichael 2015-06-15 21:28:21