Macro à corriger : combinaisons de 5 avec nombres de 1 à 52

Bonjour,

Je cherche à calculer la liste des combinaisons de 5 chiffres parmi 52 éléments (chiffres de 1 à 52).

Je ne veux pas de permutations.

Et je ne veux pas qu'un même chiffre puisse aparaître plusieurs fois dans une combinaison : pas de 1-1-1-1-1, ni de 1-1-2-3-4 etc.

Je pense que cette macro fait l'affaire :

Sub combinaisons()

ligne = 2
For i = 1 To 48
For j = i + 1 To 49
For k = j + 1 To 50
For l = k + 1 To 51
For m = l + 1 To 52
Cells(ligne, 1) = i
Cells(ligne, 2) = j
Cells(ligne, 3) = k
Cells(ligne, 4) = l
Cells(ligne, 5) = m
ligne = ligne + 1
Next
Next
Next
Next
Next

End Sub

... sauf que le nombre de résultats (environ 2.700.000) excède le nombre de ligne max dans excel 2007.

Donc je voudrais corriger cette macro pour que les résultats s'affichent sur plusieurs lignes ou plusieurs feuillets.

Merci de votre aide !

Bonjour,

Voici :

Sub combinaisons()

    Dim I As Integer
    Dim J As Integer
    Dim K As Integer
    Dim L As Integer
    Dim M As Integer
    Dim Lig As Long
    Dim Col As Integer

    Lig = 2
    Col = 1

    For I = 1 To 48: For J = I + 1 To 49: For K = J + 1 To 50: For L = K + 1 To 51: For M = L + 1 To 52

        Cells(Lig, Col) = I
        Cells(Lig, Col + 1) = J
        Cells(Lig, Col + 2) = K
        Cells(Lig, Col + 3) = L
        Cells(Lig, Col + 4) = M

        Lig = Lig + 1

        If Lig = Rows.Count + 1 Then: Lig = 2: Col = Col + 6

    Next M, L, K, J, I

End Sub

Je te conseille de prendre l'habitude de déclarer tes variables et de bien les typer. Pour ça, tu peux obliger la déclaration explicite de ces dernières avec "Option Explicit" en cochant la case "Déclaration des variables obligatoire" dans "Outils"--->"Options..."' onglet "Editeur"

Ca marche pour les combinaisons. Merci Theze !

Si je veux inclure les permutations à présent, quelqu'un a une idée de la macro?

Je crois que ça doit faire environ 98 millions de résultats...

[quote="à propos des permutations, nicopat"]Je crois que ça doit faire environ 98 millions de résultats... [/quote]

attention : avec ta version d'Excel, tu as seulement 1 million 48 mille 576 lignes !!!

dhany

[quote=dhany post_id=660427 time=1529167383 user_id=51200]

[quote="à propos des permutations, nicopat"]Je crois que ça doit faire environ 98 millions de résultats... [/quote]

attention : avec ta version d'Excel, tu as seulement 1 million 48 mille 576 lignes !!!

dhany

[/quote]

Bonjour dhany,

oui mais on peut étaler les résultats sur plusieurs colonnes (comme la macro de Theze le fait), voire plusieurs feuillets.

Sauf que je ne sais pas comment code tout ça...

Re,

Si je veux inclure les permutations à présent, quelqu'un a une idée de la macro?

Tu veux quoi comme permutation/combinaisons ? comme ceci par exemple 11111, 11112, ....., .....,12111, ..... ?

Re,

Si je veux inclure les permutations à présent, quelqu'un a une idée de la macro?

Tu veux quoi comme permutation/combinaisons ? comme ceci par exemple 11111, 11112, ....., .....,12111, ..... ?

non, je ne veux pas qu'un même chiffre puisse aparaître plusieurs fois dans une combinaison : pas de 1-1-1-1-1, ni de 1-1-2-3-4 etc.

par contre, à présent, je veux permettre 1-2-3-4-5, mais aussi 5-4-3-2-1, et toutes les variations...

Bonjour,

Et bien inverses l'affectation des valeurs :

Cells(Lig, Col) = M
Cells(Lig, Col + 1) = L
Cells(Lig, Col + 2) = K
Cells(Lig, Col + 3) = J
Cells(Lig, Col + 4) = I

Bonjour,

Et bien inverses l'affectation des valeurs :

Cells(Lig, Col) = M
Cells(Lig, Col + 1) = L
Cells(Lig, Col + 2) = K
Cells(Lig, Col + 3) = J
Cells(Lig, Col + 4) = I

Bonjout Theze,

sauf erreur de ma part, ça ne marche pas.

Ca affiche encore les combinaisons (elles sont simplement écrites dans l'ordre inverse), mais pas les permutations.

Pour que mon besoin soit bien clair : à présent, je veux par exemple permettre 1-2-3-4-5, mais aussi 5-4-3-2-1, 5-2-4-2-1, 2-4-3-5-1, et toutes les variations...

Je n'ai pas trouvé de solution, mais je crois que je n'ai plus besoin des permutations. Merci à tous pour votre aide.

Bonsoir,

Laissons de côté la question de l'intérêt de lister des combinaisons et encore plus des permutations... Pour passer des combinaisons aux permutations, il faut considérer que chaque combinaison génère un certain nombre de permutations.

Une combinaison de 5 éléments génère 120 permutations des mêmes 5 éléments. D'un point de vue pratique, ce qu'il convient alors de calculer ce sont les permutations correspondant à une combinaison donnée.

Voilà une façon de faire :

Function GénèreTT(xx, x)
    Dim TT(), T(), i%, z%
    z = Len(CStr(xx))
    ReDim TT(z)
    TT(0) = CStr(xx) & x
    TT(z) = x & CStr(xx)
    If z > 1 Then
        ReDim T(1, z - 2)
        For i = 0 To z - 2
            T(0, i) = Left(CStr(xx), z - i - 1)
            T(1, i) = Right(CStr(xx), i + 1)
        Next i
        For i = 1 To z - 1
            TT(i) = T(0, i - 1) & x & T(1, i - 1)
        Next i
    End If
    GénèreTT = TT
End Function

Function Perm5(cb)
    Dim A, zz, TT, P(1 To 120), i%, z%, j%
    If Len(CStr(cb)) <> 5 Then Exit Function
    P(1) = Mid(CStr(cb), 1, 1)
    zz = Array(60, 20, 5, 1)
    For z = 0 To 3
        A = Mid(CStr(cb), z + 2, 1)
        For i = 1 To 120 Step zz(z)
            If P(i) <> "" Then TT = GénèreTT(P(i), A): j = 0
            P(i) = TT(j): j = j + 1
        Next i
    Next z
    Perm5 = P
End Function

La fonction Perm5 renvoie un tableau de 120 éléments correspondant aux permutations d'un ensemble de 5 éléments. Elle utilise une fonction secondaire pour composer progressivement le tableau des permutations.

Une façon de l'utiliser :

Sub TestPermut5()
    Dim permut
    permut = Perm5(12345)
    ActiveSheet.Range("A1").Resize(, 120).Value = permut
End Sub

Cette macro test récupère le tableau de permutations de la combinaison 12345 et l'affecte sur la ligne 1 de la feuille active. Le tableau de permutation est horizontal, si on le veut verticalement, il suffit donc de le transposer.

On voit donc qu'une macro parcourant des combinaisons de façon à fournir pour chacune les permutations qui lui sont liées pourra le faire...

Sortir les 120 permutations d'une combinaison reste une opération de taille très raisonnable, mais le nombre de permutations progressant de façon rapide, on atteint vite les centaines de millions...

Cordialement.

bonjour à tous

à quoi peut bien servir d'afficher des telles suites de nombres

Bonsoir,

Laissons de côté la question de l'intérêt de lister des combinaisons et encore plus des permutations... Pour passer des combinaisons aux permutations, il faut considérer que chaque combinaison génère un certain nombre de permutations.

Une combinaison de 5 éléments génère 120 permutations des mêmes 5 éléments. D'un point de vue pratique, ce qu'il convient alors de calculer ce sont les permutations correspondant à une combinaison donnée.

Voilà une façon de faire :

Function GénèreTT(xx, x)
    Dim TT(), T(), i%, z%
    z = Len(CStr(xx))
    ReDim TT(z)
    TT(0) = CStr(xx) & x
    TT(z) = x & CStr(xx)
    If z > 1 Then
        ReDim T(1, z - 2)
        For i = 0 To z - 2
            T(0, i) = Left(CStr(xx), z - i - 1)
            T(1, i) = Right(CStr(xx), i + 1)
        Next i
        For i = 1 To z - 1
            TT(i) = T(0, i - 1) & x & T(1, i - 1)
        Next i
    End If
    GénèreTT = TT
End Function

Function Perm5(cb)
    Dim A, zz, TT, P(1 To 120), i%, z%, j%
    If Len(CStr(cb)) <> 5 Then Exit Function
    P(1) = Mid(CStr(cb), 1, 1)
    zz = Array(60, 20, 5, 1)
    For z = 0 To 3
        A = Mid(CStr(cb), z + 2, 1)
        For i = 1 To 120 Step zz(z)
            If P(i) <> "" Then TT = GénèreTT(P(i), A): j = 0
            P(i) = TT(j): j = j + 1
        Next i
    Next z
    Perm5 = P
End Function

La fonction Perm5 renvoie un tableau de 120 éléments correspondant aux permutations d'un ensemble de 5 éléments. Elle utilise une fonction secondaire pour composer progressivement le tableau des permutations.

Une façon de l'utiliser :

Sub TestPermut5()
    Dim permut
    permut = Perm5(12345)
    ActiveSheet.Range("A1").Resize(, 120).Value = permut
End Sub

Cette macro test récupère le tableau de permutations de la combinaison 12345 et l'affecte sur la ligne 1 de la feuille active. Le tableau de permutation est horizontal, si on le veut verticalement, il suffit donc de le transposer.

On voit donc qu'une macro parcourant des combinaisons de façon à fournir pour chacune les permutations qui lui sont liées pourra le faire...

Sortir les 120 permutations d'une combinaison reste une opération de taille très raisonnable, mais le nombre de permutations progressant de façon rapide, on atteint vite les centaines de millions...

Cordialement.

Super MFerrand, merci !

Rechercher des sujets similaires à "macro corriger combinaisons nombres"