Vba excel combinaisons...

Résolu/Fermé
amaya1 Messages postés 3 Date d'inscription dimanche 12 juillet 2009 Statut Membre Dernière intervention 15 juillet 2009 - 14 juil. 2009 à 01:02
amaya1 Messages postés 3 Date d'inscription dimanche 12 juillet 2009 Statut Membre Dernière intervention 15 juillet 2009 - 15 juil. 2009 à 20:11
Bonjour,

J'ai un tableau Excel dans lequel je considère (par exemple)


A B C D E F
1 0 1 4 7 8 9
2 7 8 x x 1 0
3 x x x x 6 7
4 x x x x 5 3

Les croix représentent des cellules vides.
Les colonnes vont de paire, je peux donc avoir 2, 4 , 6, 8... colonnes sachant que leq colonnes 1 et 2 ont le même nombre de lignes comme les 3 et 4, etc...
De plus le nombre de lignes est nécessairement une puissance de 2 (1,2,4,8...)


Je cherche à écrire un programme en vba excel permettant de donner l'ensmble des combinaisons possibles
Avec mon exemple j'aimerais avoir en sortie :

0 1 4 7 8 9
0 1 4 7 1 0
0 1 4 7 6 7
0 1 4 7 5 3
7 8 4 7 8 9
7 8 4 7 1 0
7 8 4 7 6 7
7 8 4 7 5 3

(peu importe l'ordre des lignes).

Si quelqu'un peut m'aider, me car je galère !!!!
Merci ;-)
A voir également:

2 réponses

JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
14 juil. 2009 à 04:30
Bonsoir,

voilà un code qui fonctionne. Tu sélectionnes ton tableau avant de lancer la macro.
je te laisse l'étudier

cordialement
Sub combi()
Dim tablo As Range, maxind(), ind(), i, j, k, l, n, decal, tot, f
Set tablo = Selection()
n = tablo.Columns.Count / 2: l = tablo.Rows.Count
ReDim maxind(n), ind(n)
decal = 15

For j = 1 To n       'nb occurences par paire de colonnes
    For i = 1 To l
        If tablo(i, 2 * j) = "" Then
            ind(j) = i - 1: Exit For
        Else
            If i = l Then ind(j) = l
        End If
    Next
Next

For j = 1 To n     'produit des nbres d'occurrences des paires de colonnes de j+1 à n
    maxind(j) = 1
    For i = j + 1 To n
        maxind(j) = maxind(j) * ind(i)
    Next
Next
tot = maxind(1) * ind(1)      'nbre de lignes du tableau résultat
maxind(0) = tot
For j = 1 To n
    For f = 1 To tot / maxind(j - 1)      'utile pour répéter les lignes jusqu'à tot lignes
        For i = 1 To ind(j)
           For k = 1 To maxind(j)
                Cells((i - 1) * maxind(j) + (f - 1) * maxind(j - 1) + k, 2 * j - 1 + decal) = tablo(i, 2 * j - 1)
                Cells((i - 1) * maxind(j) + (f - 1) * maxind(j - 1) + k, 2 * j + decal) = tablo(i, 2 * j)
            Next
        Next
    Next
Next
End Sub
2
amaya1 Messages postés 3 Date d'inscription dimanche 12 juillet 2009 Statut Membre Dernière intervention 15 juillet 2009
15 juil. 2009 à 20:11
Bonjour,

C’est parfait, j’ai réussi à comprendre ton raisonnement et à l’adapter à tous mes cas ! Merci beaucoup, je crois qu’il m’aurait fallu très longtemps pour trouver l’astuce !

J’en profite pour te poser d’autres questions sur vba :

- Comment créer une nouvelle feuille (worksheet) qui est la copie d’une feuille déjà existante ?

- Comment faire pour empêcher toute modification de l’utilisateur dans une cellule définie (ou un tableau) ?

- Comment faire pour qu’une valeur soit définie pour tout le projet ? En fait, je souhaite récupérer la valeur d’une textbox (j'ai créé un UserForm) dans une variable n puis quand j’exécute une autre procédure sub je cherche à avoir toujours n=ce qu’il y avait dans la TextBox. En effet pour l'instant je suis contrainte d'écrire dans chaque sub : n = TextBox1.Value

- Comment déterminer le temps de calcul d’une procédure ?

Merci d'avance !
0