Fractionner cellules en lignes

Bonjour,

J'ai un tableau structuré contenant une colonne "objets". Dans les cellules de cette colonne, il peut y avoir plusieurs objets, séparés par un ; . Je souhaite fractionner les cellules qui contiennent plusieurs objets, en autant de lignes qu'il n'y a d'objets.

Exemple

clientdateobjets
toto10/10/25chaise, table, bureau

Je souhaiterai qu'une ligne soit créé pour chaise, table et bureau, en conservant la structure en 3 colonnes et en conservant les informations héritées. A savoir, les colonnes client et date contiendraient les mêmes informations d'origine.

Je sais qu'on peut le faire sur powerquery mais là je ne souhaite pas passer par powerquery. Y a t-il une solution en passant par des formules (sans macro) ?

Bonjour,

la fonction FRACTIONNER.TEXTE devrait vous aider ;

https://excel-pratique.com/fr/fonctions/fractionner-texte

Oui, je l'ai vu cette fonction mais elle ne me permet pas de récupérer les informations des colonnes à côté (ici date et client)

Bonjour à tous,

Je sais qu'on peut le faire sur powerquery mais là je ne souhaite pas passer par powerquery. Y a t-il une solution en passant par des formules (sans macro) ?

Pour moi VBA ou PowerQuery obligé.

Je ne comprends pas pourquoi refuser PQ dans ce cas, c'est exactement un des cas d'école de l'outil...

Si jamais un mini-exemple avec une formule dynamique, mais selon moi c'est une erreur...

=LET(
    _nbR; LIGNES(Table1);
    REDUCE(
        Table1[#En-têtes];
        SEQUENCE(_nbR);
        LAMBDA(a; i;
            LET(
                rowI; CHOISIRLIGNES(Table1; i);
                toSplit; INDEX(rowI; NBVAL(rowI));
                split; SUPPRESPACE(FRACTIONNER.TEXTE(toSplit; ","));
                blk; MAKEARRAY(
                    NBVAL(split);
                    COLONNES(rowI);
                    LAMBDA(r; c; SI(c < NBVAL(rowI); INDEX(rowI; c); INDEX(split; r)))
                );
                ASSEMB.V(a; blk)
            )
        )
    )
)
12book2.xlsx (11.34 Ko)

Ah génial ! merci Saboh12617. Je ne souhaitais pas utiliser powerquery parce qu'il y a des utilisateurs qui n'ont pas de compte et powerquery ne peux pas s'actualiser sans qu'il soit ouvert sur le poste dans l'application. La formule fonctionne très bien... Au passage c'est quand même bien complexe ! Je sais que si je n'avais pas eu cette contrainte powerquery aurait été l'outil idéal.

Hello, je ne maîtrise pas la formule LET de sabot.

Voici une approche peut être plus simpliste :

1. Tu pourrais concaténer toutes les colonnes avec le séparateur ',' virgule

2. Puis tu peux Split avec le même séparateur et tu auras autant de colonne que d'objet par ligne

Paul

Ah génial ! merci Saboh12617. Je ne souhaitais pas utiliser powerquery parce qu'il y a des utilisateurs qui n'ont pas de compte et powerquery ne peux pas s'actualiser sans qu'il soit ouvert sur le poste dans l'application. La formule fonctionne très bien... Au passage c'est quand même bien complexe ! Je sais que si je n'avais pas eu cette contrainte powerquery aurait été l'outil idéal.

Je vous en prie, content d'aider. Il y a surement d'autres approches possibles, sans doute plus performantes avec MAKEARRAY, mais de tous mes essais la formule finit toujours + longue… Il n'y a pas trop d'échappatoire, Excel a du mal avec les "nested array" donc il faut bien expliciter les étapes.

Si résolu n'oubliez pas de clore le sujet.


@PaulExcelVBA c'est une bonne idée mais @siccmdl veut créer des nouvelles lignes pour les valeurs à ajouter, pas des colonnes.

Bonjour à tous !

Une autre approche ?

image

Bonjour à tous !

Une autre approche ?

Wow super JFL ! Très élégant le SI sur la SEQUENCE pour mapper tes 2 colonnes + le texte.

Également sur FRACTIONNER.TEXTE je ne savais pas que l'on pouvait omettre le 2e argument, c'est plus pratique.

Peut-être juste 1 mini-remarque par rapport à la demande de l'OP assez floue. Son tableau original a probablement davantage de colonnes c'est pourquoi je serai en faveur de

ASSEMB.H(SI(SEQUENCE(LIGNES(s)); EXCLURE(r; ; -1)); s)

Plutôt que

ASSEMB.H(SI(SEQUENCE(LIGNES(s)); PRENDRE(r; ; 2)); s)

Afin de rester agnostique du nombre de colonnes. Mais super travail chapeau.

Bonjour à tous de nouveau !

@saboh12617 : Hello !

... 1 mini-remarque par rapport à la demande de l'OP assez floue. Son tableau original a probablement davantage de colonnes c'est pourquoi je serai en faveur de ...

C'est toujours délicat d'intégrer des contraintes non-exposées.
On peut (presque) les multiplier à l'infini.

  1. Et si la colonne à fractionner était placée en début de tableau ?
  2. Et si....elle était placée au milieu ?
  3. Et si le séparateur était différent ? (pour rappel le demandeur évoque un point-virgule et son exemple une virgule suivie d'un espace....)

C'est pas faux...

Merci JFL pour ta contribution avec une formule plus synthétique. Les 2 fonctionnent, j'en suis très satisfaits.

Bonjour à tous de nouveau !

Je vous remercie de ce retour.

Bonjour,

Une autre manière mais j'ai un souci avec une des dates...

P.

Salut Patrick,

Tu as un soucis avec les dates car (je n'ai pas bien compris pourquoi) au lieu de simplement reprendre la valeur de la date en elle-même, tu sauvegardes une string de sa représentation. Le problème c'est que lorsque tu insères ces strings qui "ressemblent" à des dates dans Excel, il essaie de les convertir lui-même… souvent en utilisant le format américain mm/jj/aaaa...

Tu aurais intérêt à garder les dates telles quelles, en les sauvegardant dans tabloR comme tu le fais pour la colonne Client.

@saboh12617

Merci !

Rechercher des sujets similaires à "fractionner lignes"