Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/08/2011, 14h39   #1
Invité de passage
 
Homme
Inscription : août 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : août 2011
Messages : 2
Points : 0
Points : 0
Par défaut [XL 2010] Erreur 1004 pour création seriescollection (chart)

Bonjour,

Une erreur 1004:" erreur définie par l'objet ou l'application" apparait à l'execution de ce code
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
 
Sub essaichart1()
 
Dim ChartObj As ChartObject
 
Dim C1 As Series, C2 As Series
 
Worksheets("Essai pivot1").Activate
 
 
Set ChartObj = ActiveSheet.ChartObjects.Add(Left:=100, Width:=800, Top:=75, Height:=325)
 
Set C1 = ChartObj.Chart.SeriesCollection.NewSeries
 
 
With C1
.Name = "2011"
.Values = Sheets("Essai pivot1").Range("B3:B54")
.XValues = Sheets("Data").Range("A2:A53")
End With
 
ChartObj.Chart.ChartType = xlLine
ChartObj.Chart.Axes(xlValue).MaximumScale = 40
ChartObj.Chart.Axes(xlValue).MinimumScale = 28
 
 
Set C2 = ChartObj.Chart.SeriesCollection.NewSeries
 
With C2
            .Name = "2010"
            .Values = Sheets("Data").Range("H2:H53")
            .XValues = Sheets("Data").Range("A2:A53")
 
End With
 
End Sub
"

L'erreur apparait dès le set C1. Pourtant j'utilise la fonction newsseries le plus basiquement possible.
Le plus bizarre c'est que ça marchait parfaitement jusqu'à hier. pourtant pas de changement qui puisse affecter quelquechose là dedans
J'ai beau cherché et je ne vois d'où vient le problème.

Merci de votre aide
jeff202 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 18h26   #2
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
J'ai testé ceci et ça fonctionne
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub essaichart1()
Dim ChartObj As ChartObject
Dim SerieObj As Series
 
Set ChartObj = Worksheets("Essai pivot1").ChartObjects.Add(Left:=100, Width:=800, Top:=75, Height:=325)
With ChartObj.Chart
    .ChartType = xlLine
    .Axes(xlValue).MaximumScale = 40
    .Axes(xlValue).MinimumScale = 28
    Set SerieObj = .SeriesCollection.NewSeries
    With SerieObj
        .Name = "2011"
        .Values = Sheets("Essai pivot1").Range("B3:B54")
        .XValues = Sheets("Data").Range("A2:A53")
    End With
    Set SerieObj = .SeriesCollection.NewSeries
    With SerieObj
        .Name = "2010"
        .Values = Sheets("Data").Range("H2:H53")
        .XValues = Sheets("Data").Range("A2:A53")
    End With
    Set SerieObj = Nothing
End With
Set ChartObj = Nothing
End Sub
Sinon, sans la variable SerieObj
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub essaichart1()
Dim ChartObj As ChartObject
 
Set ChartObj = Worksheets("Essai pivot1").ChartObjects.Add(Left:=100, Width:=800, Top:=75, Height:=325)
With ChartObj.Chart
    .ChartType = xlLine
    .Axes(xlValue).MaximumScale = 40
    .Axes(xlValue).MinimumScale = 28
    With .SeriesCollection.NewSeries
        .Name = "2011"
        .Values = Sheets("Essai pivot1").Range("B3:B54")
        .XValues = Sheets("Data").Range("A2:A53")
    End With
    With .SeriesCollection.NewSeries
        .Name = "2010"
        .Values = Sheets("Data").Range("H2:H53")
        .XValues = Sheets("Data").Range("A2:A53")
    End With
End With
Set ChartObj = Nothing
End Sub
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/08/2011, 13h09   #3
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
Par défaut Chart avec deux SeriesCollection dans Excel VBA

Bonjour jeff202,

1. Ordre de définition de chaque série

Citation:
Envoyé par jeff202 Voir le message
L'erreur apparaît dès le set C1.
Bien que l'erreur 1004 n'a pas été reproduite, il aurait été intéressant de savoir exactement si c'est réellement sur la propriété Name, Values ou XValues de la série C1 que vous l'avez rencontrée, autrement dit il faut donner le n° de ligne de l'erreur. Pour cela il faut encadrez votre code dans votre message entre les deux balises suivantes :

Le modérateur a inséré pour vous avant la première ligne la balise [code] et après la dernière ligne de code la balise [/code]
Dans l'éditeur du forum, vous trouverez dans la barre d'outil le bouton "#" qui ajoute automatiquement ces deux balises si vous sélectionnez au préalable toutes les lignes de votre code dans votre message.

Dans la solution proposée, on a préféré commencer la définition de la série par Values puis XValues et enfin Name.

2. Comportement différent hors débogueur

Dans le débogueur en pas à pas dans essaichart1(), les deux courbes se dessinent parfaitement dans la limite indiquée entre 28 et 40 en abscisse.

Symptôme
Quand on exécute essaichart1() sans point d'arrêt, les coordonnées en abscisse et ordonnée sont énormes et la zone pour la courbe s'est considérablement réduite.

Solution
On a résolu le problème de facteur d'échelle en complétant le paramétrage du graphique.

3. Typer le Chart avant de définir ses séries

Diagnostique plus détaillé
La caractéristique de la série C1 est qu'elle est définie avant le type du Chart.
Il vaut mieux définir d'abord le type de Chart puis déclarer les deux séries.

Pour vous, vous n'avez pas besoin de la création du contexte de test, puisque vous l'avez déjà.
Par contre pour le lecteur, cela aide dans la description du problème de préciser un jeu de test le plus simple possible :

A partir d'un classeur vide, créer les deux feuilles suivantes :
Feuille "Essai pivot1" :
B3:B54 : nombres entiers entre 28 et 40.

Feuille "Data":
A2:A53 : idem dans un ordre différent que la feuille précédente.
H2:H53 : idem.

L'idéal étant de simplifier la maquette du problème :
- une seule feuille
- nombre de 1 à 52 grâce à la facilité d'Excel d'incrémenter la valeur de la cellule au-dessus avec Ctrl + Drag down, etc.

Commencer la maquette toujours par : Option Explicit ' Commentaire
Comme cela, le lecteur est sûr que les variables ont été déclarées.

VBE menu "Insérer" > "Module".
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Option Explicit ' Chart avec deux series de valeurs
 
Sub ChartPivotData()
Dim ChartObj As ChartObject, rngXValues As Range
    Set rngXValues = Sheets("Data").Range("A2:A53")
    Worksheets("Essai pivot1").Activate
    Set ChartObj = ActiveSheet.ChartObjects.Add(Left:=100, Width:=800, Top:=75, Height:=325)
    With ChartObj
        .Chart.ChartType = xlLine ' Déclarer le type en premier
        CleanSeriesColl ChartObj.Chart ' dans le cas où il y a des series par défaut
        With .Chart.SeriesCollection.NewSeries
            .Values = Sheets("Essai pivot1").Range("B3:B54")
            .XValues = rngXValues
            .Name = "2011"
            .Border.Weight = xlMedium
        End With
        With .Chart.SeriesCollection.NewSeries
            .Values = Sheets("Data").Range("H2:H53")
            .XValues = rngXValues
            .Name = "2010"
            .Border.Weight = xlMedium
        End With
        .Chart.HasDataTable = False
        .Chart.Legend.Position = xlLegendPositionBottom
        .Chart.HasTitle = True
        .Chart.ChartTitle.Text = "Pivot Data"
        .Chart.PlotArea.Interior.ColorIndex = 0 'White
        .Chart.Axes(xlValue).MaximumScale = 40
        .Chart.Axes(xlValue).MinimumScale = 28
    End With
End Sub
 
Private Sub CleanSeriesColl(ChartObj As Chart)
    With ChartObj
        On Error Resume Next
        Do
            .SeriesCollection(1).Delete
            If Err.Number > 0 Then Exit Do
        Loop Until False
        On Error GoTo 0
    End With
End Sub
 
Sub ChartDelete()
    With ActiveSheet.ChartObjects
        While .Count > 0
            CleanSeriesColl .Item(1).Chart
            .Item(1).Delete
        Wend
    End With
End Sub
Notez que l'on a ajouté CleanSeriesColl() après la définition du type et avant de déclarer les deux séries.

Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE d'Excel, copier-coller et valider par ENTER :
On obtient le graphique souhaité à chaque appel de la procédure ChartPivotData().

4. Conclusion

La création d'un Chart avec CharObjects.Add est extrêmement sensible à l'ordre des définitions ou à des optimisations via With ... End With. Une fois que vous aurez trouvé votre ordre de définition qui fonctionne, il faudra s'y tenir éventuellement en s'inspirant de l'ordre de définition donné par l'enregistreur de macro.

Il faut également gérer l'effacement du graphique quand on n'en a plus besoin : voir ChartDelete(). Car en phase de développement, la multiplication de création des graphiques pour mise en point risque de faire exploser Excel et si on n'a pas sauvegardé, on perd tout.

Le cycle de vie d'un Chart, au moins pendant le développement, est :
  • Créer le code de gestion des graphiques et sauvegarder le .xls avant d'exécuter.
  • Lancer l'exécution de la création du graphe.
  • Effacer chaque graphe créé y compris en nettoyant ses SeriesCollection
    (sauf si bien sûr le but du classeur est de générer les courbes de façon persistante à sauvegarder avec le .xls).
  • Sortir d'Excel. Cela libère réellement la mémoire prise par tous les graphes.
  • Réouvrir Excel.

___________

Si la discussion est résolue, vous pouvez cliquer sur le bouton

En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert ci-dessous.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h35.


 
 
 
 
Partenaires

Hébergement Web