Macro générant 2 graphiques au fonctionnement aléatoire

capc93

XLDnaute Junior
Bonjour

J'essaie de générer automatiquement 2 graphiques avec les données et la macro du fichier ci joint.
La 1ere fois que je lance la macro ça fonctionne. Mais si je veux la relancer j'ai des erreurs que je n'arrive pas à détecter ni corriger

Code:
ActiveChart.SeriesCollection(2).Name = "=" & nomfeuille & "!" & v_ok 'entetes des données

alors que la même instruction fonctionne quelque lignes plus haut.


Erreur n°1 (qui n'apparait pas tout le temps)

Variable Objet ou bloc variable de bloc with non définie ?!?

Erreur n°2 (quasi systématique à partir du 2è lancement de la macro)

Paramètre non valide.

Je me doute que mon code n'est pas super bien écrit et il y a surement des façon de l'améliorer mais je suis coincée par ce problème que je ne comprends pas parce qu'il est aléatoire et que les espions montrent que c'est la bonne valeur attendue... Surtout que la meme instruction fonctionne un peu avant avec une autre variable.

Je vous remercie par avance de toute l'aide que vous pourrez m'apporter
 

Pièces jointes

  • tests.xlsm
    53.2 KB · Affichages: 37
  • tests.xlsm
    53.2 KB · Affichages: 39

eriiic

XLDnaute Barbatruc
Re : Macro générant 2 graphiques au fonctionnement aléatoire

Bonjour,

Si tu mets un espion sur ActiveChart.SeriesCollection tu peux voir qu'il n'a qu'un seul item.
ActiveChart.SeriesCollection(2) n'existe pas => erreur 1004.

eric
 

eriiic

XLDnaute Barbatruc
Re : Macro générant 2 graphiques au fonctionnement aléatoire

Ben tu fais un graphique avec 2 séries ou tu oublies l'idée de t'adresser à la seconde.
Repartir en te créant le graphique correct en enregistrement de macro te permettra sans doute d'y voir plus clair sur le code nécessaire.
 

capc93

XLDnaute Junior
Re : Macro générant 2 graphiques au fonctionnement aléatoire

Le soucis c'est que le code a pour base l'enregistreur de macro.
Au départ la macro fonctionnait tres bien sur un petit tableau. La ou ça a commencé à ne plus passer c'est quand je suis passée sur une version finale du tableau avec beaucoup de données. D'ou les petits bout de code tout moches ou je recalcule mes variables en fonction de sa longueur. Et c'est la aussi ou j'ai commencé à avoir mes erreurs.
Et je pensais que le fait d'avoir mis une source globale suffisait pour pouvoir apres affiner mes selections. Mais il faut croire que ce n'est pas la logique qu'il faut avoir.... :(
 

capc93

XLDnaute Junior
Re : Macro générant 2 graphiques au fonctionnement aléatoire

J'ai retravaillé mon code

Maintenant ça bugue plus mais ça fait n'importe quoi...

Code:
Sub graph2()

'Elabore les graphiques OK/KO et répartition des anomalies spécifiques de façon automatique

Dim x, y ' compteur de colonne et de ligne
Dim ligne1, col1 ' ligne entete et 1ere colonne du tableau saisies par utilisateur
Dim v_ent(3), v_ok(3), v_ko(3), v_ent2(3) As Variant
Dim v_col_ent2 ' variables pour les données du tableau
Dim i, j 'compteur
Dim MyStr ' variable temporaire pour chaine
Dim nomfeuille ' variable nom de la feuille active
Dim v_num_ano(10) As Variant ' variable anomalie specifique

ligne1 = InputBox("Saisir la ligne des entêtes du tableau", "Saisie", 2)


y = Range("B" & Rows.Count).End(xlUp).Row ' fin des lignes
x = Cells(ligne1, Cells.Columns.Count).End(xlToLeft).Column 'fin des colonnes

nomfeuille = ActiveSheet.Name
i = 1

'on cherche les données des graphiques
While i < x + 1

    If Cells(ligne1, i).Value = "Entité classée" Then 'graph 1
        v_ent(1) = Cells(ligne1, i).Address
    End If

    If Cells(ligne1, i).Value = "% de dossiers KO" Then ' graph 1
        v_ko(1) = Cells(ligne1, i).Address
    End If

    If Cells(ligne1, i).Value = "% de dossiers OK" Then ' graph 1
        v_ok(1) = Cells(ligne1, i).Address
    End If
    
    If Cells(ligne1, i).Value = "Entité" Then ' graph 2
        v_ent2(1) = Cells(ligne1, i).Address
        v_col_ent2 = Cells(ligne1, i).Column
    End If
    
i = i + 1
Wend



'on travaille les variables pour obtenir toutes les valeurs dont on aura besoin
'v_ent
j = Len(v_ent(1))
MyStr = InStr(2, v_ent(1), "$")
i = j - MyStr

v_ent(3) = Left(v_ent(1), MyStr) & y
v_ent(2) = Left(v_ent(1), MyStr) & Right(v_ent(1), i) + 1
        
'v_ko
j = Len(v_ko(1))
MyStr = InStr(2, v_ko(1), "$")
i = j - MyStr

v_ko(3) = Left(v_ko(1), MyStr) & y
v_ko(2) = Left(v_ko(1), MyStr) & Right(v_ko(1), i) + 1

'v_ok
j = Len(v_ok(1))
MyStr = InStr(2, v_ok(1), "$")
i = j - MyStr

v_ok(3) = Left(v_ok(1), MyStr) & y
v_ok(2) = Left(v_ok(1), MyStr) & Right(v_ok(1), i) + 1
        
'v_ent2
j = Len(v_ent2(1))
MyStr = InStr(2, v_ent2(1), "$")
i = j - MyStr

v_ent2(3) = Left(v_ent2(1), MyStr) & y
v_ent2(2) = Left(v_ent2(1), MyStr) & Right(v_ent2(1), i) + 1



ActiveSheet.Shapes.AddChart.Select
ActiveChart.Parent.Name = "Graph1"
ActiveChart.ChartType = xlCylinderBarStacked100
'ActiveChart.SetSourceData Source:=Range("'Feuil1'!$C$2:$E$47")
ActiveChart.SetSourceData Source:=Range(v_ent(1) & ":" & v_ok(3))

' SERIE 1
'ActiveChart.SeriesCollection(1).XValues = "='Feuil1'!$C$2:$C$47"
ActiveChart.SeriesCollection(1).XValues = "=" & nomfeuille & "!" & v_ent(1) & ":" & v_ent(3)

ActiveChart.SeriesCollection.Add _
    Source:=Range(v_ko(1) & ":" & v_ko(3))

ActiveChart.SeriesCollection(1).Name = "=" & nomfeuille & "!" & v_ko(1) 'entete de données
ActiveChart.SeriesCollection(1).Values = "=" & nomfeuille & "!" & v_ko(2) & ":" & v_ko(3) 'données

' SERIE 2
ActiveChart.SeriesCollection.Add _
    Source:=Range(v_ok(1) & ":" & v_ok(3))

ActiveChart.SeriesCollection(2).Name = "=" & nomfeuille & "!" & v_ok(1) 'entetes des données
ActiveChart.SeriesCollection(2).Values = "=" & nomfeuille & "!" & v_ok(2) & ":" & v_ok(3) 'données
End Sub

Maintenant il me mets 4 séries dans le 1er graphique.... Je ne comprends pas, je n'en ai codé que 2...
 

eriiic

XLDnaute Barbatruc
Re : Macro générant 2 graphiques au fonctionnement aléatoire

Moi je vois 214 items dans ActiveChart.SeriesCollection, pas 2...
Modifie petit bout par petit bout et contrôle au fur et à mesure.
Je ne pourrais pas t'aider plus.
eric
 

capc93

XLDnaute Junior
Re : Macro générant 2 graphiques au fonctionnement aléatoire

Le problème c'est que je ne comprends pas ce que je fais et sans vouloir vous offenser vous n'etes pas très explicite non plus.
Je ne sais pas ou on voit 214 items, je ne comprends déja pas comment les séries se créent et l'enregistreur ne m'aide absolument pas.

Ci dessous mon dernier code. Il marche a peu pres sur des données ou il n'y a pas de formules mais plante sur cette ligne sur un fichier ou il y ades formules.
ActiveChart.SeriesCollection(1).XValues = "=" & nomfeuille & "!" & v_ent(2) & ":" & v_ent(3)

Je ne comprends pas les liens de causes à effets... Je suis désolée. J'y ai passé toute la journée et quelque chose m'échappe je ne sais pas quoi et le comportement de la macro n'est pas stable.


Code:
Sub graph2()

'Elabore les graphiques OK/KO et répartition des anomalies spécifiques de façon automatique

Dim x, y ' compteur de colonne et de ligne
Dim ligne1, col1 ' ligne entete et 1ere colonne du tableau saisies par utilisateur
Dim v_ent(3), v_ok(3), v_ko(3), v_ent2(3) As Variant
Dim v_col_ent2 ' variables pour les données du tableau
Dim i, j 'compteur
Dim MyStr ' variable temporaire pour chaine
Dim nomfeuille ' variable nom de la feuille active
Dim v_num_ano(10) As Variant ' variable anomalie specifique
Dim v_deb_ano(10) As Variant
Dim v_fin_ano(10) As Variant
ligne1 = InputBox("Saisir la ligne des entêtes du tableau", "Saisie", 2)


y = Range("B" & Rows.Count).End(xlUp).Row ' fin des lignes
x = Cells(ligne1, Cells.Columns.Count).End(xlToLeft).Column 'fin des colonnes

nomfeuille = ActiveSheet.Name
i = 1

'on cherche les données des graphiques
While i < x + 1

    If Cells(ligne1, i).Value = "Entité classée" Then 'graph 1
        v_ent(1) = Cells(ligne1, i).Address
    End If

    If Cells(ligne1, i).Value = "% de dossiers KO" Then ' graph 1
        v_ko(1) = Cells(ligne1, i).Address
    End If

    If Cells(ligne1, i).Value = "% de dossiers OK" Then ' graph 1
        v_ok(1) = Cells(ligne1, i).Address
    End If
    
    If Cells(ligne1, i).Value = "Entité" Then ' graph 2
        v_ent2(1) = Cells(ligne1, i).Address
        v_col_ent2 = Cells(ligne1, i).Column
    End If
    
i = i + 1
Wend



'on travaille les variables pour obtenir toutes les valeurs dont on aura besoin
'v_ent
j = Len(v_ent(1))
MyStr = InStr(2, v_ent(1), "$")
i = j - MyStr

v_ent(3) = Left(v_ent(1), MyStr) & y
v_ent(2) = Left(v_ent(1), MyStr) & Right(v_ent(1), i) + 1
        
'v_ko
j = Len(v_ko(1))
MyStr = InStr(2, v_ko(1), "$")
i = j - MyStr

v_ko(3) = Left(v_ko(1), MyStr) & y
v_ko(2) = Left(v_ko(1), MyStr) & Right(v_ko(1), i) + 1

'v_ok
j = Len(v_ok(1))
MyStr = InStr(2, v_ok(1), "$")
i = j - MyStr

v_ok(3) = Left(v_ok(1), MyStr) & y
v_ok(2) = Left(v_ok(1), MyStr) & Right(v_ok(1), i) + 1
        
'v_ent2
j = Len(v_ent2(1))
MyStr = InStr(2, v_ent2(1), "$")
i = j - MyStr

v_ent2(3) = Left(v_ent2(1), MyStr) & y
v_ent2(2) = Left(v_ent2(1), MyStr) & Right(v_ent2(1), i) + 1



ActiveSheet.Shapes.AddChart.Select
ActiveChart.Parent.Name = "Graphique1"
ActiveChart.ChartType = xlCylinderBarStacked100
'ActiveChart.SetSourceData Source:=Range("'Feuil1'!$C$2:$E$47")
ActiveChart.SetSourceData Source:=Range(v_ent(1) & ":" & v_ok(3))

' SERIE 1
'ActiveChart.SeriesCollection(1).XValues = "='Feuil1'!$C$2:$C$47"
ActiveChart.SeriesCollection(1).XValues = "=" & nomfeuille & "!" & v_ent(2) & ":" & v_ent(3)

'ActiveChart.SeriesCollection.Add _
    'Source:=Range(v_ko(1) & ":" & v_ko(3))

ActiveChart.SeriesCollection(1).Name = "=" & nomfeuille & "!" & v_ko(1) 'entete de données
ActiveChart.SeriesCollection(1).Values = "=" & nomfeuille & "!" & v_ko(2) & ":" & v_ko(3) 'données

' SERIE 2
ActiveChart.SeriesCollection.Add _
    Source:=Range(v_ok(1) & ":" & v_ok(3))

ActiveChart.SeriesCollection(2).Name = "=" & nomfeuille & "!" & v_ok(1) 'entetes des données
ActiveChart.SeriesCollection(2).Values = "=" & nomfeuille & "!" & v_ok(2) & ":" & v_ok(3) 'données

'Retraitement: couleur, étiquettes et perpective
ActiveChart.SeriesCollection(1).Interior.Color = RGB(255, 0, 0) 'Couleur
ActiveChart.SeriesCollection(1).HasDataLabels = True ' étiquettes de données
ActiveChart.SeriesCollection(2).Interior.Color = RGB(0, 176, 80)
ActiveChart.SeriesCollection(2).HasDataLabels = True
ActiveChart.ChartArea.Format.ThreeD.Perspective = False 'active la case axes à angles droit dans rotation

'Gestion de l'échelle du graph
ActiveSheet.ChartObjects("Graphique1").Select
ActiveChart.Axes(xlValue).Select
  ActiveChart.Axes(xlValue).MinimumScaleIsAuto = False
  ActiveChart.Axes(xlValue).MaximumScaleIsAuto = False
  ActiveChart.Axes(xlValue).MinimumScale = 0
  ActiveChart.Axes(xlValue).MaximumScale = 1

'Emplacement du graphique
ActiveSheet.ChartObjects("Graphique1").Left = Cells(1, x + 2).Left
ActiveSheet.ChartObjects("Graphique1").Top = Cells(1, x + 2).Top


'2è GRAPHIQUE

j = x - v_col_ent2 'nombre d'anomalies spécifiques
Range(v_ent2(1)).Select
i = 1

Do

    ActiveCell.Offset(0, 1).Select 'on décale à la colonne à droite
    v_num_ano(i) = ActiveCell.Address 'on récupère l'adresse
    
    a = Len(v_num_ano(i))
    MyStr = InStr(2, v_num_ano(i), "$")
    b = a - MyStr
    
    v_fin_ano(i) = Left(v_num_ano(i), MyStr) & y
    v_deb_ano(i) = Left(v_num_ano(i), MyStr) & Right(v_num_ano(i), b) + 1
    i = i + 1

Loop Until i = j + 1
i = i - 1

ActiveSheet.Shapes.AddChart.Select
ActiveChart.Parent.Name = "Graphique2"
'ActiveChart.SetSourceData Source:=Range("'Feuil1'!$C$2:$E$47")
ActiveChart.SetSourceData Source:=Range(v_ent2(1) & ":" & v_fin_ano(i))
ActiveChart.ChartType = xlCylinderBarStacked100
ActiveChart.SeriesCollection(1).XValues = "=" & nomfeuille & "!" & v_ent2(2) & ":" & v_ent2(3)

' SERIES (Anomalies spécifiques)

i = 1
Do
ActiveChart.SeriesCollection(i).Name = "=" & nomfeuille & "!" & v_num_ano(i) 'entete de données
ActiveChart.SeriesCollection(i).Values = "=" & nomfeuille & "!" & v_deb_ano(i) & ":" & v_fin_ano(i) 'données
ActiveChart.SeriesCollection(i).HasDataLabels = True
i = i + 1
Loop Until i = j + 1

ActiveChart.ChartArea.Format.ThreeD.Perspective = False

'Gestion de l'échelle du graph
ActiveSheet.ChartObjects("Graphique2").Select
ActiveChart.Axes(xlValue).Select
  ActiveChart.Axes(xlValue).MinimumScaleIsAuto = False
  ActiveChart.Axes(xlValue).MaximumScaleIsAuto = False
  ActiveChart.Axes(xlValue).MinimumScale = 0
  ActiveChart.Axes(xlValue).MaximumScale = 1

'Emplacement du graphique
ActiveSheet.ChartObjects("Graphique2").Left = Cells(1, x + 10).Left
ActiveSheet.ChartObjects("Graphique2").Top = Cells(1, x + 10).Top

Cells(ligne1, x + 10).Select

End Sub
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Re : Macro générant 2 graphiques au fonctionnement aléatoire

Si toi tu ne comprends pas ce que tu fais, imagine toi que moi non plus et à plus forte raison.
Je ne sais pas ou on voit 214 items
Si tu avais été un peu curieux tu aurais posé la question dès mon 1er post où je te parlais d'espion.
Je te laisse chercher et trouver ce que c'est sur google, maintenant c'est un peu tard.
eric
 

capc93

XLDnaute Junior
Re : Macro générant 2 graphiques au fonctionnement aléatoire

Les espions ça j'ai compris....
Sauf qu'à moins de me préciser ou il y a 214 items chez vous je ne sais pas... chez moi y'en a jamais eu plus de 4.
Maintenant j'en ai 2 ou 3 de façon aléatoire sans que je comprenne pourquoi.

image avec 3 series: ce que la macro renvoie (de façon aléatoire)
image avec 2 séries: ce que je veux que la macro renvoie à tous les coups
 

Pièces jointes

  • 2015-09-03_06h27_25.png
    2015-09-03_06h27_25.png
    45.9 KB · Affichages: 25
  • 2015-09-03_06h30_07.png
    2015-09-03_06h30_07.png
    42.2 KB · Affichages: 23
Dernière édition:

eriiic

XLDnaute Barbatruc
Re : Macro générant 2 graphiques au fonctionnement aléatoire

Bonjour,

Exemple de fenêtre espion :
2015-09-03_07-12-22.jpg
Tu vois ici que tu as un seul item pour ActiveChart.SeriesCollection, la ligne tombe en erreur puisque tu t'adresses au (2).
Ca répond à ta question "Pourquoi l'erreur de paramètre ?"

Je ne sais pas ce que tu veux faire, tu ne l'as jamais dit. Là tu essaies de modifier la 2nde étiquette mais tu n'en as qu'une.
A mon avis soit ce n'est pas cette méthode que tu dois modifier parce que c'est autre chose que tu veux faire, soit tu n'as pas mis le bon nombre de courbes auparavant. .
Dans le dernier exemple tu avais 214 items et tu disais en n'avoir que 4.

Je ne pourrais pas t'aider plus, les graphiques ne sont pas ma tasse de thé.
Comme tu as l'air d'y aller totalement au hasard tu devrais déposer une nouvelle question où tu expliques ce que tu voudrais faire, mais essaie déjà d'avoir le bon graphique de départ, là tu changes tout le temps...
Cherche aussi un peu des tutos sur google pour y voir plus clair sur ce que tu modifies.
eric
 
Dernière édition:

Discussions similaires

Réponses
8
Affichages
287
Réponses
3
Affichages
303

Statistiques des forums

Discussions
312 339
Messages
2 087 407
Membres
103 539
dernier inscrit
RAPH2012