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
 

Pièces jointes

  • test_pivot.xlsx
    11.8 KB · Affichages: 17

_Thierry

XLDnaute Barbatruc
Repose en paix
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
 

Pièces jointes

  • SamuelSam- test_pivot- v1.xlsm
    23.1 KB · Affichages: 4

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
Repose en paix
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
 

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
 

Pièces jointes

  • test_pivot.xlsx
    17.3 KB · Affichages: 3
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 107
Messages
2 085 354
Membres
102 873
dernier inscrit
yayo