Tableau croisé dynamique

EXPOSE DU PROBLEME :

j'ai un tableau Excel avec 8 colonnes (le nom et le prénom de l'élève + des enseignements numérotés de 1 à 7). Il y a une ligne par élève et pour chaque cellule "enseignement" une valeur.

Par exemple :

Elève 1 : allemand, anglais, arabe, latin, SES, maths, physiques

Elève 2 : anglais, russe, espagnol, grec, maths, informatique, SVT

On cherche à sortir toutes les combinaisons existantes (par rapport à nos paramètres, il y en a 218 possibles) avec le nombre d'élèves ayant une combinaison semblable (attention, pour ce faire, seuls les enseignements sont à prendre compte. L'ordre dans lequel les élèves les ont choisis n'a ici pas d'importance) et avec la possibilité de voir quels sont les élèves concernés.

Par exemple :

L'élève 1 qui a choisi allemand, anglais, arabe, latin, SES, maths, physiques devra ressortir dans la même combinaison que l'élève 45 qui aura choisi anglais, allemand, arabe, latin, maths, SES, physiques (car les enseignements sont les mêmes, seul l'ordre de choix est différent).

En revanche, à partir du moment où il existe une seule différence sur un enseignement, ils n'appartiennent plus à la même catégorie.

Est-ce que quelqu'un aurait la solution miracle ?

Un grand merci par avance.

Bonjour,

j'ai utilisé une fonction perso pour définir les choix d'enseignements,

dit-moi si ça convient ?

re,

j'ai modifié la fonction pour remplacer les chiffres par des lettres,

pour augmenter le nombre d'enseignements différent.

Function classe(plage As Range) As String
Dim AL1 As Object, n As Integer, i As Integer, v As String
Dim cl, r

cl = Range("enseignements").Value

Set AL1 = CreateObject("System.Collections.ArrayList")

For i = 1 To plage.Count
    n = Application.Match(plage(i), cl, 0)
    AL1.Add UCase(Chr(n + 96))
Next

AL1.Sort
r = AL1.Toarray()

For i = LBound(r) To UBound(r)
    v = v & r(i)
Next
classe = v
End Function

Édit:

fichier avec la nouvelle fonction

Bonjour à tous

Belle fonction i20100

Une solution PowerQuery, en add on sur 2010 et 2013, intégré à partirde 2016

re,

merci 78chris,

j'ai fait un autre version en doublant le nombre de caractères des code, on pourrait tripler et même quadrupler les caractères,

Function classe(plage As Range) As String
Dim AL1 As Object, i As Integer, n As Integer, v As String
Dim r

Set AL1 = CreateObject("System.Collections.ArrayList")

For i = 1 To plage.Count
    n = Application.Match(plage(i), Range("enseignements").Value, 0)
    AL1.Add Range("Code")(n) & "-"
Next

AL1.Sort
r = AL1.Toarray()

For i = LBound(r) To UBound(r)
    v = v & r(i)
Next
classe = Left(v, Len(v) - 1)
End Function
Rechercher des sujets similaires à "tableau croise dynamique"