La fonction rendue plus générique :
Function ALEAPROBADEF(NbrProb As Range)
Dim NbProb, Prob, TProb%, i%, x%
Application.Volatile
If NbrProb.Rows.Count = 2 Then
NbProb = NbrProb.Value
ElseIf NbrProb.Columns.Count = 2 Then
NbProb = WorksheetFunction.Transpose(NbrProb.Value)
Else
ALEAPROBADEF = CVErr(xlErrNA): Exit Function
End If
NbProb(2, UBound(NbProb, 2)) = CInt(NbProb(2, UBound(NbProb, 2)))
For i = UBound(NbProb, 2) - 1 To 1 Step -1
NbProb(2, i) = NbProb(2, i + 1) + CInt(NbProb(2, i))
Next i
TProb = NbProb(2, 1)
Prob = WorksheetFunction.Index(NbProb, 2, 0)
Randomize
x = Int(TProb * Rnd + 1)
i = WorksheetFunction.Match(x, Prob, -1)
ALEAPROBADEF = NbProb(1, i)
End Function
On lui passe en argument une plage sur 2 lignes ou 2 colonnes listant les nombres et leur probabilité.
Si la plage ne comporte pas 2 lignes ou 2 colonnes, la fonction renverra : #N/A.
Les nombres peuvent être remplacés par des lettres ou n'importe quelles autres indications.
Par contre les probabilités doivent être des nombres entiers (nb de chances affectées à chaque valeur d'être tirée sur le total des chances de toutes les valeurs). Les probabilités sont le cas échéant converties en entiers...
Cordialement.