Tri et séparation de gammes via macro

narkoleptik

XLDnaute Nouveau
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.
 

Dranreb

XLDnaute Barbatruc
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
 

narkoleptik

XLDnaute Nouveau
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?
 

Dranreb

XLDnaute Barbatruc
Re : Tri et séparation de gammes via macro

Non, créez un exemple de quelques ligne et joignez le ici.
 

narkoleptik

XLDnaute Nouveau
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
 

Fichiers joints

narkoleptik

XLDnaute Nouveau
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.
 

Dranreb

XLDnaute Barbatruc
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.
 

Dranreb

XLDnaute Barbatruc
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:
Haut Bas