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 :

Code pour lister toutes les combinaisons


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Code pour lister toutes les combinaisons
    Bonjour,

    Je cherche un code vba pour lister toute les combinaisons possibles en permuttant :
    1 2 3 4 5 6 7 8 9 et 10.

    Puis les mettre dans un tableau

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    Bonjour,

    Je pense que tu peux trouver la réponse par toit même
    *exercice du prof ?*

    faire tourner un exemple de résultat à la main, essaye avec:
    • 1 et 2
    • puis 1,2 et 3
    • puis 1,2,3 et 4 *stop après sinon ça devient chiant *


    Reviens nous voir *avec un minimum de résultats*
    et on te dira si ça va.

    PS: Fait tes liste de chiffres dans un ordre logique (ex: commence par les 1, puis les 2, ...)

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci pour le tuyau, mais j'avais commencé à faire quelque chose du genre...

    Et j'ai lu qu'il y a avait moyen de le faire avec une fonction récursive.

    Ca serait plus "propre"...

    Toutefois, merci pour le tuyau, je vais continuer à chercher

    PS: Et non, j'ai 31 ans, c'est pas un exercice du prof. Je dev une macro excel qui doit tester un grand nombre de possibilités (3 628 800 dans le cas présent si mes calculs sont bons) pour donner un meilleur choix d'emplacement.

  4. #4
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    C'est un langage VBA du coup, et non vb.net
    le soucis peut très bien être réglé sur ce fofo puisque c'est un algo dont tu a besoin,
    le langage derrière est générique (Boucle For, test IF, ...)

    PS: à titre d'info, tout ce qui est macro Excel c'est dans: Office->Excel->Macros VBA Excel
    PPS: J'attends ta suite

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Exact, c'est pour ca que j'ai posté ici.
    Je me suis dit (peut-être à tord) qu'il y aurait plus de monde sur le fofo vb.net apte à me fournir une solution.

  6. #6
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    Je suis en train de regarder pour "faire propre" avec la fonction récursive,
    mais j'ai un doute qu'on puisse le faire aussi facilement que pour la Factorielle *grand classique des fonctions récursives*

    étant donné que tu veux sortir des tableaux, si on joue avec la récursivité, on va se galerer, il faut:
    • gérer les tailles des tableaux
    • et l'ordre des données *surtout ne pas les écraser*


    je pense que ce que je te propose c'est de faire une fonction à la mano "pas propre",
    et si tu veux on essayera de plancher sur une fonction un peut plus évoluer *dite récursive*

  7. #7
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 272
    Points
    11 272
    Par défaut
    Salut, une simple recherche sur le site devrait être suffisante : http://www.google.fr/#sclient=psy-ab...w=1027&bih=719

  8. #8
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    Tes solutions fonctionnent pour des valeur à 2 chiffres,
    mais je n'ai pas trouvé d'exemples qui nous montrent comment faire avec des valeurs à 10 chiffres

  9. #9
    Candidat au Club
    Inscrit en
    Octobre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci kiki29, je suis tombé sur pas mal de lien que j'avais déjà consulté, toutefois, je pense avoir trouvé une bonne piste pour coder ma fonction récursive ici :

    Citation Envoyé par prgasp77 Voir le message
    Salut. Imaginons que tu saches construire une telle liste de tableau pour N items :
    [
    {A, B, C},
    {B, C, A},
    ...
    ]
    Pour construire une liste similaire pour N+1 items, il suffit, pour chaque tableau de ta liste (dans l'exemple, pour chaque ligne), d'insérer le N+1-ième item à chaque emplacement possible :
    [
    {D, A, B, C},{A, D, B, C},{A, B, D, C},{A, B, C, D},
    {D, B, C, A},{B, D, C, A},{B, C, D, A},{B, C, A, D},
    ...
    ]

    Ainsi, du fait que tu n'as qu'un faible nombre d'items, je propose une solution récursive :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    fonction arrangements(l : liste d'item)
    Si taille de l = 1 Alors
       retourner l
    Sinon
       Soient tete : item et queue : liste d'item telles que tete+queue=l
       Soit resultat : liste de (liste d'item)
       l' = arrangements(queue)
       Pour chaque liste arrangement de l'
          Pour chaque item i de arrangement
             Ajouter la liste arrangement[0..i-1]+tete+arrangement[i..fin] à resultat
          Fin Pour
       Fin Pour
       retourner resultat
    Fin Si
    source : http://www.developpez.net/forums/d10...e/#post6047715

    Reste maintenant à en tirer le code...

  10. #10
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    De retour tontonced

    Je ne te serrai pas d'une grande aide, il y a une partie importante que je ne comprend pas ...
    Soient tete : item et queue : liste d'item telles que tete+queue=l
    Soit resultat : liste de (liste d'item)
    l' = arrangements(queue)
    les Soient tete et soit resultat sont vraiment pas clair...
    et qu'est-ce qu'il entend par "arrangement"

    -------------------------------------------------------------------

    Tu aura besoin de faire d'autre liste de chiffres comme ça?
    ou c'est quelque chose d’exceptionnel?

  11. #11
    Candidat au Club
    Inscrit en
    Octobre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    J'osais pas dire que c'était pas clair... Mais j'ai le même problème pour comprendre que toi

  12. #12
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    humm c'est une autre approche qui consiste à ajouter un chiffre avant et après chaque chiffre qui est dans le nombre.

    .............123
    ........../
    .......12 - 132
    ....../....\
    ..../.......312
    ..1
    ....\.......213
    ......\.../
    .......21 - 231
    ..........\
    ...........321

    Je vois bien la partie récursive mais alors comment coder .... *j'en fait pas tous les jours...*
    je peux te donner un code qui va le faire mais ce serra que pour ton cas à 10chiffres

  13. #13
    Candidat au Club
    Inscrit en
    Octobre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Donne donne... en attendant mieux

  14. #14
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    désolé pour le retard, petit contre temps.

    bon pour ton code,
    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
    Option Explicit
     
    Sub Beta()
        'Déclaration des variables
        Dim Chaine, NextNumber, NewChaine As String
        Dim Longueur, i As Integer
        'Initialisation des variables
        Chaine = "123"
        NextNumber = "4"
        NewChaine = ""
        'Récupération de la longueur de la chaine
        Longueur = Len(Chaine)
        'Dimensionnement du tableau
        ReDim NewChaine(Longueur - 1)
        'Insertion du caratére
        For i = 0 To Longueur - 1
            NewChaine(i) = Left(Chaine, i) & NextNumber & Right(Chaine, i)
        Next
    End Sub
    Le code est encore à l'état de beta, il ne permet que de passer de la suite 123 -> aux 4 autres possibilités qui en découlent.
    je l'ai pas testé mais c'est pour te donner un aperçu de la méthode à laquelle je pense.

    PS: attention pour cette routine tu a besoin de considérer tes chiffres comme des lettres

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

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Points : 9 402
    Points
    9 402
    Par défaut
    Bonjour,

    Une autre méthode qui peut être te conviendra
    Ici on boucle sur 3 niveaux, mais le principe reste le meme sur x niveaux (par contre, pour la restitution faire attention au nombre de lignes

    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
    Dim i1 As Byte
    Dim i2 As Byte
    Dim i3 As Byte
     
    Dim iLigne As Long
     
    iLigne = 1
     
    For i3 = 1 To 10
        For i2 = 1 To 10
            For i1 = 1 To 10
                Range("A" & iLigne).Value = i1 & i2 & i3
                iLigne = iLigne + 1
            Next i1
        Next i2
    Next i3
    Et comme cela si on ne veut pas de doublons
    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
     
    Dim i1 As Byte
    Dim i2 As Byte
    Dim i3 As Byte
     
    Dim iLigne As Long
     
    iLigne = 1
     
    For i3 = 1 To 10
        For i2 = 1 To 10
            If i2 <> i3 Then
                For i1 = 1 To 10
                    If i1 <> i2 And i1 <> i3 Then
                        Range("A" & iLigne).Value = i1 & i2 & i3
                        iLigne = iLigne + 1
                    End If
                Next i1
            End If
        Next i2
    Next i3

  16. #16
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Peut être quelque chose dans ce gout la

    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
    27
    28
    29
    30
    31
    32
    33
    34
    Sub Permute(ByRef StrTableau As String, ByVal PreSuFix As String)
    Dim TabSplit
    Dim i As Integer
     
     
    If StrTableau = "" Then
        StrTableau = PreSuFix
    Else
        TabSplit = Split(StrTableau, "¤")
     
        For i = 0 To UBound(TabSplit)
            StrTableau = StrTableau & "¤" & PreSuFix & TabSplit(i) & "¤" & TabSplit(i) & PreSuFix
        Next
    End If
     
    End Sub
     
     
    Sub Utilisation()
    Dim i As Integer
    Dim StrTab As String
    Dim TabResultat
     
    For i = 1 To 10
        Permute StrTab, i
    Next
     
    TabResultat = Split(StrTab, "¤")
    With Feuil1.Range("A1").Resize(UBound(TabResultat))
        'On passe les cellule en format texte pour éviter qu'excel n'exploite les valeurs avec un format scientifique
        .NumberFormat = "@"
        .Value = WorksheetFunction.Transpose(TabResultat)
    End With
    End Sub
    Il doit falloir retravailler un peu les boucles car je ne trouve que 19000 et quelques résultats... le calculs qui te donne 3M de possibilité tient compte des doublon? 6 2 3 6 5 ?

    Autre problème posé par mon code: je viens de voir que le 1 sera toujours présent, puis le 2... puis le 3, il n'y a donc pas toutes les solutions... il faudrait refaire appelle au code 10 fois en réduisant la borne de départ a chaque fois. de 1à10 puis de 2à10...jusqu'à 9à10, il suffit de mettre une boucle de plus dans la sub utilisation, je te laisse tester, je n'ai pas trop le temps

    ++
    Qwaz

  17. #17
    Membre habitué Avatar de Klin89
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 119
    Points : 178
    Points
    178
    Par défaut
    Bonsoir à tous,

    Vois l'algorithme de Jonhson-Trotter version VBA proposé par fred65200 dans ce lien.

    http://www.developpez.net/forums/d42...ne-charactere/

    Tu listeras les 3 628 800 permutations : factorielle de 10

    Klin89

  18. #18
    Candidat au Club
    Inscrit en
    Octobre 2011
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Beaucoup de réponse à étudier (j'étais parti en vacances quelques temps)...

    Merci à tous

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/01/2013, 11h32
  2. Lister toutes les combinaisons d'éléments
    Par Loceka dans le forum Prolog
    Réponses: 5
    Dernier message: 15/04/2007, 00h11
  3. [checkbox] Code pour cocher toutes les cases
    Par snakejl dans le forum Général JavaScript
    Réponses: 24
    Dernier message: 02/06/2006, 09h36
  4. Lister toutes les combinaisons...
    Par monstroplante dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 04/11/2005, 21h10
  5. Réponses: 8
    Dernier message: 17/10/2002, 12h52

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