Générer un tableau a partir d'une matrice

Bonjour à tous, je voudrais générer un tableau a partir d'une matrice

Voici l'exemple.

ARCPLEPAQPLD
Titre 111
Titre 2123
Titre 314
Titre 415

chaque numéro correspond au nombre de ligne a créer.

Je voudrais les titre en colonne A, les signe en colonne B et en colonne C 00 si il n y a qu'une seule ligne et des numéro incrémenté a partir de 1 si il y a plusieurs lignes

Voici le résultat attendu

Titre siglenuméro
Titre 1ARC00
Titre 1PAQ00
Titre 2PLE00
Titre 2PAQ01
Titre 2PAQ02
Titre 2PLD01
Titre 2PLD02
Titre 2PLD03
Titre 3PLE00
Titre 3PLD01
Titre 3PLD02
Titre 3PLD03
Titre 3PLD04
Titre 4PLE00
Titre 4PLD01
Titre 4PLD02
Titre 4PLD03
Titre 4PLD04
Titre 4PLD05

c'est une version très simplifié de mon but à atteindre. je ne sais pas utilisé VBA donc j'aimerai trouver une solution par formule pour pouvoir l'appliquer par moi même a un tableau plus complexe. j'ai tenté de me faire assister par copilote avant de venir vous solliciter mais je bloque a une des étapes et malheureusement il me radote la même chose éternellement... Je suis sur que vous saurez me conseiller mieux que l'IA...

globalement c'est pour générer une premier version d'une liste de document. Si par la suite je veux générer des lignes supplémentaires sans modifier la matrice initiale pensez vous que c'est possible?

Exemple titre 4 PLE. (Exemple a la toute fin car je n'arrive pas a écrire après mon tableau.)

Je vous remercie par avance et vous souhaite à tous une bonne année.

Titre siglenuméroIndice
Titre 1ARC00A
Titre 1PAQ00A
Titre 2PLE00A
Titre 2PAQ01A
Titre 2PAQ02A
Titre 2PLD01A
Titre 2PLD02A
Titre 2PLD03A
Titre 3PLE00A
Titre 3PLD01A
Titre 3PLD02A
Titre 3PLD03A
Titre 3PLD04A
Titre 4PLE00A
Titre 4PLE00B
Titre 4PLD01A
Titre 4PLD02A
Titre 4PLD03A
Titre 4PLD04A
Titre 4PLD05A

Bonsoir à tous !

Une approche via Power Query pour le point 1 :

Le point 2, de par son côté aléatoire, me semble à tout le moins délicat......

Ceci étant, Power Query vous retournant un tableau structuré, il est envisageable de le copier pour le modifier à votre guise.

Merci pour votre réponse, votre solution n'étant pas par formule, plus difficile à copier pour adaptera une situation plus complexe mais je vais regarder comment ca fonctionne et je devrai y arriver...

Le seul bémol à cette solution c'est l'action de devoir mettre à jour manuellement le résultat. La dernière fois que j'ai proposé une solution comme ca pour un autre document on m'a demandé de trouvé une solution ou je n'avais pas l'action de mettre à jour. J'avais un tableau croisé dynamique qui reprenait des infos obtenu à partir d'un export d'ERP, et je récupérais les infos sur ce tableau pour l'utilisation de mon document. Seulement à chaque fois que je chargeait mes données (A faire une seule fois par projet), je devais actualiser le tableau et du coup, on m'a demandé de le faire autrement pour pas ajouter une étape aux utilisateur finaux. Ici le cas étant plus complexe, j'espère que la solution sera acceptée.

Pour le point 2, j'exploiterai les résultat du tableau dans un nouvelle onglet donc je pourrait ajouter des lignes même si une fois encore cette solution ne va pas plaire car il faudra copier les formules de la ligne supérieur mais pas complétement toute la ligne car entre l'indice A et B on a forcément une différence...

Merci encore pour votre réponse, je vais suivre votre piste et en chercher d'autres pour trouver les meilleurs solutions à mes problèmes. Bonne journée.

Bonjour à tous !

Bien...

Je vous remercie de ce retour.

---> Ne pas oublier de passer le sujet en mode résolu !

Remarques sur la terrible actualisation....:

La raison devrait être de mise non ? Que représente un simple clic ?
N'oubliez pas que vous pouvez personnaliser la barre d'accès rapide pour y placer le commande "Actualiser tout".

Bonjour à tous,

Sur O365 la formule suivante devrait fonctionner. Si vous avez une erreur remplacez en bas les "\" par des ".".

Après je n'ai pas bien compris le dénombrement. Pourquoi des fois ça commence à 0 et d'autres fois à 1 ?

=LET(tbl;
REDUCE(0;tSource[[ARC]:[PLD]];LAMBDA(acc;v;
ASSEMB.V(acc;SIERREUR(
LET(
titre;DECALER(v;0;1-COLONNE(v));
colN;DECALER(v;1-LIGNE(v);0);
MAKEARRAY(v;3;LAMBDA(r;c;SI.MULTIPLE(c;1;titre;2;colN;3;r-1))));0)
)));
ASSEMB.V({"Titre"\"Sigle"\"Numéro"};
FILTRE(tbl;NON(ESTERREUR(PRENDRE(tbl;;-1))))))

Bonjour à tous de nouveau !

Après je n'ai pas bien compris le dénombrement. Pourquoi des fois ça commence à 0 et d'autres fois à 1 ?

C'est là une difficulté majeure de la demande.
Via Power Query, il est possible de répondre aisément à cette logique.

Ah oui je n'avais pas bien lu la demande.

En adaptant un petit peu la formule je retrouve ton résultat @JFL :

=LET(tbl;
REDUCE(0;EXCLURE(tSource;;1);LAMBDA(acc;v;
ASSEMB.V(acc;SIERREUR(
LET(
titre;INDEX(tSource[Titre];LIGNE(v)-LIGNE(tSource[#En-têtes]));
sigle;INDEX(EXCLURE(tSource[#En-têtes];;1);1;COLONNE(v)-COLONNE(tSource[Titre]));
MAKEARRAY(v;3;LAMBDA(r;c;SI.MULTIPLE(c;1;titre;2;sigle;3;TEXTE(SI(v>1;r;r-1);"00")))));
0))));
ASSEMB.V({"Titre"."Sigle"."Numéro"};
FILTRE(tbl;NON(ESTERREUR(PRENDRE(tbl;;-1))))))

EDIT : formule revue avec @JFL pour optimisations/corrections variées

Bonjour à tous de nouveau !

Ah oui je n'avais pas bien lu la demande.

En adaptant un petit peu la formule je retrouve ton résultat @JFL :

Je pense que vous allez faire une heureuse.....

Bonjour,

Pour le dénombrement commençant par 0 ou 1, c'est pour souligner le caractère unique d'un document. Si le document est unique il s'appelle 00 c'est a dire que l'on attendra pas un autre document avec la même combinaison titre /sigle. Je vais essayer la nouvelle formule proposé. J'ai réussi a le faire par power Querty mais on a complexifié un peu ma demande donc je vais voir avec quel solution je m en sort le mieux. je vais avoir des type de documents associé à chaque sigle ce qui entraine que certain sigle seront sur plusieurs lignes car il correspondent à plusieurs type de document.

Vous m'avez donné de belles pistes à explorer. c'est assez nouveau pour moi, jusqu'à présent mon utilisation d'Excel restait très basique, j 'ai démarré un nouveau poste en juillet et ca ne fait que quelque mois que je me plonge un peu plus dans le développement de support. C'est assez complexe quand on manque de compétence mais très intéressant.

Encore merci pour vos réponses

Rebonjour,

Merci pour votre retour et bon courage dans votre nouvelle prise de poste. Je pense qu'au vu de l'usage que vous souhaitez faire de ce tableau, PQ est une option plus adaptée que les formules : vous avez bien fait de partir dans cette direction.

Si c'est possible, n'hésitez pas à c/c le code de votre requête PQ pour la poster ici, et ainsi clôturer le fil si vous l'estimez résolu.

Code de la requête accessible comme ceci :

image

Bonne journée.

Bonjour à tous !

Je vous remercie de ce retour.

---> Ne pas oublier de passer le sujet en mode résolu !

Je viens de tester sur mon exemple la formule de Saboh mais j'obtient un décalage dans mes titres. 0 devrait être titre 1 , titre 1 devrait être titre 2...

Quoi qu'il en soit que j'opte pour une solution ou l'autre, je vais devoir décortiquer chaque étapes pour comprendre avant de l'adapter a mon cas plus complexe.
dans tous les cas je ne l'utiliserai pas en l'état ayant inversé les lignes et colonnes sur mon document final.

Merci pour vos réponses

image

La proposition s'appuyait sur un tableau structuré, c'est très important. En l'occurrence, dans la formule, j'ai écrit

EXCLURE(tSource;;1)

Que vous avez remplacé par

EXCLURE(A1:E5;;1)

Mais c'est incorrect, quand on écrit le nom d'un tableau structuré, on réfère uniquement à ses valeurs sans les en-têtes. Vous devriez donc écrire

EXCLURE(A2:E5;;1)

Après, l'intérêt était de faire une formule relativement dynamique. En remplaçant par des plages "fixes" on perd vite cette "adaptabilité" de la fonction (qui permettait de déplacer le tableau sur la feuille et de l'allonger verticalement/horizontalement sans problème).

PS: Si vous voulez une explication détaillée de la fonction, je peux essayer de vous la donner.

J'ai converti mes donnés en tableau et j'ai sélectionné la plage sans les entêtes. l'allongement verticale fonctionne donc bien j'ai pu ajouter le titre 5 et j'ai automatiquement obtenu la ligne supplémentaire. Par contre j'ai toujours le décalage même si ma plage ne contient pas les entêtes.

Je veux bien quelques explications mais je ne voudrait pas abuser de votre temps.

Je part en réunion et je tente ensuite ma version plus complexe.

image image

j'ai trouvé en rajoutant un exclure dans la partie de la colonne A:A

je progresse

image

Quelques explications :

La fonction LET : donner un nom au résultat d'un calcul, pour le réutiliser après.

Exemple simple :

LET(x;2; x+1) Renvoie 3.

Là je l'utilise pour la variable "tbl" qui va contenir un tableau intermédiaire (avec des erreurs).

EXCLURE : retire des lignes/colonnes d'une matrice. Ne vous en préoccupez pas trop, c'est pour "ajuster".

MAKEARRAY(l,c,lambda) : créer une matrice de dimensions l*c. Pour la remplir, la fonction lambda est appliquée à chaque coordonnée de cellule. ("LAMBDA(maligne;macolonne; …)")

Elle est utilisée pour créer les "sous-blocs" de votre tableau. Un sous-bloc correspond à un duo Titre+Sigle, à partir duquel on crée une mini-matrice qui va avoir pour nombre de lignes le nombre indiqué dans votre tableau.

Et maintenant la partie "difficile" : REDUCE.

Cette fonction va scanner une matrice cellule par cellule, y faire le calcul que l'on souhaite, et se rappeler du calcul précédent.

La syntaxe est : REDUCE(valeur_initiale, matrice, lambda(accumulateur, valeur_courante))

En gros, normalement ça sert à trouver une/des valeur qui correspond à certains critères dans une liste. Cependant on peut l'utiliser de manière plus complexe : on peut utiliser ASSEMB.V pour stacker verticalement les calculs qu'on va faire, et donc en garder la trace.

Par exemple :

Si vous écrivez =REDUCE(""; Tableau1; LAMBDA(acc;val; ASSEMB.V(acc;val))) vous allez récupérer toutes les valeurs de votre tableau dans une unique colonne. L'accumulateur (acc) c'est la mémoire. val c'est la valeur en cours.

Et donc là, on peut assembler les pièces du puzzle :

On va parcourir tout le tableau, pour chaque cellule, on va lui créer son sous-bloc correspondant à son duo titre-sigle, puis on va les empiler les uns sur les autres.

Ensuite, on va simplement utiliser FILTRE et EXCLURE pour retirer les erreurs (quand une valeur du tableau est nulle par exemple, ou encore la 1e ligne de REDUCE qui, quand on utilise ASSEMB.V doit etre supprimée).

Et on obtient la formule finale.

Pour voir les erreurs, vous pouvez retirer le filtre de la formule, soit

=LET(tbl;
REDUCE(0;EXCLURE(tSource;;1);LAMBDA(acc;v;
ASSEMB.V(acc;SIERREUR(
LET(
titre;INDEX(tSource[Titre];LIGNE(v)-LIGNE(tSource[#En-têtes]));
sigle;INDEX(EXCLURE(tSource[#En-têtes];;1);1;COLONNE(v)-COLONNE(tSource[Titre]));
MAKEARRAY(v;3;LAMBDA(r;c;SI.MULTIPLE(c;1;titre;2;sigle;3;TEXTE(SI(v>1;r;r-1);"00")))));
0))));
ASSEMB.V({"Titre"."Sigle"."Numéro"};tbl))

Et vous allez voir les "calculs intermédiaires".

Honnêtement c'est quelque chose qui demande du temps, à écrire et à comprendre. C'est tout à fait normal que ça paraisse compliqué.

Je ne saurai trop vous conseiller de tester une à une chacune des fonctions que vous ne connaissez pas pour bien les prendre en main. Cela vous permettra de décortiquer avec plus d'aisance ce gros pavé que je vous ai envoyé. Et puis, petit à petit vous allez réussir vous aussi à développer ce genre de formules. C'est beaucoup d'essai-erreur, ne croyez pas que je l'ai écrite d'un coup !

Bon courage

Merci pour toutes ces précisions, le plus dur reste l'assemblage du puzzle .

Mais dans l'ensemble j'ai compris vos explications.

Je me concentre dessus semaine prochaine et je posterai mon résultat.

J'y suis presque, j'ai finalement sortie le numéro de la matrice car j'ai trouvé plus simple de rédiger directement une condition dans la colonne M pour le calcul du numéro Je n'arrivait pas a obtenir le résultat souhaité par la matrice , j'ai donc mis cette formule que j'ai tiré sur toute la colonne

=SI(I6="";"";SI(SOMMEPROD((I:I=I6)*(K:K=K6))=1;0;SOMMEPROD(($I$6:I6=I6)*($K$6:K6=K6))))

Le seul problème qu'il me reste, c'est l'ordre de mes lignes, en effet l'accumulateur doit tester les valeurs à l'horizontal, j'aimerai que l'accumulateur lise en vertical de façon à avoir en premier tout mes document PROJ, puis tous mes document PF01, PF02...

J'avais essayer d'insérer une fonction de filtre qui classait mes document en fonction de l ordre alphabétique des PF mais du coup mes document projet se trouvaient à la fin ce qui ne correspond pas tout a fait a mon but final.

Voici me formule actuel:

=LET(tbl;
REDUCE(0;EXCLURE(Tableau2;0;3);LAMBDA(acc;v;
ASSEMB.V(acc;SIERREUR(
LET(PF;INDEX(EXCLURE(1:1;;3);COLONNE(v)-3);
titre;INDEX(EXCLURE(A:A;1;);LIGNE(v)-LIGNE(1:1));
sigle;INDEX(EXCLURE(B:B;1;);LIGNE(v)-LIGNE(1:1));Jalon;INDEX(EXCLURE(C:C;1;);LIGNE(v)-LIGNE(1:1));
MAKEARRAY(v;4;LAMBDA(r;c;SI.MULTIPLE(c;1;PF;2;titre;3;sigle;4;Jalon))));
0))));
ASSEMB.V({"PF"\"Titre"\"Sigle"\"Jalon"};
FILTRE(tbl;NON(ESTERREUR(PRENDRE(tbl;;-1))))))

pour avoir les documents dans l'ordre souhaité en conservant ma source dans sa forme actuel, je pense passer par un tableau intermédiaire pour transposer les donnés et adapter ma formule au tableau transposé. Je ne sais pas si il y a une autre solution.

Je n'ai pas compris comment fonctionne la fonction filtre avec la parti (PRENDRE(tbl;;-1)) mais dans tous les cas je la conserve précieusement dans ma formule car nécessaire pour avoir un tableau propre et juste.

image

il y a un autre point que je n'avais pas compris, c'est le ;1 surligné sur l'image dessous. celui la je ne l'ai pas conservé.

image

Bonne journée

je viens de voir que je pouvais simplifier un peu pour mes index:

INDEX(EXCLURE(1:1;;3);COLONNE(v)-3) -->INDEX(1:1;COLONNE(v))

j'évite l'étape intermédiaire de d'exclure les 3 premières colonne pour ensuite retrancher 3.

J'obtiens donc le même résultat avec le code suivant:

=LET(tbl;
REDUCE(0;EXCLURE(Tableau2;0;3);LAMBDA(acc;v;
ASSEMB.V(acc;SIERREUR(
LET(PF;INDEX(1:1;COLONNE(v));
titre;INDEX(A:A;LIGNE(v));
sigle;INDEX(B:B;LIGNE(v));
Jalon;INDEX(C:C;LIGNE(v));
MAKEARRAY(v;4;LAMBDA(r;c;SI.MULTIPLE(c;1;PF;2;titre;3;sigle;4;Jalon))));
0))));
ASSEMB.V({"PF"\"Titre"\"Sigle"\"Jalon"};
FILTRE(tbl;NON(ESTERREUR(PRENDRE(tbl;;-1))))))

Bonjour,

Félicitations, je vois que vous avez bien progressé. Pourriez-vous joindre le fichier correspondant ? Le tableau original ne correspond plus du tout.

Rechercher des sujets similaires à "generer tableau partir matrice"