1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
Sub combinaison()
Dim Nb() As Variant, Combi() As Integer, B1 As Integer, b2 As Integer
Dim L As Integer, P As Integer, binvalue As String, c As Range
With Worksheets("Feuil1")
' récupère les valeur des xx chiffres
B1 = 1
For Each c In .Range("A2:A" & .Cells(Rows.Count, 1).End(xlUp).Row)
If c <> "" Then ReDim Preserve Nb(B1): Nb(B1) = c.Value: B1 = B1 + 1
Next
End With
'si le nombre de valeur n'est pas suffisant -> sortir
If B1 <= 5 Then
MsgBox "Pas assez de valeur pour effectuer le traitement"
Exit Sub
End If
'Si le nombre de combinaison dépasse la capacité de ligne de la feuille ->sortir
If Evaluate("=COMBIN(" & B1 & ",5)") > 65535 Then
MsgBox "trop de combinaison pour la feuille excel"
Exit Sub
End If
L = 0
ReDim Combi(4, 0)
'Boucle dans les possibilité binaire
'31 = 0000011111
'992= 1111100000
For B1 = 31 To NbMaxAverifier(UBound(Nb))
'conversion et inversion du résultat dec -> bin
binvalue = StrReverse(Dec2Bin(B1))
'si le résultat contient 5* "1"
If Len(Replace(binvalue, "0", "")) = 5 Then
'redimensionne le tableau
ReDim Preserve Combi(4, L) 'Ligne dans le tableau
P = 0 ' colonne dans le tableau
'Boucle pour trans former les "1" en valeur de 1 à 10
For b2 = 1 To Len(binvalue)
'si = "1" on met la valeur correspondant au 10 nombres dans le tableau
If Mid(binvalue, b2, 1) = "1" Then
Combi(P, L) = Nb(b2)
P = P + 1
End If
Next
L = L + 1
End If
Next
'recopie dans la feuille du tableau
Worksheets("Feuil2").Range("A2").Resize(UBound(Combi, 2) + 1, UBound(Combi, 1) + 1) = Application.Transpose(Combi)
End Sub
'fonction de conversion Decimal en binaire
Function Dec2Bin(ByVal n As Long) As String
Do Until n = 0
If (n Mod 2) Then Dec2Bin = "1" & Dec2Bin Else Dec2Bin = "0" & Dec2Bin
n = n \ 2
Loop
End Function
Function NbMaxAverifier(NbValeurs As Integer)
Dim boucle As Integer
NbMaxAverifier = 31
For boucle = 1 To NbValeurs - 5
NbMaxAverifier = NbMaxAverifier * 2
Next
End Function |