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,

15test-array.xlsm (51.39 Ko)

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 Sub

Tu 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 With

J'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 Sub

Bon, 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 fletiquette

Une idée ?

Bonjour,

Franchement, je ne sais pas quoi faire pour t'aider...

Sans le classeur cela va vraiment être compliqué.

Bonjour,

Le fichier ci-joint.

Merci

10test-array.xlsm (56.41 Ko)

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 fletiquette

Merci 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.

Rechercher des sujets similaires à "boucle each"