Extraire une liste d'un tableau

Bonjour,

J'ai ma donnée initiale qui est sous forme d'un tableau avec en première colonne le code de différentes matières.

Les autres colonnes contiennent en en tête le nom d'enseignant.

Les valeurs dans le tableau (zero ou 1) indiquent si le prof enseigne ou pas dans cette matière.

Je souhaite créer extraire pour une matière donnée la listes des enseignants qui interviennent dans cette matière.

Je vous joins le fichier exemple qui montre le résultat souhaité

Merci d'avance!

Hplus

26exemple.xlsx (8.92 Ko)

Bonjour,

Ci-joint une proposition avec la fonction filtre.

24book2-2.xlsx (9.58 Ko)

Bonjour,

Un essai par Power Query, nativement installé dans ta version d'Excel

Le code M :

let
    Source = Excel.CurrentWorkbook(){[Name="Tableau1"]}[Content],
    ValNull = Table.ReplaceValue(Source,0,null,Replacer.ReplaceValue,List.Skip(Table.ColumnNames(Source))),
    UnPivot = Table.UnpivotOtherColumns(ValNull, {"Matière"}, "Attribut", "Valeur"),
    GroupBy = Table.Group(UnPivot, {"Matière"}, {{"Profs", each _[Attribut]}}),
    Final = Table.FromColumns( GroupBy[Profs], GroupBy[Matière])
in
    Final

Et le fichier

La base de données a été transformée en Tableau Structuré (nommé "Tableau1")

Pour mettre à jour, dans le ruban "Données", cliquer sur "Actualiser tout"

Bonne fin d'apm

13profs.xlsx (17.40 Ko)

Bonsoir à tous !

Une autre approche Power Query ?

let
  Source = Excel.CurrentWorkbook(){[Name = "tSource"]}[Content], 
  Traitt = Table.AddColumn(
    Source, 
    "Profs", 
    each 
      let
        r = _, 
        c = Record.FieldNames(r)
      in
        Text.Combine(List.Select(Record.FieldNames(r), (x) => Record.Field(r, x) = 1), ", ")
  )[[Matière], [Profs]]
in
  Traitt
image

Remarque : la source (tableau structuré) est nommée tSource.

Bonsoir à tous,

Une autre façon de faire pour le même résultat que JFL et le résultat de la requête de cousinhub intégrée au fichier.

15hplus.xlsx (22.19 Ko)

Re-,

Pop hop pop....

Je m'inscris en porte à faux....

Le demandeur veut un tableau "Matières", avec les noms des profs dessous...

Non mais....

Ha oui ! Je pensais que ça n'avait rien à faire là ces inscriptions

Aprés, il peut changer d'avis...

Bonsoir à tous de nouveau !

Pour adoucir la colère des Dieux :

let
  Source = Excel.CurrentWorkbook(){[Name = "tSource"]}[Content], 
  Traitt = Table.AddColumn(
    Source, 
    "Profs", 
    each 
      let
        r = _, 
        l = List.Select(Record.FieldNames(r), (x) => Record.Field(r, x) = 1)
      in
        l
  )[Profs], 
  Final = Table.FromColumns(Traitt, Source[Matière])
in
  Final

Ceci étant, notre ami n'a pas demandé à avoir l'intégralité des matières......

Merci à tous!

vu la simplicité de la formule avec filtre imbriqués je préfère ne pas attaquer le power query.

Mon besoin est un peu plus complexe car les matières ont des attributs et on peut être plus ou moins précis quand on les spécifient. En fonction du degré de précision la liste des profs concernés diminue.

Je joins une autre version de l'exemple : les lignes 13, 14 et 15 montrent ce que je souhaite avoir comme résultat en fonction du nombre d'information précisés..

Je cherche de mon coté aussi!

22exemple.xlsx (9.19 Ko)

merci encore

La fonction filtre est probablement plus simple à appréhender je vous l'accorde, mais au vu des résultats attendus et de l'augmentation de la complexité je pense que l'outil PQ est plus adapté à la demande, qui fait terriblement penser à des requetes SQL (SELECT * FROM matable WHERE Code matière = "MAT1")…

Si vous n'avez que 2 colonnes supplémentaires, les filtres sont encore possibles, mais PQ s'adapte beaucoup mieux à moyenne et grande échelle.

Bonjour à tous !

Une proposition "formule" en D13 :

=LET(
    mat; $A$2:$A$7;
    typ; $B$2:$B$7;
    lan; $C$2:$C$7;
    cm; A13;
    ct; B13;
    cl; C13;
    f; FILTRE($D$2:$I$7; (SI(ct = ""; typ <> ""; typ = ct)) * (mat = cm) * (SI(cl = ""; lan <> ""; lan = cl)));
    FILTRE($D$1:$I$1; PRODUITMAT(SEQUENCE(; LIGNES(f); ; 0); f) > 0)
)

A étirer vers le bas.

Salut JFL, très belle formule ! Je retire ce que j'ai dit. Par curiosité peux-tu m'expliquer la partie

MMULT(SEQUENCE(; ROWS(f); ; 0); f)

et plus particulièrement la séquence, partie sur laquelle je bloquais alors qu'elle permet de résoudre élégamment le problème. Merci :)

Bonjour à tous de nouveau !

La finalité de ce traitement est de produire un vecteur (1/0 ou vrai/faux) utilisé par la fonction FILTRE pour retourner le résultat attendu.

La fonction PRODUITMAT "retourne le produit de matrice de deux tableaux. Le résultat est une matrice comportant le même nombre de lignes que matrice1 et le même nombre de colonnes que matrice2".(Voir la documentation Microsoft ici !)

J'ai ajouté d'autres variables dans la formule afin de faciliter la vision du contenu.

=LET(
mat;$A$2:$A$7;
typ;$B$2:$B$7;
lan;$C$2:$C$7;
cm;A13;
ct;B13;
cl;C13;
f;FILTRE($D$2:$I$7;(SI(ct="";typ<>"";typ=ct))*(mat=cm)*(SI(cl="";lan<>"";lan=cl)));
seq;SEQUENCE(;LIGNES(f);;0);
prodmat;PRODUITMAT(SEQUENCE(;LIGNES(f);;0);f)>0;
resultat;FILTRE($D$1:$I$1;PRODUITMAT(SEQUENCE(;LIGNES(f);;0);f)>0);
prodmat
)

Dans cette configuration, la formule retournera le contenu de la variable "prodmat". A changer selon votre souhait.

Vous êtes des dieux d'excel!

Je préfère ne pas utiliser de VBA ou power query (que je ne connais pas) car le fichier est souvent exécuté dans le navigateur (fichier partagé sur un sharepoint).

Il est accédé par plusieurs utilisateurs en simultanés et je trouve qu'il y a bcp moins de conflits de sauvegardes quand il est ouvert dans le navigateur que dans l'application.

Merci encore pour votre précieuse aide

Bonjour à tous de nouveau !

Bien....

Je vous remercie de ce retour.

Rechercher des sujets similaires à "extraire liste tableau"