Function ListeMatières(Xetudiant, plageEtudiant As Range, PlageMatieres As Range)
'La fonction retourne toujours un tableau en ligne
Dim tEtu, tMat, n&, i&, j&, res, nres&, x
On Error Resume Next: n = Application.Match(Xetudiant, plageEtudiant.Rows(1), 0): On Error GoTo 0
'si étudiant inconu
If n = 0 Then ReDim tres(1 To 1, 1 To 1): tres(1, 1) = "": ListeMatières = tres: Exit Function
'lecture des valeurs des deux plages
tEtu = plageEtudiant.Columns(n): tMat = PlageMatieres.Value
'on parcourt le tableau des matières. si la valeurs n'est pas vide
'ainsi que la valeur de la colmonne de l'étudiant alors on retient la valeur
For j = 1 To UBound(tMat, 2)
For i = 2 To UBound(tMat)
If tMat(i, j) <> "" Then
If tEtu(i, 1) <> "" Then
'on concatène la matière à res (sauf si la matière est déjà au sein de tres)
If InStr(res, tMat(1, j)) = 0 Then
nres = nres + 1: res = res & ";" & tMat(1, j)
Exit For 'inutile de poursuivre dans la colonne, la matière vient d'être retenue
End If
End If
End If
Next i
Next j
If res <> "" Then res = Mid(res, 2)
Select Case nres
Case 0 'aucune matière
ReDim tres(1 To 1, 1 To 1)
tres(1, 1) = ""
Case 1 'une seule matière
ReDim tres(1 To 1, 1 To 1)
tres(1, 1) = res
Case Else ' 2 matières et plus
ReDim tres(1 To 1, 1 To nres): j = 0
For Each x In Split(res, ";"): j = j + 1: tres(1, j) = x: Next
End Select
ListeMatières = tres
End Function