VBA - combinaisons n chiffres x iterations
Bonjour,
Je voudrais réaliser une macro dans une variable tableau permettant de générer les combinaisons possibles de n chiffres sur x itérations. Ces 2 valeurs seront renseignées au début de la macro.
Je m'explique par un exemple être plus concret.
2 chiffres & 3 itérations --
1 1 1
2 1 1
1 2 1
2 2 1
1 1 2
2 1 2
1 2 2
2 2 2
3 chiffres & 2 itérations --
1 1
2 1
3 1
1 2
1 3
2 2
2 3
3 2
3 3
J'ai passé du temps sur cette macro, mais impossible de la réaliser et encore moins de la rendre paramétrable en fonction du nombres de chiffres et du nombres d'itérations.
Pour un gain de temps, je désire la créer dans une variable tableau et la transférer ensuite dans une feuille Excel.
Un grand merci pour votre aide ...
bonsoir
j'avais proposé il y a quelque temps cette fonction personnalisée
Function cvntocomb(n, bs, lg) As String
' les paramètres
' n =numéro de la combinaison à générer
' bs =valeurs possibles pour produire une combinaison
' lg = longueur de la combinaison à générer
' pour une combinaison le nombre de combinaisons possibles est donné par (nombre de valeurs possibles ^ longueur)
' =cvntocomb(155,"1234",4) donne comme résultat 3234
' =cvntocomb(1255,"ABCDEFGHIJKLMNOPQRSTUVWXYZ",4) donne comme résultat ABWH
'=cvntocomb(0;"AB";3) donne AAA
'=cvntocomb(1;"AB";3) donne AAB
'=cvntocomb(2;"AB";3) donne ABA
'=cvntocomb(3;"AB";3) donne ABB
'=cvntocomb(4;"AB";3) donne BAA
'=cvntocomb(5;"AB";3) donne BAB
'=cvntocomb(6;"AB";3) donne BBA
'=cvntocomb(7;"AB";3) donne BBB
'=cvntocomb(8;"AB";3) donne numéro de combinaison dépasse la limite de 7
'
b = Len(bs)
If b < 2 Then cvntocomb = "le nombre de valeurs possibles doit être supérieur à 1": Exit Function
If n >= b ^ lg Then cvntocomb = "numéro de combinaison dépasse la limite de " & (b ^ lg) - 1: Exit Function
q = n
While q > 0
r = q Mod b
l = Mid(bs, r + 1, 1) & l
q = Int(q / b)
Wend
cvntocomb = String(lg - Len(l), Left(bs, 1)) & l
End Function
tu peux l'appeler à partir de vba
Sub test1()
' valeur contient la liste des N chiffres possibles
valeur = "1234"
' position contient le nombre "d'itérations"
position = 4
' nombre = numéro de la combinaison en cours
nombre = 1
' basev nombre de valeurs possibles
basev = Len(valeur)
' max = nombre de combinaisons possibles
Max = basev ^ position
' on adapte les dimensions du tableau
ReDim t(Max, position)
' on lance la procédure récursive
For i = 0 To Max - 1
q = cvntocomb(i, valeur, position)
For j = 1 To position
t(i + 1, j) = Mid(q, j, 1)
Next j
Next i
' on copie le tableau résultant dans les cellules excel en A1
Range(Cells(1, 1), Cells(Max, position)) = t
End Subrebonsoir,
une autre solution avec uen procédure récursive.
Option Base 1
Public t(), valeur, position, nombre, basev, Max
Sub test()
' valeur contient la liste des N chiffres possibles
valeur = "1234"
' position contient le nombre "d'itérations"
position = 4
' nombre = numéro de la combinaison en cours
nombre = 1
' basev nombre de valeurs possibles
basev = Len(valeur)
' max = nombre de combinaisons possibles
Max = basev ^ position
' on adapte les dimensions du tableau
ReDim t(Max, position)
' on lance la procédure récursive
combine (1)
' on copie le tableau résultant dans les cellules excel en A1
Range(Cells(1, 1), Cells(Max, position)) = t
End Sub
Sub combine(niveau)
' pour chaque position, on lance une boucle pour attribuer toutes les valeurs possibles
For i = 1 To Len(valeur)
t(nombre, niveau) = Mid(valeur, i, 1)
' y a-t-il encore une position à générer
If niveau < position Then
' on passe à la position suivante
combine (niveau + 1)
ElseIf niveau = position Then
' toutes les positions pour la combinaison en cours sont remplies, on passe à la combinaison suivante
nombre = nombre + 1
If nombre <= Max Then
For j = 1 To niveau
t(nombre, j) = t(nombre - 1, j)
Next j
End If
End If
Next i
End SubBonjour,
Ta 2éme réponse correspond tout à fait à la solution que je recherchai.
Ainsi, je vais pouvoir continuer à développer ma macro en cours ...
Un très grand merci pour ton aide très rapide.
Bon week-end.
Et merci encore !