Déplier une liste horizontal

Bonjour à tous;

Je pense que mon excel est assez explicite entre l'entrée et la sortie attendue...
Petite subtilité : la colonne D est ce que j'ai en entrée; j'ai réussis à la déplier (avec le séparateur ";" mais c'est peut être pas utile...

J'ai cru comprendre que c'est avec un LET qu'on peut faire ça mais 'jai pas réussis à m'en sortir... (pas de VBA ni de power query si possible)

En vous remerciant par avance pour votre aide
Si jamais il y a besoin de plus d'informations n'hésitez pas :)

excel 365 en Francais

12probleme.xlsx (10.13 Ko)

Bonjour,

Une proposition :

=LET(
    _base; A2:D4;
    _toSplit; PRENDRE(_base; ; -1);
    _repts; BYLIGNE(_toSplit; LAMBDA(r; NBVAL(FRACTIONNER.TEXTE(r; ";"))));
    _cumul; SCAN(0; _repts; SOMME);
    _nbR; SOMME(_repts);
    MAKEARRAY(
        _nbR;
        COLONNES(_base);
        LAMBDA(r; c;
            LET(
                _rIni; EQUIVX(r; _cumul; 1);
                SI(
                    c < COLONNES(_base);
                    LET(_v; INDEX(_base; _rIni; c); SI(_v = ""; ""; _v));
                    LET(
                        _split; FRACTIONNER.TEXTE(INDEX(_base; _rIni; c); ";");
                        _off; INDEX(_cumul - _repts; _rIni);
                        INDEX(_split; r - _off)
                    )
                )
            )
        )
    )
)

adapter dans la première ligne _base; A2:D4 à la plage réelle.

EDIT : attention sur de gros volumes de données PQ sera bien plus performant et adapté : sur 15000 lignes déjà je commence à ramer, alors que la fonction est relativement optimisée.

Bonjour à tous !

Une autre approche possible :

=LET(
    p; A2:D4;
    EXCLURE(
        REDUCE(
            "";
            SEQUENCE(LIGNES(p));
            LAMBDA(a; c;
                ASSEMB.V(
                    a;
                    LET(
                        r; INDEX(p; c; );
                        s; FRACTIONNER.TEXTE(PRENDRE(r; ; -1); ; ";");
                        ASSEMB.H(SI(SEQUENCE(LIGNES(s)); PRENDRE(r; ; 3) & ""); s)
                    )
                )
            )
        );
        1
    )
)

@saboh12617 : Hello ! Attention à votre "BYLIGNE"

Merci !
j'y comprends pas grand chose mais j'ai une erreur #NOM?
j'ai l'impression que le BYLIGNE pose probleme...

la commande n'existe pas chez moi

@JFL merci ce code m'a l'air plus simple (vu la syntaxe) pour le maintenir dans le futur...
Est ce que c'est possible d'expliquer le fonctionnement ? merci d'avance

@JFL : petite subtilité, des fois je peux avoir des cellules vide dans ma colonne E et ca provoque une erreur...
j'ai essayé de me dépatouiller avec des SI j'ai pas réussis :'(

voir piece jointe

6probleme2.xlsx (12.11 Ko)
Merci !
j'y comprends pas grand chose mais j'ai une erreur #NOM?
j'ai l'impression que le BYLIGNE pose probleme...

la commande n'existe pas chez moi

Essayez de le remplacer par "BYROW" alors (3e ligne de ma formule), c'est le traducteur de formules qui fait des siennes (j'ai Excel en anglais).

Ci-joint votre fichier avec ma formule mise à jour, car j'avais le même problème que JFL.

4probleme2.xlsx (14.97 Ko)

Merci @saboh12617

Néanmoins j'ai le meme soucis qu'avec la solution de JFL
j'avoue ne pas avoir été explicite...

Je veux que ca prenne en compte la ligne QUE si il y a quelquechose dans Bn Cn et En (avec n : un numéro de ligne quelconque)
Je sais pas si je suis clair...
j'ai essayé de filtrer mais j'ai pas réussi :'(

Typiquement la ligne A10 Woookie devrait pas s'écrire car il n'y a rien dans E6

(je peux avoir des cas ou il n'y a rien dans B6 ou C6 (D6 est optionnel)

Bonjour

une autre approche avec un FILTRE pour ne pas prendre en compte les lignes lorsque la 4eme colonne est vide

en cellule H4 de la feuille2 de votre fichier "Problème2"

=LET(
_Col123;FILTRE(B3:D7;E3:E7<>"");
_Col4;FILTRE(E3:E7;E3:E7<>"");
_Pos4;NBCAR(_Col4)-NBCAR(SUBSTITUE(_Col4;";";""))+1;
_Pos4_Cumul;SCAN(1;_Pos4;LAMBDA(x;y;x+y))-_Pos4;
ASSEMB.H(
  MAKEARRAY(SOMME(_Pos4);3;LAMBDA(i;j;INDEX(_Col123;EQUIVX(i;_Pos4_Cumul;-1);j)))&"";
  FRACTIONNER.TEXTE(JOINDRE.TEXTE(";";;_Col4);;";"))
)

Stéphane

Salut Raccourcix, JFL, sympa de voir différentes solutions.

@NeoLitik, ci-joint fichier/formule mise à jour pour ne filtrer (et donc traiter) que les lignes où les 4 colonnes sont remplies dans le tableau initial. Il faut bien les 4 colonnes remplies, puisque vous disiez "ca prenne en compte la ligne QUE si il y a quelquechose dans Bn Cn et En". (j'ai ajouté Fn puisque c'était votre précédente question de ce que j'ai compris).

1probleme2.xlsx (16.99 Ko)

Salut @Saboh12617

Désolé je me suis mal exprimé j'ai voulu simplifier le cas en anonymisant les données mais je vois que ca prend pas en compte tous les cas particuliers...

en fait, la ligne doit etre pris en compte si il y a qqch dans Bn... Cn... ET En...
Dn c'est optionnel il peut y avoir qqch ou pas

donc l'exemple suivant est valide :

A10BB8PT;XD;CF

il doit générer

A10 BB8 PT
A10 BB8 XD
A10 BB8 CF

De la meme façon cet exemple est valide :

A10BB8C3POP

et doit générer :

A10 BB8 C3PO P

mais ces exemples là ne doivent pas etre pris en compte :

(si je dis pas de bêtise seul les trois premieres lignes seront les plus courante je pense pas que les autres cas puissent arriver...)

A10WOOKIE
A10
A10PT;XD;EF
WOOKIE
LEIA
WOOKIEPT;XD;EF

Ok, je crois avoir capté. J'ai adapté le filtre ainsi :

_arr; B3:E7;
_filt; SUPPRESPACE(CHOISIRCOLS(_arr; 1; 2; 4)) <> "";
_base; FILTRE(_arr; BYLIGNE(_filt; ET));
6probleme2.xlsx (17.46 Ko)

Bonjour à tous !

Proposition initiale amendée pour tenir compte des contraintes nouvelles exprimées :

=LET(
    p; B4:E14;
    EXCLURE(
        REDUCE(
            "";
            FILTRE(SEQUENCE(LIGNES(p)); BYROW(CHOISIRCOLS(p; 1; 2; 4) <> 0; ET));
            LAMBDA(a; c;
                ASSEMB.V(
                    a;
                    LET(
                        r; INDEX(p; c; );
                        s; FRACTIONNER.TEXTE(PRENDRE(r; ; -1); ; ";");
                        ASSEMB.H(SI(SEQUENCE(LIGNES(s)); PRENDRE(r; ; 3) & ""); s)
                    )
                )
            )
        );
        1
    )
)
Rechercher des sujets similaires à "deplier liste horizontal"