'----------------------------------------------------------------------------------------------------------------
'Nième combinaisons de b éléments pris parmis a éléments*********************************************************
'Input : a, b, n*************************************************************************************************
'Output : chaine combinaison*************************************************************************************
'Option séparateur de la chaîne si différent de ";"**************************************************************
'----------------------------------------------------------------------------------------------------------------
Function CmbNth(ByVal a&, ByVal b&, ByVal n#, Optional Separateur) As Variant
Dim Tb&(), Sp$, Ub&, i&
Tb = CmbNthTab(a, b, n)
Ub = UBound(Tb)
If Ub > 0 Then
If Not IsMissing(Separateur) And Len(CStr(Separateur)) > 0 Then Sp = Left(CStr(Separateur), 1) Else Sp = ";"
CmbNth = Tb(1)
For i = 2 To Ub: CmbNth = CmbNth & Sp & Tb(i): Next i
Else
CmbNth = CVErr(xlErrNum)
End If
End Function
'----------------------------------------------------------------------------------------------------------------
'Nième combinaisons de b éléments pris parmis a éléments*********************************************************
'Input : a, b, n*************************************************************************************************
'Output : tableau (0 to b) avec tb(0)=0**************************************************************************
'Rem : ubound(tb)=0 si erreur ***********************************************************************************
'----------------------------------------------------------------------------------------------------------------
Function CmbNthTab(ByVal a&, ByVal b&, ByVal n#) As Long()
Dim Tb&(), i&, x#, d&
On Error GoTo ErrTrp
If n < 1 Or b < 1 Or a < 1 Or b > a Then
ReDim Tb(0)
ElseIf n > CmbNb(a, b) Then
ReDim Tb(0)
Else
ReDim Tb(b)
Do
d = d + 1
x = 0
For i = a - 1 - Tb(d - 1) To b - d Step -1
x = Round(x + CmbNb(i, b - d))
If Not n > x Then Exit For
Next i
Tb(d) = a - i
n = Round(n - (x - CmbNb(i, b - d)))
Loop Until d = b
End If
CmbNthTab = Tb
Exit Function
ErrTrp:
On Error GoTo 0
ReDim Tb(0)
CmbNthTab = Tb
End Function
'----------------------------------------------------------------------------------------------------------------
'Combinaison aléatoire de b éléments pris parmis a éléments******************************************************
'Input : a, b****************************************************************************************************
'Output : chaine combinaison*************************************************************************************
'Option séparateur de la chaîne si différent de ";"**************************************************************
'----------------------------------------------------------------------------------------------------------------
Function CmbRnd(ByVal a&, ByVal b&, Optional Separateur) As String
Dim Tb&(), d#, Sp$, i&
Application.Volatile
On Error GoTo ErrTrp
d = CmbNb(a, b)
Randomize
Tb = CmbNthTab(a, b, Int(d * Rnd) + 1)
If Not IsMissing(Separateur) And Len(CStr(Separateur)) > 0 Then Sp = Left(CStr(Separateur), 1) Else Sp = ";"
CmbRnd = Tb(1)
For i = 2 To UBound(Tb): CmbRnd = CmbRnd & Sp & Tb(i): Next i
Exit Function
ErrTrp:
On Error GoTo 0
CmbRnd = CVErr(xlErrNum)
End Function