Function MoyBaseNombreMinimum(Base As Range, Nombre&, Minimum&, Ligne As String, Code&)
Dim t, nmax&, i&, j&, i1&, i2&, ech As Boolean, aux, combien&, som
t = Base.Value 'lecture des données de la base dans le tableau t
' combien de lignes répondent aux deux critères Ligne et Code => nmax
' on déplace les valeurs de la 3ème colonne vers le haut du tableau t
For i = 1 To UBound(t)
If t(i, 1) = Ligne And t(i, 2) = Code Then
nmax = nmax + 1
t(nmax, 3) = t(i, 3)
End If
Next i
' si le minimum n'est pas atteint on quitte
If nmax < Minimum Then MoyBaseNombreMinimum = "": Exit Function
' tri de la 3ème colonne de t du plus petit au plus grand de la ligne 1 à nmax
Do
ech = False
For i = 1 To nmax - 1
'si la valeur de la ligne i+1 est <= à celle de la ligne i, on inverse les lignes i et i+1
If t(i + 1, 3) < t(i, 3) Then ech = True: aux = t(i, 3): t(i, 3) = t(i + 1, 3): t(i + 1, 3) = aux
Next i
Loop Until Not ech 'et cela jusqu'à ce qu'aucun échange ne ligne ne se produise plus
'sinon on repart pour un tour
' ne garder que les Nombre médians
' i1 est la ligne inférieure des Nombre valeurs à moyenner
' i2 est la ligne supérieure des Nombre valeurs à moyenner
i1 = 1: i2 = nmax: combien = nmax
' on va retirer alternativement une petite valeur (i1=i1+1) puis une grande valeur (i2=i2-1)
Do
i1 = i1 + 1: combien = combien - 1
If combien = Nombre Then Exit Do
i2 = i2 - 1: combien = combien - 1
If combien = Nombre Then Exit Do
Loop
'calcul de la somme des Nombre valeurs médianes
For i = i1 To i2: som = som + t(i, 3): Next
'calcul de leur moyenne
MoyBaseNombreMinimum = som / Nombre
End Function
' c'est la version optimiste - on commence par retirer le plus petit, puis le plus grand,
' puis le plus petit, puis... jusqu'à ce qu'il ne reste que Nombre valeurs.
' Pour la version pessimiste remplacer:
' i1 = i1 + 1: combien = combien - 1
' If combien = Nombre Then Exit Do
' i2 = i2 - 1: combien = combien - 1
' If combien = Nombre Then Exit Do
' par:
' i2 = i2 - 1: combien = combien - 1
' If combien = Nombre Then Exit Do
' i1 = i1 + 1: combien = combien - 1
' If combien = Nombre Then Exit Do