Macro qui transpose et regroupe ligne vers colonne

Bonjour,

Voici le genre de tableau Excel que j'ai (peut comporter des dizaines de milliers de lignes !) sur 2 colonnes

A B

référence 1 rouge

référence 1 vert

référence 1 bleu

référence 2 bleu

référence 2 noir

référence 3 rouge

référence 3 noir

référence 3 blanc

référence 3 vert

référence 3 jaune

notes:

Chaque référence à plusieurs coloris possibles, mais pas toujours le même nombre (certaines en ont 1 seul, d'autres 20...donc la réf. apparaît sur 1 ligne ou sur 20...)

J'ai besoin d'une macro qui puisse me transposer en colonne (en vue d'une publipostage) ET effacer les doublons afin de n'avoir plus qu' UNE SEULE occurence de référence par ligne avec tous ses coloris en colonne, comme cela:

A B C D E F G etc...

référence 1 rouge vert bleu

référence 2 bleu noir

référence 3 rouge noir blanc vert jaune

Le tableau résultat pourrait être crée idéalement sur une deuxième feuille, ou bien sur la même feuille à côté, peu importe dans ce cas, j'effacerai les données des 2 colonnes source

Si vous pouviez m'aider avec la bonne macro, ce serait un aide énorme pour moi.

merci!

Je te propose une solution,

1/ récupérer les produits dans une variable collection (pour éviter les doublons)

2/ activer les filtres sur les 2 colonnes (produit et coloris)

3/ ensuite faire une boucle sur la collection et appliquer le filtre pour chaque produit et récupérer la partie visible de la colonne coloris

4/ copier-coller spécial de la partie visible avec l'option transpose dans un nouveau tableau

Merci Chrix,

Malheureusement je ne suis pas capable de comprendre cette solution.

mais encore merci pour votre aide.

vitchito,

Je pense avoir trouvé la solution, ci-dessous la macro qui va te permettre de faire ta transposition sans-doublons :

Option Explicit
Sub testSub()
    transposeTableauSansDoublon Range("A5"), Range("D5")
End Sub

Sub transposeTableauSansDoublon(rngPremiereCellule As Range, rngDestination As Range)
    On Error GoTo erreur:
    Application.ScreenUpdating = False

    Dim rngProduit As Range
    Dim rngEnteteColonneProduit As Range
    Dim rngColonneColorisFiltre As Range
    Dim rngDestinationAeffacer As Range
    Dim cell As Range
    Dim colProduit As Collection
    Dim vrtProduit As Variant
    Dim i As Long

    'Affectations
    Set rngProduit = Range(rngPremiereCellule, Cells(65536, rngPremiereCellule.Column).End(xlUp)) 'Colonne produit dynamique
    Set rngEnteteColonneProduit = rngProduit.Offset(-1, 0).Cells(1)
    Set colProduit = New Collection

    'Enregistrement des références 'produit' dans une collection
    'La clé CStr(cell.value) ne permettra pas d'enregistrer les doublons
    '(mais necessite d'échapper l'erreur par 'on error resume next')
    For Each cell In rngProduit
        'au passage on ne veux pas des cellules vides
        If cell.Value <> "" Then
            On Error Resume Next
            colProduit.Add cell.Value, CStr(cell.Value)
            On Error GoTo 0
        End If
    Next cell

    'On efface le tableau de destination précédent
    Set rngDestinationAeffacer = rngDestination.CurrentRegion
    Set rngDestinationAeffacer = rngDestinationAeffacer.Offset(1, 0).Resize(rngDestinationAeffacer.Rows.Count - 1, rngDestinationAeffacer.Columns.Count)
    rngDestinationAeffacer.Clear

    'Activation du filtre
    rngEnteteColonneProduit.AutoFilter

    'Pour chaque produit
    i = 0
    For Each vrtProduit In colProduit
        'Application du filtre
        rngEnteteColonneProduit.AutoFilter rngEnteteColonneProduit.Column, Criteria1:=vrtProduit

        'Récupération des valeurs visibles dans la colonne coloris
        Set rngColonneColorisFiltre = rngProduit.Offset(, 1).Cells.SpecialCells(xlCellTypeVisible)
        rngColonneColorisFiltre.Copy

        'Ajout du nom du produit courant dans le nouveau tableau
        rngDestination.Offset(i, 0).Value = vrtProduit

        'Ajout des coloris (copier-coller spécial avec l'option transpose)
        rngDestination.Offset(i, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
            SkipBlanks:=False, transpose:=True
        i = i + 1
    Next vrtProduit

    'Désactivation du filtre
    rngEnteteColonneProduit.AutoFilter

    Application.ScreenUpdating = True
    Exit Sub

erreur:
    Application.ScreenUpdating = True
    MsgBox "Erreur n°" & Err.Number & vbNewLine & Err.Description, vbCritical
End Sub

La procédure transposeTableauSansDoublon(rngPremiereCellule As Range, rngDestination As Range) doit recevoir 2 arguments de type Range obligatoires. Le 1er argument est la 1ère cellule où il y a un nom de produit, le 2ème argument est la 1ere cellule de ton tableau de destination.

Telle que la macro est faite, tu peux ajouter autant de référence 'produit' à la suite dans ton tableau et autant de coloris que tu veux. Le nom des colonnes dans le tableau de destination n'est pas du tout géré, ça sera à toi de les rajouter au fur et à mesure que tu auras un nombre maximum de coloris pour 1 produit.

Tu trouveras ton fichier excel avec mes modifications en pièce jointe.

Voilà, si tu as des questions, ou des erreurs, n'hésite pas

Bonjour

Comme j'y ai travaillé dessus, mon idée

Merci, la solution de Banzai64 fonctionne bien (si je copie-colle mes données dans son propre fichier exemple), par contre je n'arrive pas à faire fonctionner la macro dans un nouveau fichier.

J'ai intégré la macro à un nouveau fichier XLS, les feuilles ont le même nom et mes données débutent bien sur A4, comme sur l'exemple de Banzeai64. J'ai copié la macro telle qu'elle, avec l'option Explicit.

Et pourtant ça ne tourne pas (le debogage met en évidence cette ligne : ElseIf Tablo(K, 1) = "" Then).

Je n'arrive pas à comprendre pourquoi ???

Bonjour

Pour chercher (et éventuellement trouver) ton fichier anonymisé serait le bienvenu

A suivre

voici le fichier:

j'ai copié ta macro: je lance, ça tourne et ça ne s'arrête pas.

Alors que si je prends ton fichier et que de colle ces données dedans, ça marche.

Merci pour ton aide précieuse!

Bonjour

Cela fonctionne

C'est sur la macro n'est pas instantanée mais elle fait son boulot

Dans le fichier joint j'ai laissé le résultat

Merci, tu me rends un service énorme !

Bonne année à tous ...

Parfait ! mais comment faire marcher la macro en sens contraire.

Merci.

Bonjour

Une solution

tu ne lances pas la 1ère macro

Bonjour ,

J'ai pas compris pourriez vous m'illustrer ça dans un fichier ?

Merci!

Bonjour

rghanmi a écrit :

Parfait ! mais comment faire marcher la macro en sens contraire.

Pour moi cela voulait dire que tu voulais retrouver tes données comme avant

Donc la solution c'est de ne pas lancer la macro qui fait le regroupement

salut Banzai64,

voici ce que je voulais dire par là . j'éspere tout est clair Merci !

Bonjour

A voir

Bravo !!! merci infinement !!

serait-t-il possible d'avoir un résultat comme dans le fichier ci-joint.

Merci beaucoup!

Bonjour

A tester

merci beaucoup.... voila ce que je recherche.

Bonjour à tous,

La solution donnée par Banzaï64 est parfaite pour moi, elle marche nickel.

Le seul problème, c'est que comme je n'en ai pas compris la programmation, je ne peux pas la réutiliser dans mon fichier excel

avec mes cases et mes onglets.

En gros, je ne sais pas quel lettre/partie changer sur le pavé de programmation de Banzaï64, pour que ça marche avec moi.

Sinon, la programmation en elle même est exactement ce qu'il me fallait

( Bon, en vrai, pour moi, les couleurs seront des longueurs, et je ne veux pas juste les lister toutes sur la même ligne, mais les additionner dans une même cellule pour avoir la longueur totale de mes sections de bois ( = les produits ici dans le cas de Vichito repris par Banzaï64, mais ça je verrai plus tard, ça ne devrait pas compliqué )

Bref, L'un de vous pourrait m'expliquer pas à pas les lignes du programme de Banzaï64 pour que je sache à quel moment je dois changer des éléments. Surtout quand on parle de "tablo" dans le VBA, je suis perdu.

Merci d'avance.

Zarazy59

Rechercher des sujets similaires à "macro qui transpose regroupe ligne colonne"