Récupérer toutes les combinaisons d'un intervalle d'entier défini par VBA

Bonsoir,

Je cherche à récupérer toutes les combinaisons possibles pour un intervalle du type : [237-->242]

dans mon exemple, la combinaison peut aller jusque 5 termes (ex:237/237/237/242/242). Je pars dans l'idée que 3 termes forment la combinaison, les 2 derniers termes prennent la valeur maximale de l'intervalle par défaut.

je sais qu'il existe ((242+1)-237)² soit 216 possibilités ou combinaisons.

Cependant, je rencontre des difficultés à retranscrire ds un code rapide (avec des variables tableaux sans passer par des retranscription sur Feuille) la récupération de toutes les combinaisons. Existe-t-il svp un seul algo (avec des boucles imbriquées ??) qui permet de récupérer toutes les combinaisons ?

En Fichier un exemple.

Voici un extrait de code que j'ai débuté mais je sèche :

Sub Combi()
Dim Pat(), Etal()
Imax = 242
Imin = 237
n = 3 ' pour définir les boucles = nombre de PS à modifier
NbV = ((Imax + 1) - Imin) ^ n 'nbre total de combinaisons
q = ((Imax + 1) - Imin) 'pour définir les boucles = intervalle d'analyse
p = (Imax - Imin) 'pour calcul de la différence entre q et p
Seq = NbV / q 'donne le nbre de séquences
'MsgBox q & " ||||| " & NbV
'ReDim Pat(1 To NbV, 1 To 6)
'For i = 1 To NbV ' ex:9 ici
    'For k = 1 To n ' ex:2 ici
       'For j = 1 To q ' ex:3 ici
         'Pat(i, 1) = i
         'Pat(i, j + 1) = Imin + (j - 1)
         'Pat(i, k + 1) = Imin + (j - 1)
         'MsgBox i & " |||||| " & j
       'Next
    'Next
'Next
'Feuil1.Range("A10").Resize(UBound(Pat, 1), UBound(Pat, 2)) = Pat

ReDim Etal(1 To q, 1 To 2)
For i = 1 To q 'on aborde le prob autrement
     Etal(i, 1) = i
     Etal(i, 2) = Imin + (i - 1) ' on récupère une séquence en tableau
Next
For i = 1 To NbV
    If i Mod (q) = 0 Then 'donne 3,6,9 pour i
        'Feuil1.Range("A" & i - p).Resize(UBound(Etal, 1), UBound(Etal, 2)) = Etal 'on récupère les séquences à la chaine (n le plus élevé= colonne la plus à droite au niveau de l'intervalle d'analyse)
    End If
Next
'pour l'étalement
'q^k k étant une variable de boucle variant de 1 à n le plus élevé

ReDim Pat(1 To NbV, 1 To 6)
For k = 1 To n
    For j = 1 To q ^ k 'donne ds notre exemple : 6^1=6 ; 6^2=36 ; 6^3=216
       For i = 1 To NbV

        'For i = 1 To q  '(q ^ k) / q définit le nbre de valeurs identiques pour chaque n combinaisons
            'Pat(j, (n + 2) - k) = Imin
        'Next
    Next
Next

'Feuil1.Range("E1").Resize(UBound(Pat, 1), UBound(Pat, 2)) = Pat 'pour test

End Sub

Merci d'avance,

je n'ai pas compris le système des rangs et tout ça.

Alors un essai avec au minimum 3 chiffres identiques, on peut changer la partie de la macro à vos propres spécifications

Sub Combinations()
     i1 = 237     'votre premier chiffre
     i2 = 242     'votre dernier chiffre
     i3 = 5     'nombre de chiffre
     i4 = 3     '3 chiffres identique

     t = Timer

     ReDim aux(1 To 5)
     For i = 1 To UBound(aux): aux(i) = i1: Next
     ReDim out(1 To 100000, 1 To 1)

     Do
          For i = 1 To UBound(aux)     'controle pour voir s'il y a au moins 3 chiffres identique
               nmb = 0
               For j = i To UBound(aux)
                    nmb = nmb - (aux(i) = aux(j))
                    b = (nmb = i4)
                    If b Then Exit For
               Next
               If b Then Exit For
          Next

          If b Then     'contrôle est positif = aujouter combinaison au résultat
               ptr = ptr + 1
               out(ptr, 1) = Join(aux, "-")
          End If

          aux(1) = aux(1) + 1
          If aux(1) > i2 Then
               aux(1) = i1
               For i = 2 To UBound(aux)
                    aux(i) = aux(i) + 1
                    If aux(i) <= i2 Then
                         Exit For
                    Else
                         If i <> UBound(aux) Then aux(i) = i1
                    End If
               Next
          End If
     Loop While ptr < UBound(out) And aux(UBound(aux)) <= i2

     With Range("AA1")
          .EntireColumn.ClearContents
          .Resize(Application.Min(ptr, UBound(out))).Value = out
          .EntireColumn.AutoFit
     End With

     MsgBox Format(ptr, "#,###") & " combinaisons en " & Format(Timer - t, "0.00\s")
End Sub

merci pour le retour.

concernant les rangs et tout ça : je recherche toutes les combinaisons possibles avec un intervalle variable (par exemple de 237 à 242) en les associant n fois à la suite (par exemple n=3) sans dépasser 5 toutefois, si n<5 les derniers termes sont automatiquement = à la valeur max de l'intervalle.

tjrs avec mon exemple : il existe la combinaison 237/237/237/242/242 mais aussi 237/237/238/242/242 et puis 237/237/239/242/242 et ainsi de suite.... jusqu'à obtenir 216 combinaisons.

Dans mon 1er post, il est vrai que je me suis trompé sur l'exposant :

pour un intervalle de 237 à 242 il existe 216 combinaisons car 6^3=216 Combinaisons.

Dans ton fichier, je ne suis pas accoutumé aux formulations avec plusieurs "=" ds la même ligne, peux tu expliciter stp ?

nmb = nmb - (aux(i) = aux(j))
b = (nmb = i4)

je constate qu'il y a 1656 Combinaisons alors que tu précises 3 chiffres identiques (i4) (et donc uniquement 2 termes variables ??) mais vu les résultats il y a plus de 2 termes qui varient et du coup je ne comprends pas pourquoi 1656 combinaisons (même en vérifiant avec 4 termes sur 5 qui varient : 6^4=1296 ; différence=360 ).

Sinon ton code est impressionnant.

colonne AA, AE et AI, je pensais que le nombre serait 6^2=36, 6^3=216 et 6^4=1.296, mais apparament pour la colonne AI, il n'y a que 88

Bjr,

De retour du taf, votre proposition est tout à fait satisfaisante (avec en prime, à 1ère vue, la gestion d'une contrainte supplémentaire = le dénivelé = intérêt uniquement pour les combinaisons croissantes).

Merci.

apparament pour la colonne AI, il n'y a que 88

88 quoi ? j'avoue ne pas comprendre...

oublie ce 88, je regardais à votre colonne initiale ....

Des petits modifs pour améliorer. (nombre >1.048.500, etc)

Rechercher des sujets similaires à "recuperer toutes combinaisons intervalle entier defini vba"