Function GrdeVal(TS As Range, Mois&, Rang&)
Dim t, j&, i&, n&, coll As New Collection
t = TS.Value: ReDim r(1 To 1) ' t=array des valeur du TS, r futur array des valeurs sans doublon
For j = 1 To UBound(t, 2) ' boucle sur les colonnes de t
If IsDate(t(1, j)) Then ' si l'en-tête (1ère ligne) de la colonne j est une date
If Month(t(1, j)) = Mois Then ' si l'en-tête du mois a pour numéro de mois : Mois
On Error Resume Next ' en cas d'erreur, on continue l'exécution
For i = 2 To UBound(t) ' boucle sur les élément de la colonne
' si la valeur n'est pas vide et est numérique, on essaye de l'ajouter à la collection
If t(i, j) <> "" Then If IsNumeric(t(i, j)) Then n = coll.Count: coll.Add t(i, j), CStr(t(i, j))
' si le nombre d'éléments de coll avant ajout est différent du nombre d'éléments de coll après ajout
' alors t(i,j) n'était pas un doublon et on l'ajoute au tableau r des éléments sans doublon
If n <> coll.Count Then ReDim Preserve r(1 To coll.Count): r(coll.Count) = t(i, j)
Next i
End If
End If
Next j
' r contient l'ensemble des valeurs sans doublon - on en prend la valeur d'index Rang
If Rang <= 0 Then GrdeVal = Application.Small(r, Abs(Rang)) Else GrdeVal = Application.Large(r, Rang)
' si GrdeVal est une erreur alors c'est que la valeur d'index Rang n'existe pas => on retourne ""
If IsError(GrdeVal) Then GrdeVal = ""
End Function