Boucle For ou For Each ?
Bonjour tout le monde,
J'ai actuellement un fichier qui me permet de créer des popularités de ventes de nourriture, mais il me manque une petite fonctionnalité pour qu'il soit terminé.
Mon fichier est joint.
1) Actuellement, il permet suite à une extraction d'effectuer plusieurs calculs différents, le pourcentage de ventes, le calcul des marges Unitaires etc...
2) Grâce à une macro, ces données sont récupérés et copier un peu plus bas pour être utilisable pour une autre fonction.
3) Par la suite, j'ai dans une autre macro, un code qui me permet de récupérer les données de l'étape précédente et de les inclure dans un nuage de point automatique.
4) Et pour finir, une autre macro me permet de récupérer les noms de points et de les associer à certains éléments.
Dans mon fichier il y a plusieurs feuilles, Entrées, Plats, Makis, Sushis, Desserts
Ensuite, j'ai choisi de créer une feuille avec un graphique qui me récapitule sous forme de nuage de points mes ventes.
Il y a donc autant de feuille avec un graphique que de feuilles du type "Entrées", "Plats" etc...
Mais j'ai un soucis au niveau de l'étape 3), en faite, je souhaiterai que ma macro, récupère automatiquement les données de la feuille Entrées et remplisse la feuille avec le graphique des entrées et ainsi de suite.
Actuellement, ça fonctionne plus ou moins, ma macro fait une boucle, mais ne récupère que seulement les données de la feuille "Entrées", alors qu'il faudrait qu'il récupère les données de la feuille "Entrées" pour remplir la feuille avec le graphique des entrées et qu'ensuite il récupère les données de la feuille "Plats" et remplissent la feuille avec le graphique Plats et ainsi de suite.
Je vous ai déjà posé la question, mais personne ne répond, là j'ai essayé d'être le plus clair possible.
J'attends votre retour, je fais pas ce travail pour le plaisir, j'en ai besoin malheureusement.
Je vous remercie par avance.
Cordialement,
Bonjour,
Mon fichier est joint.
Malheureusement non.
Et donc, comme bien souvent, pas de code + pas de fichier = pas de réponse.
Ca a du bug, bref il y est maintenant
Bon.
Je n'ai rien compris à ton code, mais là n'est pas la question.
Voici donc comment je ferais pour récupérer les données dans chaque feuille et les restituer dans les bonnes :
Sub test()
Dim Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets(Array("Feuil1", "Feuil2", "Feuil3"))
'Ici tu places ton code de récolte des données
With Sheets("Graph_" & Ws.Name)
'Ici tu places ton code de création de tes graphs
'ou de restitution des données...
End With
Next Ws
End SubTu n'as pas compris qu'elle partie dans mon code ?
Du coup, merci pour ton code, mais la ligne
With Sheets("Graph_" & Ws.Name)
'Ici tu places ton code de création de tes graphs
'ou de restitution des données...
End WithJ'ai un soucis pour mes feuilles contenant mes graphiques non ?
Il faut pas rajouter une ligne avant le With Sheets("Graph_" & Ws.Name) ?
Parce qu'un code comme celui-ci va seulement intégrer mes données dans la Feuille ayant le premier graphique non ?
Non.
Je reprends mon exemple avec tes noms de feuilles :
Sub test()
Dim Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets(Array("Entrées", "Plats", "Makis", "Sushis", "Desserts"))
'Ici tu places ton code de récolte des données
Debug.Print Ws.Name & " deviendra en ajoutant Graph_ : " & "Graph_" & Ws.Name
With Sheets("Graph_" & Ws.Name)
'Ici tu places ton code de création de tes graphs
'ou de restitution des données...
End With
Next Ws
End SubBon, merci beaucoup, j'ai bouclé la boucle
Tout est nickel.
Bonne fin de journée.
Cordialement,
Re-bonjour,
En faite non, c'est pas nickel, j'ai une boucle qui ne récupère pas les étiquettes de mes différentes feuilles
J'ai tenté ceci pour appliquer les étiquettes à l'ensemble de mes graphiques, mais ma macro applique les mêmes étiquettes à tous mes graphiques
Dim flws As Worksheet
'For Each pour intégrer l'ensemble des données récupérées, dans les graphiques'
For Each fletiquette In ThisWorkbook.Worksheets(Array("Graph_Entrees", "Graph_Plats"))
If fletiquette.Name <> "Micros" And fletiquette.Name <> "Carte Restaurant" And fletiquette.Name <> "Index" And fletiquette.Name <> "Entrees" And fletiquette.Name <> "Plats" Then 'attention aux noms de feuilles avec accent
fletiquette.Activate
'on prend le premier graphique de la feuille
With fletiquette.ChartObjects(1).Chart.SeriesCollection(3)
'on comptabilise le nombre de points de ce graphique
For i = 1 To .Points.Count
For Each flws In ThisWorkbook.Worksheets(Array("Entrees", "Plats"))
flws.Activate
'on lui affecte des étiquettes
.Points(i).ApplyDataLabels
'on selectionne l'étiquette que l'on souhaite, ici on commence en E5 et ensuite on boucle sur I
.Points(i).DataLabel.Text = flws.[E25].Offset(i - 1)
Next flws
Next i
End With
End If
Next fletiquetteUne idée ?
Bonjour,
Franchement, je ne sais pas quoi faire pour t'aider...
Sans le classeur cela va vraiment être compliqué.
Bon.
Le problème se trouve ici :
Dim flws As Worksheet
'For Each pour intégrer l'ensemble des données récupérées, dans les graphiques'
For Each fletiquette In ThisWorkbook.Worksheets(Array("Graph_Entrees", "Graph_Plats"))
If fletiquette.Name <> "Micros" And fletiquette.Name <> "Carte Restaurant" And fletiquette.Name <> "Index" And fletiquette.Name <> "Entrees" And fletiquette.Name <> "Plats" Then 'attention aux noms de feuilles avec accent
fletiquette.Activate
'on prend le premier graphique de la feuille
With fletiquette.ChartObjects(1).Chart.SeriesCollection(3)
'on comptabilise le nombre de points de ce graphique
For i = 1 To .Points.Count
'ICI TU BOUCLES SUR TOUTES LES FEUILLES AU LIEU D'EXPLOITER LES DONNEES DE LA FEUILLE CONCERNEE
'IL TE FAUT CIBLER LA FEUILLE CORRESPONDANTE A TA FEUILLE GRAPH "En COURS"
For Each flws In ThisWorkbook.Worksheets(Array("Entrees", "Plats"))
'on lui affecte des étiquettes
.Points(i).ApplyDataLabels
'on selectionne l'étiquette que l'on souhaite, ici on commence en E5 et ensuite on boucle sur I
.Points(i).DataLabel.Text = flws.[E25].Offset(i - 1)
Next flws
Next i
End With
End If
Next fletiquetteà remplacer par quelque chose comme :
Dim flws As Worksheet, NomFeuille As String
'For Each pour intégrer l'ensemble des données récupérées, dans les graphiques'
For Each fletiquette In ThisWorkbook.Worksheets(Array("Graph_Entrees", "Graph_Plats"))
If fletiquette.Name <> "Micros" And fletiquette.Name <> "Carte Restaurant" And fletiquette.Name <> "Index" And fletiquette.Name <> "Entrees" And fletiquette.Name <> "Plats" Then 'attention aux noms de feuilles avec accent
fletiquette.Activate
'ON CIBLE LA FEUILLE CORRESPONDANTE A NOTRE FEUILLE GRAPH
NomFeuille = Right(fletiquette.Name, Len(fletiquette.Name) - 6)
Set flws = ThisWorkbook.Worksheets(NomFeuille)
'on prend le premier graphique de la feuille
With fletiquette.ChartObjects(1).Chart.SeriesCollection(3)
'on comptabilise le nombre de points de ce graphique
For i = 1 To .Points.Count
'PLUS DE BOUCLE, LA FEUILLE EST CIBLEE
'For Each flws In ThisWorkbook.Worksheets(Array("Entrees", "Plats"))
'on lui affecte des étiquettes
.Points(i).ApplyDataLabels
'on selectionne l'étiquette que l'on souhaite, ici on commence en E5 et ensuite on boucle sur I
.Points(i).DataLabel.Text = flws.[E25].Offset(i - 1)
'Next flws
Next i
End With
End If
Next fletiquetteMerci Pijaku,
Juste une explication sur cette ligne
NomFeuille = Right(fletiquette.Name, Len(fletiquette.Name) - 6)Le right et le Len, ça signifie quoi ?
Merci encore
Tu as cherché un peu avant de poser la question?
Tu sais que, dans ton VBA, il existe un fichier d'aide très bien fait... Appuies sur F1, tu verras.
Si jamais ce fichier d'aide n'est pas installé (c'est mon cas), alors, va sur le site msdn.microsoft.com (aide en ligne).
Pour cela, tape sous Google msdn+vba+left ou msdn+vba+len
Ceci n'est nullement une critique. Ce sont les bases pour bien commencer et progresser de manière régulière.