IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Boucle Combinaison VBA


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 5
    Points
    5
    Par défaut Boucle Combinaison VBA
    Bonjour tlm,

    Je vais essayer d'etre precis dans l'explication de mon probleme.

    Je n'arrive a trouver la bonne maniere d'utiliser les boucles.

    Explication:

    J'ai une colonne de 4 elements. Ils sont initialisé à 0.

    0
    0
    0
    0

    Dans une cellule j'ai un certain nombre exemple 2. Le but est de parcourir toute les possibilités de combinaison.

    Exemple de sequence:

    0 1 1 1 0 0
    0 1 0 0 1 1
    0 0 1 0 1 0
    0 0 0 1 0 1 etc etc.

    Je dois faire ça dans une macro excel.

    Si qq'un a une idée ?

    Merci de votre aide.
    Cdlt
    Ludo.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    J'ignore si tu veux faire ça avec des 1 mais si oui, alors tu as 111111 combinaisons possibles... en binaire
    Maintenant, si tu veux remplir tes cellules de ces combinaisons, tu dis.
    Mais peux-tu être plus précis sur le but ?
    (c'est un problème d'automatisme ?)
    A+

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Oui ca sera uniquement avec des 1. Effectivement c'est biniaire 0 ou 1.

    Le but est de calculer la meilleur combinaison de 1 et donc il faut tester toutes les possibilités.
    Ludo.

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Si tu veux toutes les possibilités, tu peux faire ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub booleens()
    Dim mot As String, i
        mot = "0"
        Do While Len(mot) < 7
            If InStr(mot, "0") <> 0 Then
                mot = Left(mot, InStr(mot, "0") - 1) & "1" & Right(mot, Len(mot) - InStr(mot, "0"))
                i = i + 1
                Cells(i, 1) = mot
            Else
                mot = "1" & String(Len(mot), "0")
                i = i + 1
                Cells(i, 1) = mot
            End If
        Loop
        Columns(1).NumberFormat = "000000"
    End Sub
    Tu les auras dans une seule colonne mais il n'est pas difficile de répartir chaque nombre dans 6 cellules
    A+

    Edit
    Pendant que j'y étais j'ai réparti les résultats
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Sub booleens()
    Dim mot As String, i, j, var$
        mot = "0"
        Do While Len(mot) <= 6
            If InStr(mot, "0") <> 0 Then
                mot = Left(mot, InStr(mot, "0") - 1) & "1" & Right(mot, Len(mot) - InStr(mot, "0"))
                Var = Right("000000" & mot, 6)
                i = i + 1
                For j = 1 To 6
                    Cells(i, j) = Mid(Var, j, 1)
                Next
            Else
                mot = "1" & String(Len(mot), "0")
                Var = Right("000000" & mot, 6)
                i = i + 1
                For j = 1 To 6
                    Cells(i, j) = Mid(Var, j, 1)
                Next
     
            End If
        Loop
    End Sub

  5. #5
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Sympa l'algo.
    chapeau bas
    Jérôme

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Merci les gars.

    Je vais essayer de comprendre et d'adapter pour que ça colle

    A+ Ludo.

  7. #7
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Salut les gars,

    Un BIG UP du post

    Merci à ouskel'n'or pour m'avoir aidé mais ce n'est pas trop ce que je voulais faire et je n'arrive pas a adapter

    L'exemple que ouskel'n'or ma indiquer fonctionne en mode "ligne" sur une ligne,
    Il me donne bien toute les combinaisons possible etc etc....

    Enfaite ce que je souhaiterai c'est la même chose mais sur une colonne.

    Y'a t il moyen de faire ainsi ?

    Merci.
    Ludo.

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Près de six mois de réflexion, tu es bien sûr de ce que tu veux ?
    Pour mettre en colonne, avec le premier code tu devrais pouvoir remplacer Cells(i, 1) par Cells(1, i)
    Avec le second, as-tu essayé en remplaçant Cells(i, j) par Cells(j, i) ? Pas testé, faudrait que je me replonge dedans... Tu peux faire ça pour nous avant Noël ?

  9. #9
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    lol ouskel'n'or

    Oui le temps passe vite :p lol

    J'essaye le switch les variables. :p
    Merci.
    Ludo.

    même en changeant les variables j,i c'est pas pareil

    J'essaye d'être plus précis dans ma demande

    Au départ il faut définir 2 données.

    nb_total_systeme = 6
    nb_systeme = 4

    En mode colonne au départ je dois avoir ceci.

    0
    0
    0
    0
    0
    0

    6 zero (car nb_total_systeme = 6)

    ensuite premier passage

    1
    1
    1
    1
    0
    0

    4 un (car nb_systeme = 4 ) & 2 zéro (car nb_total_systeme = 6 pour faire le complément en 0)

    Et ainsi de suite afin d'avoir dans cette configuration 6 & 4 toutes les combinaisons de 1 possible.

    J'ai mais le couple 6 & 4 comme exemple mais çà peut être genre 30 & 5..

    J'espère que c'est plus clair.

    Ludo.

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Si j'ai bien compris... ce qui n'est pas sûr mais pas sûr du tout... en paramétrant le nombre 6 et en remplaçant
    Var = Right("000000" & mot, 6)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                Var = Right(string(Paramètre,"0") & mot, Paramètre)
    tu devrais, à première vue, sans engagement de ma part et sous ta propre reponsabilité obtenir quelque chose qui s'approche de... ce que j'ai compris
    Tu devrais sans mal compléter avec des zéros si nb_total_systeme > nb_systeme, non ?
    Tu dis. J'attends de toi la suite de l'histoire avec la plus grande impatience

  11. #11
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Même avec la nouvelle explication ça ne va pas mieux ?!?

    J'ai modifié le code ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Sub booleens()
    Dim mot As String, i, j, var$
        mot = "0"
        nb_total_systeme = 6
        nb_systeme = 4
        Do While Len(mot) <= nb_total_systeme
            If InStr(mot, "0") <> 0 Then
                mot = Left(mot, InStr(mot, "0") - 1) & "1" & Right(mot, Len(mot) - InStr(mot, "0"))
                var = Right(String(nb_total_systeme, "0") & mot, nb_total_systeme)
                i = i + 1
                For j = 1 To nb_total_systeme
                    Cells(j, i) = Mid(var, j, 1)
                Next
            Else
                mot = "1" & String(Len(mot), "0")
                var = Right(String(nb_total_systeme, "0") & mot, nb_total_systeme)
                i = i + 1
                For j = 1 To nb_total_systeme
                    Cells(j, i) = Mid(var, j, 1)
                Next
            End If
        Loop
    End Sub
    En sortie çà donne ça chez moi : (çà se lit en mode colonne)

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0
    0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1 0
    0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 0
    0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 1 1 1 0
    0 1 1 0 1 1 0 0 1 1 0 0 0 1 1 0 0 0 0 1 1 0
    1 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0

    Mais bon ce n'est pas trop le résultat attendu

    Mais plutôt un truc comme ça tjrs en colonne la lecture avec comme setup

    nb_total_systeme = 6 (nbre de 0)
    nb_systeme = 4 (nbre de 1)

    1111111
    1111100
    1110011
    1001111
    0101010
    0010101 etc etc

    Pas évident d'expliquer je te l'accord

  12. #12
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    edit:

    bon alors cela devrais faire 6^6 lignes
    6*6*6*6*6*6=46656 lignes
    que tu divise par 2
    la première moitié de la premiere colonne est 1, l'autre 0
    la deuxième collone tu divise le nb de ligne par 4 ( par deux pour la premiere moitié de la première colonne, et par deux pour la deuxième moitié) et tu alterne les quart par 1 et 0
    la troisième colonne pareil mais la c'est par 8
    16 pour la quatrième, ... etc

    puis tu ne gardes que les lignes dont la somme égale 4
    Alleï Bonjour chez vous!

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Bon, alors je t'ai fait ça pour 6 chiffres (4*1 + 2*0)
    Le principe : Je répartis les zéros de façon à ce qu'il y en ait (dans l'exemple)deux par colonne et que leur position soit unique.
    Quand tous les zéros sont placés, je bouche les trous avec des 1.

    Il suffira que tu paramètres le nombre de valeurs et de zéros.
    Les 1, on s'en fout.
    Je te mets ci-après les éléments à prendre en compte.
    nbv -> Nb de valeurs (6 dans l'exemple)
    n1 -> Nb de 1 (4 dans l'exemple)
    n0 -> Nb de zéros (2 dans l'exemple)

    Construction :
    Nbc -> nbre de combinaisons 'à calculer
    Nbc = (n1-1) * (n0-1)
    Nbi -> nbre d'itérations
    Nbi = Nbc
    Les boucles
    nb -> Nb boucles
    nb = Nbv - 1
    Le code pour 2 zéros et 4 uns
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Sub test()
    Range("A1").CurrentRegion.ClearContents
        x = 0
        'nb d'itérations : de nb = 1 (5 dans l'exemple)
        NoCol = 1
        NoLig = 1
        For ni = 5 To 1 Step -1
            j = NoCol
            z = z + 1
            'Les No de colonnes : =nb pour la 1ère itération, puis nb + nb - 1, puis nb -2...
            'Pour chaque boucle sur ni le nbre de colonnes à renseigner diminue
            For NoCol = j To j + ni - 1
                Cells(NoLig + x, NoCol) = "0"
                Cells(NoLig + x + z, NoCol) = "0"
                x = x + 1
            Next
            x = 0
        Next
        'bouche trous avec les 1
        Dim cell As Range
        For Each cell In Range("A1").CurrentRegion
            If cell = "" Then cell = "1"
        Next
    End Sub
    Le nombre de colonnes remplies te donnera le nombre de combinaison.
    Je te laisse te dépatouiller avec le paramétrage, ce n'est pas sorcier et il faut bien que tu bosses un peu.
    En outre, déclare les variables. Tu sauras faire ?
    A+

    PS - Tu as de la veine, il pleut comme vache qui pisse et je n'ai pas pu aller me balader

    Edit
    Je viens de voir que tu ne pourras pas simplement paramétrer ces lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            For NoCol = j To j + ni - 1
                Cells(NoLig + x, NoCol) = "0"
                Cells(NoLig + x + z, NoCol) = "0"
                x = x + 1
            Next
    Je regarde pour changer ça. J'avais commencé à le faire mais ce code me simplifiait la tâche.

  14. #14
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    bon, je rectifie pour moi
    c'était pas X^X lignes
    mais bien 2^X lignes

    ce qui donnerai ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Sub OneFourSix(NbTotalSysteme As Long, NbSysteme As Long)
     
    Dim nbRow As Long
    Dim I, J, K, R
     
    'Total de sequences possible
    nbRow = 2 ^ NbTotalSysteme
     
    'affichage de la matrice
    For I = 1 To NbTotalSysteme
        NbOne = nbRow / (2 ^ I)
        R = 1
        For J = 1 To 2 ^ (I - 1)
            Range(Cells(R, I), Cells(R + NbOne - 1, I)) = 1
            Range(Cells(R + NbOne, I), Cells(R + NbOne * 2 - 1, I)) = 0
            R = R + NbOne * 2
        Next J
    Next I
     
    'Garder les séquences comprenant nbSysteme 0
    For I = nbRow To 1 Step -1
        R = Application.WorksheetFunction.Sum(Range(Cells(I, 1), Cells(I, NbTotalSysteme)))
        If Not R = NbSysteme Then Rows(I).Delete
    Next I
     
    End Sub
    non??
    Alleï Bonjour chez vous!

  15. #15
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    non??[/QUOTE]

    Non mayekeul desolé merci qd meme pour ton aide !!

  16. #16
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Quoi, "non" ? Le seul inconvénient que je voyais était si "2^X lignes" dépasse les 65536 fatidiques lignes d'Excel 2003 et antérieur, mais pas d'Excel 2007.
    Tu dis (avant que je me replonge dans le bidule...)
    A+

    PS - Pour le moment je n'ai pas trouvé comment paramétrer le nombre de zéros.

  17. #17
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Ce n'est pas le fait que ça soit le nbre de ligne qui bloque car je suis sous xls 2007, mais plutôt le fait que ça correspond pas malheureusement a ce que je cherche a faire.

    C'est pas grave, c'est plus dur que je ne pensais et je vais essayer de m'arranger autrement.

    Merci.

  18. #18
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    As-tu testé ce que j'ai fait (deux posts plus haut) ? (Valable pour quatre uns et deux zéros)

  19. #19
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    oui bien sur ouskel'n'or je l'ai vue et je l'a test & la modifie actuellement mais comme tu dis la partie pour variabiliser le nbre de "0" qui pose problème ...

  20. #20
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    En effet mais c'était le sens de ma question.
    Puisque mon code donne le même résultat en colonnes que celui de Mayekeul en lignes, tu pourrais utiliser celui de Mayekeu. Une simple copie transposée te mettrais le résultat en colonnes.
    Juste une idée et si c'est ça qui t'arrête...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. boucle en vba pour charger
    Par presser dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/03/2009, 18h54
  2. boucle sous VBA catia
    Par purp31 dans le forum Général VBA
    Réponses: 1
    Dernier message: 05/03/2009, 20h01
  3. Problème pour réaliser une macro "de boucles" dans VBA
    Par philou7176 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/12/2008, 16h41
  4. Boucles en VBA Excel
    Par JPR1347 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/08/2008, 22h15
  5. Traiter 100 fichiers avec une boucle sous VBA excel
    Par sebastien06 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/04/2008, 10h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo