Graphique en boucle sur différents onglets
Bonjour à toutes et à tous,
Je suis débutant dans les macros excel et je recherche un code permettant de générer un graphique pour chaque ligne d'un tableau. Les graphiques seraient générés sur des onglets différents afin de pouvoir les éditer indépendamment.
En espérant avoir été clair.
merci d'avance à ceux qui disposent déja de ce codes ou aux pros capables de l'écrire.
bonjour,
voici un proposition de macro
Sub generegraphe()
' à adapter remplacer sheet1 par le nom de la feuille contenant les données pour les graphes
Set ws1 = Sheets("sheet1")
' à adapter
premierecolonne = "A"
dernierecolonne = "F"
' première ligne contenant des données
ligne = 1
' on lance une boucle sur les lignes de données
While ws1.Cells(ligne, 1) <> ""
' on ajoute un feuille
Sheets.Add After:=Sheets(Sheets.Count)
Set ns = Sheets(Sheets.Count)
' on la nomme en fonction du numéro de ligne des données
ns.Name = "graphe " & ligne
' on y insère un graphe
ns.Shapes.AddChart.Select
' on précise la source des données
ActiveChart.SetSourceData Source:=Range("'" & ws1.Name & "'!" & premierecolonne & ligne & ":" & dernierecolonne & ligne)
' on précise le type de graphe
ActiveChart.ChartType = xlColumnClustered
'on passe à la ligne de données suivante
ligne = ligne + 1
Wend
Set ws1 = Nothing
Set ns = Nothing
End SubMerci H2SO4 pour ta réponse très rapide et qui fonctionne parfaitement.
C'est ce que j'attendais
Je te remercie tu me retires une épine du pied.
Bonne continuation
Rebonjour,
j'ai une demande de modification sur le code généreusement transmis par H2SO4.
je souhaiterai que les graphiques ne soient pas générés en tant qu'objet sur une feuille mais plutot dans une feuille ou il n'y a que le graphique (fonction déplacer le graphique sous excel).
Est ce possible?
Merci d'avance
voici le code adapté.
Sub generegraphe()
' à adapter remplacer sheet1 par le nom de la feuille contenant les données pour les graphes
Set ws1 = Sheets("sheet1")
' à adapter
premierecolonne = "A"
dernierecolonne = "F"
Application.DisplayAlerts = False
' première ligne contenant des données
ligne = 1
' on lance une boucle sur les lignes de données
While ws1.Cells(ligne, 1) <> ""
' on ajoute un feuille
' on ajoute un feuille
Sheets.Add After:=Sheets(Sheets.Count)
Set ns = Sheets(Sheets.Count)
' on la nomme en fonction du numéro de ligne des données
' on y insère un graphe
ns.Shapes.AddChart.Select
' on précise la source des données
ActiveChart.SetSourceData Source:=Range("'" & ws1.Name & "'!" & premierecolonne & ligne & ":" & dernierecolonne & ligne)
' on précise le type de graphe
ActiveChart.ChartType = xlColumnClustered
' on copie le graphe dans une nouvelle feuille
ActiveChart.Location Where:=xlLocationAsNewSheet
ActiveChart.Name = "Graphique " & ligne
ns.Delete
'on passe à la ligne de données suivante
ligne = ligne + 1
Wend
Set ws1 = Nothing
Set ns = Nothing
End SubMille mercis H2SO4, ça marche très bien.
Encore une fois, tu as été très réactif.
A+
Bonjour les amis,
J'ai une nouvelle demande concernant ce graphique.
1ere question
Ma plage de données se situe entre les cellules C2 et M20
Le titre de mes données entre C1 et M1
Mes séries sont situées entre B2 et B20
Je voudrais adapter ce code pour faire apparaitre les étiquettes de chaque colonne sur ce graphique.
Je pense qu'il faut ajouter une ligne au niveau de la précision du type de graphique mais je ne sais pas l'écrire.
2eme question
Concernant le premier code, comment je peux indiquer la position du graphique sur une ou plusieurs cellules et en adapter le format (par exemple que le coin gauche en haut du graphique se situe sur la cellule C10)
Je vous remercie par avance
A+
Bonjour,
si j'ai bien compris ta première demande, voici la macro adaptée. données en B1 à M20, avec 19 séries et label en colonne B et ligne 1
pour la deuxième, comme tu as explicitement demandé d'avoir des graphes sur des feuilles séparées de type chart, il n'y a pas de cellule, donc je ne comprends pas ce que tu veux.
Sub generegraphe()
' à adapter remplacer sheet1 par le nom de la feuille contenant les données pour les graphes
Set ws1 = Sheets("sheet1")
' à adapter
premierecolonne = "B"
dernierecolonne = "M"
Application.DisplayAlerts = False
' première ligne contenant des données
ligne = 2
' on lance une boucle sur les lignes de données
While ws1.Cells(ligne, 1) <> ""
' on ajoute un feuille
' on ajoute un feuille
Sheets.Add After:=Sheets(Sheets.Count)
Set ns = Sheets(Sheets.Count)
' on la nomme en fonction du numéro de ligne des données
' on y insère un graphe
ns.Shapes.AddChart.Select
' on précise la source des données
rg = "'" & ws1.Name & "'!" & premierecolonne & "1:" & dernierecolonne & "1,'" & ws1.Name & "'!" & premierecolonne & ligne & ":" & dernierecolonne & ligne
ActiveChart.SetSourceData Source:=Range(rg)
' on précise le type de graphe
ActiveChart.ChartType = xlColumnClustered
' on copie le graphe dans une nouvelle feuille
ActiveChart.Location Where:=xlLocationAsNewSheet
ActiveChart.Name = "Graphique " & ligne
ns.Delete
'on passe à la ligne de données suivante
ligne = ligne + 1
Wend
Set ws1 = Nothing
Set ns = Nothing
End SubMerci h2so4,
le code que tu m'as envoyé fonctionne très bien, je dirai comme d'habitude. C'est ce qe j'attendais.
Ma deuxième demande correspond à une nouvelle attente, je veux placer un graphique dans une fiche qui fonctionne en boucle également.
Je dispose actuellement d'un code qui me permet de générer cette fiche et je voudrais intégrer ton premier code dedans pour placer un graphique à un endroit particulier (par exemple sur une cellule) et pouvoir adapter sa taille
Je te transmets le code si tu veux, c'est le suivant :
Sub test_Click()
Dim i As Integer
Dim e As Integer
Dim nb As Integer
i = 1 'compteur de ligne
e = 2 '
nb = WorksheetFunction.CountIf(Range("A1:A180"), "*")
nb = nb - 1
MsgBox "Nombre de feuilles a générer " & nb, vbOKOnly + vbInformation, "Feuilles a générer"
Dim nomfeuille As String
nomfeuille = ""
While i < nb + 1
Sheets.Add After:=Sheets(Worksheets.Count)
ActiveSheet.Name = Sheets(1).Range(("A") & e).Text
nomfeuille = Sheets(1).Range(("A") & e).Text
'Ajustement des marges pour l'impresssion
With ActiveSheet.PageSetup
.LeftMargin = Application.InchesToPoints(0.590551181102362)
.RightMargin = Application.InchesToPoints(0.590551181102362)
.TopMargin = Application.InchesToPoints(0.393700787401575)
.BottomMargin = Application.InchesToPoints(0.393700787401575)
.HeaderMargin = Application.InchesToPoints(0.511811023622047)
.FooterMargin = Application.InchesToPoints(0.511811023622047)
.PrintArea = "$A$1:$H$33"
End With
Sheets("fiche descriptive").Select
Cells.Select
Selection.Copy
Sheets(nomfeuille).Select
Cells.Select
ActiveSheet.Paste
ActiveSheet.Range("D1") = nomfeuille
'Fin de la procédure, on passe a la feuille suivante
i = i + 1
e = e + 1
Wend
e = e - 2
MsgBox "Nombre de feuilles générées : " & e, vbOKOnly + vbInformation, "Fin de la Génération"
End Sub
Peux tu me l'intégrer dans mon code?
Merci d'avance
Encore merci pour ce que tu fais H2SO4
A+
Merci h2so4,
le code que tu m'as envoyé fonctionne très bien, je dirai comme d'habitude. C'est ce qe j'attendais.
Ma deuxième demande correspond à une nouvelle attente, je veux placer un graphique dans une fiche qui fonctionne en boucle également.
Je dispose actuellement d'un code qui me permet de générer cette fiche et je voudrais intégrer ton premier code dedans pour placer un graphique à un endroit particulier (par exemple sur une cellule) et pouvoir adapter sa taille
Je te transmets le code si tu veux, c'est le suivant :
Sub test_Click()
Dim i As Integer
Dim e As Integer
Dim nb As Integer
i = 1 'compteur de ligne
e = 2 '
nb = WorksheetFunction.CountIf(Range("A1:A180"), "*")
nb = nb - 1
MsgBox "Nombre de feuilles a générer " & nb, vbOKOnly + vbInformation, "Feuilles a générer"
Dim nomfeuille As String
nomfeuille = ""
While i < nb + 1
Sheets.Add After:=Sheets(Worksheets.Count)
ActiveSheet.Name = Sheets(1).Range(("A") & e).Text
nomfeuille = Sheets(1).Range(("A") & e).Text
'Ajustement des marges pour l'impresssion
With ActiveSheet.PageSetup
.LeftMargin = Application.InchesToPoints(0.590551181102362)
.RightMargin = Application.InchesToPoints(0.590551181102362)
.TopMargin = Application.InchesToPoints(0.393700787401575)
.BottomMargin = Application.InchesToPoints(0.393700787401575)
.HeaderMargin = Application.InchesToPoints(0.511811023622047)
.FooterMargin = Application.InchesToPoints(0.511811023622047)
.PrintArea = "$A$1:$H$33"
End With
Sheets("fiche descriptive").Select
Cells.Select
Selection.Copy
Sheets(nomfeuille).Select
Cells.Select
ActiveSheet.Paste
ActiveSheet.Range("D1") = nomfeuille
'Fin de la procédure, on passe a la feuille suivante
i = i + 1
e = e + 1
Wend
e = e - 2
MsgBox "Nombre de feuilles générées : " & e, vbOKOnly + vbInformation, "Fin de la Génération"
End Sub
Peux tu me l'intégrer dans mon code?
Merci d'avance
Encore merci pour ce que tu fais H2SO4
A+
Bonjour,
peux-tu me mettre un fichier avec les données de base et le résultat souhaité après exécution de la macro. Je n'ai pas compris ce que tu voulais comme intégration des 2 macros.