Vba excel combinaisons...

Résolu
amaya1 Messages postés 4 Statut Membre -  
amaya1 Messages postés 4 Statut Membre -
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 ;-)
Configuration: Windows Vista Internet Explorer 7.0

2 réponses

  1. JvDo Messages postés 1924 Date d'inscription   Statut Membre Dernière intervention   859
     
    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
  2. amaya1 Messages postés 4 Statut Membre
     
    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