Tri et séparation de gammes via macro

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

narkoleptik

XLDnaute Junior
Salut à tous

Voilà mon souci :
Je bosse pour un équipementier auto.
Je gère plusieurs gammes.
Je reçois des besoins clients dans SAP que j'extrait vers Excel.
Je dois rendre "lisible" par le opérateurs ces besoins, donc simplifier au maximum les tableaux.
J'arrive à faire à peu près ce que je veux sauf 1 chose.
Je voudrais séparer 2 gammes bien différentes depuis une feuille dans un même classeur et expédier la gamme 1 triée comme il faut sur une feuil2 et la gamme 2 sur une feuil3.

J'ai plusieurs critères possibles pour séparer les datas.

Pour résumer :
1 classeur
Onglet 1 = données brutes venant de SAP
Onglet 2 = matrice pour une recherchV
Onglet 3 = mes données de manière simplifiées mais avec les 2 gammes mélangées
Je souhaite onglet 4 et 5 pour y mettre gamme 1 et 2 en version simplifiées.

Je ne sais pas si je me fais comprendre.

J'ai un fichier à vous montrer en exemple mais il contient des données confidentielles.
Si vous ne comprenez pas, je crééerai un exemple moi même.
Merci d'avance pour votre aide.
 
Re : Tri et séparation de gammes via macro

Bonjour.

Si les données brutes sont un tableau avec une colonne pour la gamme et d'autres pour les critères sur lesquels ça doit être classé dans chacune, j'ai des modules de service qui permettraient de l'écrire assez simplement dans le style :
For Each Gamme In GroupOrg(DonnéeFeuilleBrute, 1, 2, 3 (les colonnes d'arguments))
- Initialiser un tableau à destination de la feuille de cette gamme
- For Each Critère1 In Gamme.Contenu
- - Etc.
- Versement du tableau dans la feuille Gamme.Id
- Next Gamme
 
Re : Tri et séparation de gammes via macro

Bonjour.

Si les données brutes sont un tableau avec une colonne pour la gamme et d'autres pour les critères sur lesquels ça doit être classé dans chacune, j'ai des modules de service qui permettraient de l'écrire assez simplement dans le style :
For Each Gamme In GroupOrg(DonnéeFeuilleBrute, 1, 2, 3 (les colonnes d'arguments))
- Initialiser un tableau à destination de la feuille de cette gamme
- For Each Critère1 In Gamme.Contenu
- - Etc.
- Versement du tableau dans la feuille Gamme.Id
- Next Gamme

Merci pour ta réponse.
Est-ce que je peux via MP t'envoyer le classeur pour que tu voies bien de quoi il s'agit?
 
Re : Tri et séparation de gammes via macro

OK.
Désolé pour le tutoiement, c'est l'habitude.
Ci-joint un exemple donc.
L'idée est de séparer les articles suivant la colonne article comme critère et de les envoyer triés dans le même ordre dans les onglets correspondants.
Merci d'avance
 

Pièces jointes

Re : Tri et séparation de gammes via macro

C'est tout à fait ça que je cherche.

Par contre, j'essaie de comprendre (je ne maîtrise pas du tout VBA).
Pour l'adapter à mes articles réels, je ne vois pas où je dois modifier.

En tous cas merci beaucoup.
 
Re : Tri et séparation de gammes via macro

La seule instruction à modifier est la For Each Article In GroupOrg(PlgUti(Feuil1.[A2]), 4)
Remplacez Feuil1 par le CodeName de la bonne feuille où sont les données, A2 par l'adresse de la 1ère cellule de données dans cette feuille, et 4 par le rang de la bonne colonne de regroupement.
 
Re : Tri et séparation de gammes via macro

Bon, j'ai regardé un peu.
Votre explication paraît simple, mais je ne m'y retrouve pas.
Ci-joint le fichier tel que je le souhaite.
Merci de m'expliquer.
 

Pièces jointes

Re : Tri et séparation de gammes via macro

Bonjour.

Corriger comme suit :
VB:
Sub Distribuer()
Dim Article As SsGroup, Ls&, Détail, C&, Tr(), F As Worksheet
For Each Article In GroupOrg(PlgUti(Feuil1.[A2]), 4)
   ReDim Tr(1 To Article.Contenu.Count, 1 To 5)
   Ls = 0
   For Each Détail In Article.Contenu
      Ls = Ls + 1: For C = 1 To 5: Tr(Ls, C) = Détail(C): Next C
      Next Détail
   On Error Resume Next
   Set F = Worksheets(Article.Id)
   If Err Then MsgBox "La feuille """ & Article.Id & """ n'existe pas ==> Abandon", _
      vbCritical, "Distribuer": Exit Sub
   On Error GoTo 0
   F.UsedRange.ClearContents
   F.[A1:E1].Value = Feuil1.[A1:E1].Value
   F.[A2].Resize(UBound(Tr, 1), 5).Value = Tr
   Next Article
End Sub
Cela dit, en fait, peut être que ce que vous vouliez c'était ça :
VB:
Sub Distribuer()
Dim Games(), Game As SsGroup, Ls&, Détail, C&, Tr(), F As Worksheet
Games = Array("P2683", "P1650")
Tr = PlgUti(Feuil1.[A2]).Resize(, 6).Value
For Ls = 1 To UBound(Tr)
   Tr(Ls, 6) = "DEFLECTEURS"
   For C = LBound(Games) To UBound(Games)
      If Tr(Ls, 4) Like "*" & Games(C) & "*" Then Tr(Ls, 6) = Games(C): Exit For
      Next C, Ls
For Each Game In GroupOrg(Tr, 6)
   On Error Resume Next
   Set F = Worksheets(Game.Id): If Err Then Set F = Nothing
   On Error GoTo 0
   If F Is Nothing Then
      MsgBox "La feuille """ & Game.Id & """ n'existe pas" _
         & vbLf & "==> Game ignoré.", vbCritical, "Distribuer"
   Else
      ReDim Tr(1 To Game.Contenu.Count, 1 To 5)
      Ls = 0
      For Each Détail In Game.Contenu
         Ls = Ls + 1: For C = 1 To 5: Tr(Ls, C) = Détail(C): Next C
         Next Détail
         F.UsedRange.ClearContents
         F.[A1:E1].Value = Feuil1.[A1:E1].Value
         F.[A2].Resize(UBound(Tr, 1), 5).Value2 = Tr ' Value2 pour éviter bogue sur dates françaises
         F.[A2].Resize(UBound(Tr, 1)).NumberFormat = "m/d/yyyy"
         F.[A:E].Columns.AutoFit: End If: Next Game
End Sub
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
7
Affichages
977
Retour