Graphique
Bonjour,
J'ai voulu faire un graphique en macro à partir de donnée d'un tableau.
J'ai donc fait une nouvelle macro pour générer le code automatiquement d'une partie du tableau (pour tester). Je met le tout dans un bouton et la ca marche niquel, le graphe s'ouvre.
En revanche je n'arrive pas à le modifier pour éviter de rentrer toutes les valeurs..
Sub graphe()
Charts.Add
ActiveChart.ChartType = xlLine
ActiveChart.SetSourceData Source:=Sheets("Results").Range("A19")
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(1).XValues = "=(Results!R1C3,Results!R1C6)"
ActiveChart.SeriesCollection(1).Values = "=(Results!R4C3,Results!R4C6)"
ActiveChart.SeriesCollection(1).Name = "=Results!R2C3"
ActiveChart.SeriesCollection(2).XValues = "=(Results!R1C3,Results!R1C6)"
ActiveChart.SeriesCollection(2).Values = "=(Results!R4C4,Results!R4C7)"
ActiveChart.SeriesCollection(2).Name = "=Results!R2C4"
ActiveChart.SeriesCollection(3).XValues = "=(Results!R1C3,Results!R1C6)"
ActiveChart.SeriesCollection(3).Values = "=(Results!R4C5,Results!R4C8)"
ActiveChart.SeriesCollection(3).Name = "=Results!R2C5"
ActiveChart.Location Where:=xlLocationAsObject, Name:="Results"
End SubJe ne connais pas la syntaxe pour sélectionner au lieu de deux colonnes comme :
ActiveChart.SeriesCollection(1).XValues = "=(Results!R1C3,Results!R1C6)"
Je voudrais en fait selectionner à partir de R1C3 et les autres avec un pas de 3
C'est à dire R1C3, R1C6, R1C9 etc...
Et cela pareil pour les autres "ActiveChart.SeriesCollection" .Xvalues et .values
Si quelqu'un peu m'aider ....
Merci le forum et ceux qui y participe
Cdt
juju
T'aider serait plus facile en connaissant la présentation de ta base de données
Voila le tableau
Axe des abscisse :les mois
3 courbes : -Somme ano
- Somme ano réso
- Somme ano aban
https://www.excel-pratique.com/~files/doc/Nouveau_Feuille_de_calcul_Microsoft_Excel_2_.xls
Bonjour,
je suis en train de chercher peut etre pour rien...(ca fait du bien parfois je sais) mais personne peut me dire si cela est possible ou s'il faut procéder autrement.
Merci d'avance
Je suis en train de tester une solution directe... mais je rame.
Le plus simple serait peut-être de recopier les valeurs sur une autre feuille, avec une présentation différente (par macro bien sûr) :
toutes les sommes ano sur la même colonne
toutes les sommes ano résolues sur une autre colonne
toutes les sommes ano abandonnées sur une autre colonne
Tu peux t'essayer à ça en attendant...
Ok je vais essayer ca mais ca me parait vraiment bizarre qu'on ne puisse pas selectionner une plage de valeur en rajoutant un step..pour un graphique
Si tu trouve une autre macro et que cela marche je suis prenneur aussi!!
Cdt
juju
Bon je crois que je tiens une piste...
Au fait d'après ta première macro tu veux tracer que pour 2007_Pack_Mob_02 ?
Bonsoir Julien
Bonsoir, Sylvain
Avec ce code, tu crées les 3 graphiques ("2007_PACK_MOB_04", "2007_PACK_MOB_02" , "2008_PACK_MOB_02")
Seulement, les trois graphiques se chevauchent, il te suffit de les déplacer à la main, pour les voir
Sub graphe()
Dim DerCol As Integer
For Each ChO In ActiveSheet.ChartObjects
ChO.Delete
Next ChO
DerCol = [IV3].End(xlToLeft).Column
On Error Resume Next
[C3:E5].SpecialCells(xlCellTypeBlanks).Value = 0 'pour avoir une valeur de départ
On Error GoTo 0
For j = 1 To 3
Charts.Add
ActiveChart.ChartType = xlLine
ActiveChart.SetSourceData Source:=Sheets("Results").Range("A19")
For i = 1 To 3
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(i).XValues = "=(Results!R1C" & 2 + i & ",Results!R1C" & DerCol - 3 + i & ")"
ActiveChart.SeriesCollection(i).Values = "=(Results!R" & j + 2 & "C" & 2 + i & ",Results!R" & j + 2 & "C" & DerCol - 3 + i & ")"
ActiveChart.SeriesCollection(i).Name = "=Results!R2C" & 2 + i
Next i
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = Sheets("Results").Cells(j + 2, 2).Value
.Location Where:=xlLocationAsObject, Name:="Results"
End With
Next j
End SubBonsoir tous,
Bon, ben toutes mes recherches pour m'apercevoir au final que je me suis fait avoir...
Je partais du principe de nommer les différentes plages (abscisses, séries 1, 2 et 3) dans la feuille Excel, pour pouvoir ensuite insérer les noms pendant la création du graphique.
Oui mais voilà il s'avère que Insertion/Nom/Coller ne marche pas avec cette méthode de construction de graphique...
Du coup j'ai changé mon fusil d'épaule, et j'ai fait comme j'avais conseillé à Juju (en partant de là où j'étais arrivé quand même).
Ca donne une macro un peu bizarre, mais qui te tracera tes courbes comme tu voulais.
Tu peux bien sûr ajouter de nouvelles dates et valeurs.
https://www.excel-pratique.com/~files/doc/Plage_discontinue.xls
Sub graphique()
Sheets("Results").[A1].Select
'définition des variables
Dim max As Integer
max = [C2].End(xlToRight).Column
Dim pac, cel, plagano, plaganoreso, plaganoaba, plagemois As Range
Set pac = Range("C4", Cells(4, max))
Dim ano, anoreso, anoaba, mois, c As String
'définition des chaînes de caractères
ano = ""
anoreso = ""
anoaba = ""
mois = ""
For Each cel In pac
If cel.Offset(-2, 0) = "Somme Anos" Then
c = Split(cel.Address, "$")(1)
ano = ano & c & "4,"
mois = mois & c & "1,"
Else
If cel.Offset(-2, 0) = "Somme Anos résolues" Then
c = Split(cel.Address, "$")(1)
anoreso = anoreso & c & "4,"
Else
If cel.Offset(-2, 0) = "Somme Anos abandonnées" Then
c = Split(cel.Address, "$")(1)
anoaba = anoaba & c & "4,"
End If
End If
End If
Next cel
ano = Left(ano, Len(ano) - 1)
anoreso = Left(anoreso, Len(anoreso) - 1)
anoaba = Left(anoaba, Len(anoaba) - 1)
mois = Left(mois, Len(mois) - 1)
'définition des plages
Set plagano = Range(ano)
Set plaganoreso = Range(anoreso)
Set plaganoaba = Range(anoaba)
Set plagemois = Range(mois)
'créationdes plages dans les classeur (non utilisé finalement)
'ActiveWorkbook.Names.Add Name:="plagano", RefersTo:=plagano
'ActiveWorkbook.Names.Add Name:="plaganoreso", RefersTo:=plaganoreso
'ActiveWorkbook.Names.Add Name:="plaganoaba", RefersTo:=plaganoaba
'ActiveWorkbook.Names.Add Name:="plagemois", RefersTo:=plagemois
'copie des plages sur feuille Recap
Sheets("Recap").UsedRange.Clear
plagemois.Copy Destination:=Sheets("Recap").[b1]
plagano.Copy Destination:=Sheets("Recap").[b2]
plaganoreso.Copy Destination:=Sheets("Recap").[b3]
plaganoaba.Copy Destination:=Sheets("Recap").[b4]
With Sheets("Recap")
.[A2] = "Somme ano"
.[a3] = "Somme ano résolues"
.[a4] = "Somme ano abandonnées"
End With
'tracé des courbes
For Each ChO In ActiveSheet.ChartObjects
ChO.Delete
Next ChO
Charts.Add
ActiveChart.ChartType = xlLineMarkers
ActiveChart.SetSourceData Source:=Sheets("Recap").[A2].CurrentRegion, PlotBy:= _
xlRows
ActiveChart.Location Where:=xlLocationAsObject, Name:="Results"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Résultats"
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
End With
End SubBonjour et déja merci d'avoir trouvé ces deux solutions..
En gros :
-sylvain ta solution me plait beaucoup car elle marche ak mon classeur, le seul problème est qu'il faudrait voir les mois au lieu des années en bas du graphique..Mais je ne veux pas t'en demander trop non plus..
- Felix, je comprends déja moins ton code, mais dès que je cole ton code (dans un bouton) dans mon classeur et que je rajoute une feuill "Recap" ca bloque..
- ---------->plagemois.Copy Destination:=Sheets("Recap").[b1]
je te passe le fichier que j'utilise :
https://www.excel-pratique.com/~files/doc/essai_jstefani_v2.rar
Mais merci et encore merci
juju
Petite inversion au niveau des prénoms... La solution de Félix te met les années, la mienne coince.
Je voulais pourtant te le préciser, j'ai oublié. Alors voilà pour pouvoir coller les cellules dates dans la feuille Recap, je les avais dé-fusionnées. C'est ça qui bloque avec ton classeur.
Dé-fusionne tous tes groupes de 3 cellules, et à la place tu fais Format/Cellule/Alignement ; horizontal : centré sur plusieurs colonnes.
Il n'y a qu'un seul graphe qui se crée effectivement, en l'absence de réponse à ma question
Sylvain a écrit :tu veux tracer que pour 2007_Pack_Mob_02 ?
On peut modifier la procédure pour faire les 3 si tu veux
Salut,
excuse moi si je t'ai mal compris.
Le plus simple est d'ajouter les mois avec le code le plus court mais je suis confu car tu as tappé tout ce code pour moi et au final j'utilise celui d'un autre..
Pour les cellule fusionnées ,j'aurais pas trouvé donc merci
Cdt
julien
jstefani a écrit :Le plus simple est d'ajouter les mois avec le code le plus court
Le plus simple pour qui ?
Moi en tous cas je ne suis pas encore arrivé à modifier le code de Félix...
Pour le reste pas de soucis.
Personnellement pour moi ce forum est aussi un moyen de progresser en essayant de résoudre des problèmes concrets, vu que je manque cruellement d'imagination pour m'imposer des exercices...
Donc quand une question m'intéresse je m'y attaque, je regarde attentivement les solutions des autres, je les compare aux miennes, et j'essaye de tirer mes conclusions pour l'avenir...
Il me semble qu'à ce jeu là tout le monde y trouve son compte.
On ne remerciera jamais assez Sébastien et les principaux acteurs du forum, mais aussi tous ceux qui amènent de l'eau au moulin avec leurs nouvelles questions.
Re,
Après recherche je ne vois toujours pas comment modifier le code de félix, qui en fait ne prend en compte pour chaque "Expr1012", et pour chaque "Somme ano", que la première et la dernière valeur.
C'est pourquoi je m'étais vite écarté de cette solution.
La mienne adaptée pour tracer 3 graphiques :
https://www.excel-pratique.com/~files/doc/Plage_discontinue_2.xls
Je n'arrive pas non plus à placer les graphiques sur la feuille, donc ils s'empilent les trois l'un sur l'autre.
"Quand on cherche, on trouve" 8)
Je savais qu'après une bonne bière dans un pub j'aurais les idées plus claires...
Je me suis rendu compte que (par macro) le graphique attendait absolument comme cellules de séries, une déclaration sous la forme = "=(Results!R4C3,...)"
Alors que je m'étais entêté à vouloir lui fare avaler du =(C4;F4;...):oops:
Donc en modifiant mes chaînes de caractères ça marche, sans passer par des plages nommées, ni une feuille intermédiaire.
Ensuite un petit coup de pouce du frangin pour savoir comment déclarer une variable multiple ( je sais pas si ça a un nom précis, un truc du style tableau de variable je crois...)
ça c'est le "Dim pac(0 To 2) As Range". Ensuite For i = 0 to 2 ; Pac(i)=....
Plutôt pratique non ? Merci frérot !
Du coup ça me donne une macro plutôt légère et fonctionnelle :
Sub graphique()
Application.ScreenUpdating = False
For Each ChO In ActiveSheet.ChartObjects
ChO.Delete
Next ChO
Dim pac(0 To 2) As Range
Dim max As Integer
max = Range("C2").End(xlToRight).Column
Dim ano(0 To 2) As String, anoreso(0 To 2) As String, anoaba(0 To 2) As String, mois As String, c As String
For i = 0 To 2 ' i=0 pour 2007_Pack_Mob_04 ; i=1 pour 2007_Pack_Mob_02 ; i=2 pour 2008_Pack_Mob_02
'création des chaînes de caractères
Sheets("Results").Range("A1").Select
Set pac(i) = Range(Cells(3 + i, 3), Cells(3 + i, max))
mois = ""
For Each cel In pac(i)
If cel.Offset(-i - 1, 0) = "Somme Anos" Then
ano(i) = ano(i) & "Results!R" & cel.Row & "C" & cel.Column & ","
mois = mois & "Results!R1" & "C" & cel.Column & ","
ElseIf cel.Offset(-i - 1, 0) = "Somme Anos résolues" Then
anoreso(i) = anoreso(i) & "Results!R" & cel.Row & "C" & cel.Column & ","
ElseIf cel.Offset(-i - 1, 0) = "Somme Anos abandonnées" Then
anoaba(i) = anoaba(i) & "Results!R" & cel.Row & "C" & cel.Column & ","
End If
Next cel
ano(i) = (Left(ano(i), Len(ano(i)) - 1))
anoreso(i) = Left(anoreso(i), Len(anoreso(i)) - 1)
anoaba(i) = Left(anoaba(i), Len(anoaba(i)) - 1)
mois = Left(mois, Len(mois) - 1)
'création des 3 graphiques
Charts.Add
With ActiveChart
.ChartType = xlLineMarkers
.SetSourceData Source:=Sheets("Results").Range("B8")
.SeriesCollection.NewSeries
.SeriesCollection.NewSeries
.SeriesCollection.NewSeries
.SeriesCollection(1).XValues = "=(" & mois & ")"
.SeriesCollection(1).Values = "=(" & ano(i) & ")"
.SeriesCollection(1).Name = "=Results!R2C3"
.SeriesCollection(2).Values = "=(" & anoreso(i) & ")"
.SeriesCollection(2).Name = "=Results!R2C4"
.SeriesCollection(3).Values = "=(" & anoaba(i) & ")"
.SeriesCollection(3).Name = "=Results!R2C5"
.Location Where:=xlLocationAsObject, Name:="Results"
End With
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = Range("B" & 3 + i)
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
End With
Next
End Sub(Au passage du coup ça remarche avec tes cellules fusionnées Juju...)
Maintenant il y a encore 3 trucs que je ne comprends pas :
- Pourquoi je suis obligé d'ajouter un End With, suivi d'un With ActiveChart en plein milieu de la création de mes graphiques ?
- Comment positionner les graphiques ?
- Comment déclarer une plage de cellules non adjacentes, sans passer par une chaîne de caractères ? ça m'étonnerait quand même que ça ne soit pas possible, mais pour l'instant j'ai toujours pas trouvé...
Allez bonne nuit le forum ! Et bon week-end !