Microsoft 365 Regrouper des lignes en transposant les valeurs sur différentes colonnes

SamuelSam

XLDnaute Nouveau
Bonjour,

Je vous mets l'exemple en pièce jointe avec le tableau de base VS le résultat attendu.
Je cherchais du côté de Power Query ou des tableaux croisés dynamiques, mais sans arriver à ce que je voulais exactement.

Des idées ?

Merci d'avance,
Samuel
 

Fichiers joints

_Thierry

XLDnaute Barbatruc
Bonsoir @SamuelSam , le Forum

Je pense que Power Query devrait arriver à faire ce genre de choses, mais je ne maîtrise pas assez. Je pense que certains contributeurs vont sûrement te proposer quelque chose....

De mon côté j'ai une petite idée en VBA, mais comme tu es trop succinct et vague dans tes explications/fichier... J'ai des questions (qui feront aussi avancer pour une solution Power Query ou autre...)

  1. La "Base de Données" ne contient que DEUX Colonnes ("A" & "B") ?
  2. L'association "Ref Kit" et "Ref Produit" ne peut avoir une "Paire" identique q'une seule fois ?
  3. Si 2) est négatif, que doit-on faire des "doublons" ? (Ajouter quand même une colonne ? "Ref Produit" en face de "Ref Kit") ou bien faire une alerte ? (ou les deux ?)
  4. Au bas mot, on parle de combien de lignes dans la "Base de Données" ?
Avec ces éléments ce sera plus clair avant de se lancer dans quelque chose d'inapproprié...

Bonne soirée.
@+Thierry
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @SamuelSam :), @_Thierry ;),

Par VBA. Le code est dans module1. Cliquer sur le bouton Hop!

Le code dans module1 :
VB:
Sub Reorganiser()
Dim t, n&, i&, j&, d, clef, max&, s
   With Sheets("Feuil2")
      If .FilterMode Then .ShowAllData
      
      'avec un éventuel tri
      .Range("a1").CurrentRegion.Sort key1:=.Range("a1"), order1:=xlAscending, _
         key2:=.Range("b1"), order2:=xlAscending, Header:=xlYes, MatchCase:=False
      'fin de l'éventuel tri
      
      'lecture des données dans le tableau t
      t = .Range("a1").CurrentRegion
      If UBound(t) = 1 Then Exit Sub
      Set d = CreateObject("scripting.dictionary")
      d.CompareMode = TextCompare
      
      'remplissage du dictionary d
      For i = 2 To UBound(t)
         If Not d.Exists(t(i, 1)) Then
            d.Add t(i, 1), t(i, 2)
         Else
            d(t(i, 1)) = d(t(i, 1)) & ";" & t(i, 2)
         End If
      Next i
      
      'remplissage du tableau résultat res
      ReDim res(1 To d.Count + 1, 1 To 2): max = 2
      n = 1
      For Each clef In d.Keys
         s = Split(d(clef), ";")
         If UBound(s) + 2 > max Then max = UBound(s) + 2: ReDim Preserve res(1 To d.Count + 1, 1 To max)
         n = n + 1: res(n, 1) = clef
         For j = 0 To UBound(s): res(n, j + 2) = s(j): Next
      Next clef
      
      'affichage
      .Range("e1").CurrentRegion.Clear
      res(1, 1) = t(1, 1)
      For j = 1 To UBound(res, 2): res(1, j) = t(1, 2): Next
      .Range("e1").Resize(UBound(res), UBound(res, 2)) = res
   End With
End Sub
 

Fichiers joints

SamuelSam

XLDnaute Nouveau
C'était pas le but de ma question, j'aurais sans doute réussi à faire un truc en VBA, mais ça marche nickel, merci !
Je vais jeter un oeil sur comment quelqu'un d'autre le fait :)
VBA ça va, mais Power Query c'est assez neuf pour moi et je me demandais si on pouvait faire la même chose avec ?

J'ai aussi réussi à arriver au résultat par des successions de formules, mais je trouvais pas ça très propre :
  • concaténer si ligne supérieure du même kit
  • identifier la dernière ligne de chaque kit (là où la concaténation est la plus longue)
  • tri sur les lignes identifiées (suppression des autres)
  • utilisation de powerquery pour "éclater" la cellule en spécifiant le séparateur
Voilà, je marque pas encore résolu au cas où quelqu'un ait une autre alternative à VBA, mais déjà merci beaucoup !

Samuel.
 

_Thierry

XLDnaute Barbatruc
Bonsoir @mapomme , re @SamuelSam , le Forum

Je ne sais pas pourquoi, mais je le sentais un peu avant de me lancer dans un algo VBA que ça n'allait pas convenir (même si ce n'était pas du tout spécifié...)
En tout cas beau travail de notre ami MaPomme et très efficace ;)

Bonne chance pour le Power Query SamuelSam
@+Thierry
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re @SamuelSam, @_Thierry ;),

J'aurais essayé. Ça ne m'a pas coûté un temps énorme.
Les pros de PQ de ce site vont le faire en deux coups de cuillère à pot (s'ils lisent ce fil).

Je suis très intéressé par la ou les solutions en PQ (je débute aussi dans ce domaine)
 

Amilo

XLDnaute Accro
Bonjour à tous,

Une solution PQ parmi d'autres,
Je ne me suis pas attardé sur les noms des étapes et des colonnes

Edit : cette solution a cependant ses limites, il faudrait ajouter 1 ou 2 étapes supplémentaires pour la rendre dynamique en cas de nouvelles colonnes.

Je regarderai cela ce soir après 20h si j'ai le temps pour ajouter ces étapes

Cordialement
 

Fichiers joints

Dernière édition:

Amilo

XLDnaute Accro
Re,

Voici 2 autres méthodes avec Power Query et toutes les 2 sont dynamiques quelque soit le nombre de nouvelles colonnes

Cordialement
 

Fichiers joints

Dernière édition:

Amilo

XLDnaute Accro
Re,
Une énième solution Power Query relative au fichier du message #7 mais en version dynamique
Cordialement
 

Fichiers joints

Dernière édition:

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas