Regroupement d'objets 3 par 3

La macro n'écrit que le N° des objets : tu as tous les triplettes ou trios ou regroupements que tu veux pour n'importe quelle quantité que veux-tu de plus ?

Au lieu de 1, 2, 3 Il faut que je t'écrive Objet 1, Objet 2, Objet 3 ? Tu comprendras mieux ?

Je t'ai fait une macro polyvalente qui te fait aussi bien les tirages pour 6 que pour 9, 12 ou plus.

Tu n'as qu'à remplacer le N= 49 par N= 6 au début de la macro et tu te retrouves avec le cas de figure avec tes 20 combinaisons.

Après YAPUKA faire glisser la seconde moitié des résultats à coté de la première moitié et tu as tous tes regroupements...

Je t'ai amélioré la macro pour qu'elle te fasse le rapprochement en plus et t'ai mis N = 6 pour que tu te retrouves en terrain familier, mais là je peux plus rien faire de plus pour toi.... Si tu comprends pas !

A+

24combinatoire.xlsm (24.80 Ko)

Semble fonctionner pour tout multiples de 3, je galère un peu plus pour le cas où il y a des reste (m'enfin j'ai pas vérifié que j'avais les bons résultats sans reste donc je galère peut-être des deux côtés en fait)

263yi3.xlsm (13.42 Ko)

Bonjour Yvouille

bonjour tous

alors j'ai fait des tests avec ma machine, qui est très récente (Intel I7+16Go de RAM)

avec 15 objets temps exécution de la macro de H2So4 => 80s (1 min 20) (taille du fichier 4.8Mo)

avec 16 objets temps exécution de la macro de H2So4 => 337s (5 min 37s) (taille fichier 20Mo)

avec 17 objets temps exécution de la macro de H2So4 => 925s +de 15 minutes = >taille du fichier : 56Mo....

dispo ici si tu veux : EDIT je supprime le lien vers mon Dropbox....

pour 18 objets je pourrais lancer la macro ce soir car là je penses qu'il y en a pour 45 minutes... et je ne peux pas bloquer mon excel pour ce laps de temps pour le moment...

je pourrais te mettre aussi le fichier a dispo si tu le souhaite comme cela tu pourras archiver le résultat sur ta machine (mais cela fera gros comme taille de fichier....)

dis moi si cela t’intéresse....

a+

fred

Re,

@ Elhevan

Si tu vas vois la macro que me propose h2so4, tu verras qu’il y a normalement 3970 combinaisons possibles avec 12 objets. Ta macro en trouve 58. C’est nettement insuffisant. Par exemple ta macro ne trouve pas le trio CDL.

@ Galopin

Désolé, mais j’ai inscrit des objets dans la ligne 1 comme dans le fichier de h2so4 – en pensant que tu avais peut-être repris l’idée – puis j’ai essayé d’inscrire des objets dans la colonne N – comme je l’avais indiqué dans mon tout premier message – et comme ça semblait tourner dans le vide, j’ai pensé que je n’inscrivais pas les objets de base au bon endroit.

Maintenant que j’ai compris comment fonctionne ta macro, je me rends compte que tu ne formes à chaque fois que deux trios, alors que je voudrais à chaque fois tous les trios possibles ; trois trios pour 9 objets, 4 trios pour 12 objets, etc. J’avais encore indiqué que s’il y avait des trios incomplets, ce serait bien de les traiter, mais que je pouvais m’en passer. C’est du moins dans ce sens que l’on discute avec h2so4.

Merci à tous les deux pour votre aide.

EDIT

Salut Fred,

Je vois ton message après avoir inscrit le mien ! Merci pour ton intervention

Les informations que tu me donnes sont amplement suffisantes ; je sais ainsi qu’il est inutile de vouloir partir dans le sens d’effectuer un tirage avec plus de 15 objets. Mon PC étant plus ou moins deux fois plus lent (2 minutes 30 pour 15 objets contre 1 minute 20 chez toi), je ne vais pas me lancer dans des tirages plus longs.

Comme je l’ai indiqué à h2so4, je vais si nécessaire effectuer plusieurs tirages de 9 à 15 objets. Les résultats seront moins bons, mais déjà intéressants.

J’ai de la peine à ouvrir ton fichier. A titre d’information, combien a-t-il de lignes ?

Yvouille a écrit :

Bonjour tout le monde,

J’ai remarqué que si je lance la macro avec 13 objets par exemple, dans la dernière colonne, je n’ai pas tous les objets qui y apparaissent, alors que logiquement il devrait y avoir le même nombre d’occurrences dans cette colonne pour tous les objets. Après avoir formé 4 x 3 trios, il devrait régulièrement rester un dernier objet seul. Ce n’est pas très important car je vais probablement lancer ma macro qu’avec des multiples de 3 (dans le cas présenté ci-dessus avec 13 objets, j’en choisirais par exemple 12 au hasard), mais c’est juste pour avoir ton avis.

tu as raison la macro ne fonctionne correctement qu'avec des multiples de 3

RE

pour 17 objets 792011 Lignes ....

fred

@ Fred

Merci Fred, ce renseignement ne fait que renforcer mon idée première ; je ne vais pas travailler avec plus de 15 objets.

@ h2so4

Tant pis pour les trios incomplets, je peux très bien m’en passer. La macro que tu m’as offerte là fait déjà un boulot gigantesque. Je t’en remercie sincèrement.

Je laisse le sujet ouvert quelques jours si quelqu’un a des remarques, des idées à présenter.

Bonnes salutations à tous les intervenants

bonjour

ce que j ai compris

Je voudrais connaitre toutes les possibilités de les grouper 3 par 3,

Vous ne voulez pas répéter les trios dont leurs éléments se ressemblent (les mêmes éléments)

Si nécessaire avec des objets laissés de côté.

Afficher les autres trios restants

Le résultat devrait être placé dans les colonnes suivantes,

Si possible avec chaque objet dans une colonne différente.

Si possible avec chaque Trio dans une colonne différente.

Essayer ca : pour 12 objet (0,30 secondes) et pour 48 objet (4,19 secondes)

19demov3.xlsm (20.31 Ko)

re-bonjour,

code qui traite également un nombre d'objets qui n'est pas un multiple de 3.

Dim ia$(1 To 50), a$(1 To 50), v&(1 To 50), u&(1 To 50), sol&, p$(1 To 2)
Sub permute(n&, Optional ind& = 1, Optional niveau& = 1)
    If niveau = 1 Then
        limi = 1
    ElseIf niveau Mod 3 = 1 Then
        limi = niveau + 2
        If limi > n Then limi = n
    Else
        limi = n
    End If
    For i& = ind To limi
        If u(i) = 0 Then
            u(i) = 1
            v(niveau) = i
            If niveau = n Then
                sol = sol + 1
                For j& = 1 To n
                    Cells(sol, j) = a(v(j))
                Next j
                For j = 1 To 2
                    Cells(sol, n + j) = p(j)
                Next j
            Else
                If niveau Mod 3 = 0 Then
                    permute n, niveau - 2, niveau + 1
                Else
                    permute n, i + 1, niveau + 1
                End If
            End If
            u(i) = 0
        End If
    Next i
End Sub
Sub aargh()
    t = Timer
    Application.ScreenUpdating = False
    n& = Cells(1, Columns.Count).End(xlToLeft).Column
    sol = 1
    For i& = 1 To n
        ia(i) = Cells(1, i)
    Next i
    If n Mod 3 = 0 Then
        p(1) = ""
        p(2) = ""
        For i = 1 To n
            a(i) = ia(i)
        Next i
        permute n
    ElseIf n Mod 3 = 1 Then
        For i = 1 To n
            p(1) = ia(i)
            p(2) = ""
            k = 0
            For j = 1 To n
                If j <> i Then k = k + 1: a(k) = ia(j)
            Next j
            permute n - 1
        Next i
    Else
        For i = 1 To n - 1
            p(1) = ia(i)
            For i1 = i + 1 To n
                p(2) = ia(i1)
                k = 0
                For j = 1 To n
                    If j <> i And j <> i1 Then k = k + 1: a(k) = ia(j)
                Next j
                permute n - 2
            Next i1
        Next i
    End If
    MsgBox sol - 1 & " permutations en " & Timer - t
    Application.ScreenUpdating = True
End Sub

Bonjour tout le monde,

@ Amir

Avec ta macro, tu as apparemment trouvé toutes les permutations possibles pour le premier trio d’objets, mais tu n’as pas été plus loin. Par exemple avec 9 objets, la dernière ligne trouvée est

Objet 1-Objet 8-Objet 9 / Objet 2-Objet 3-Objet 4 / Objet 5-Objet 6-Objet 7

Mais il manque la suite :

Objet 1-Objet 8-Objet 9 / Objet 2-Objet 3-Objet 5 / Objet 4-Objet 6-Objet 7

Objet 1-Objet 8-Objet 9 / Objet 2-Objet 3-Objet 6 / Objet 5-Objet 4-Objet 7

Objet 1-Objet 8-Objet 9 / Objet 2-Objet 3-Objet 7 / Objet 5-Objet 6-Objet 4

etc.

Va donc voir la solution de h2so4 qui correspond exactement à mon attente.

@ h2so4

Avec ce complément, c’est tout simplement génial Merci infiniment.

J’aurais encore une question ; j’ai l’habitude de travailler avec l’instruction ‘’Option explicit’’, mais là j’ai dû l’enlever pour que ta macro passe (ou j’aurais dû déclarer toutes tes variables et j’avais un peu la trouille de me planter). Pourquoi ne travailles-tu pas avec cette instruction ? C’est parce que ce sont des tableaux ? J’avais compris que c’était bien de déclarer toujours les variables, que ça pouvait faire gagner du temps.

Chaleureusement.

Yvouille a écrit :

Bonjour tout le monde,

Avec ce complément, c’est tout simplement génial Merci infiniment.

J’aurais encore une question ; j’ai l’habitude de travailler avec l’instruction ‘’Option explicit’’, mais là j’ai dû l’enlever pour que ta macro passe (ou j’aurais dû déclarer toutes tes variables et j’avais un peu la trouille de me planter). Pourquoi ne travailles-tu pas avec cette instruction ? C’est parce que ce sont des tableaux ? J’avais compris que c’était bien de déclarer toujours les variables, que ça pouvait faire gagner du temps.

Chaleureusement.

bonjour,

tu as raison c'est plus propre. tu remarqueras cependant que je définis le type de chaque variable à sa première apparition.

suffixe $ pour un string, & pour des entiers longs, le défaut(=variant) pour les tableaux. cette manière de définir suffit pour faire gagner du temps.

Salut h2so4, merci pour cette dernière précision.

Excellente continuation.

Salut h2so4,

Je me vois obligé d’ouvrir à nouveau ce poste car j’ai enfin eu le temps de vouloir appliquer ta solution à mon problème et je me rends compte de certaines contraintes que je n’avais pas imaginées.

Il s’agit en fait de composer des triplettes pour des mêlées de pétanque, mais le nombre de joueurs que j’ai à disposition ne correspond pas toujours à celui du nombre de triplettes nécessaires. Par exemple je peux avoir 7 joueurs à disposition pour créer 2 triplettes – ta macro serait alors parfaitement utilisable en l’état – alors que je peux avoir 30 joueurs à disposition pour créer ces mêmes deux triplettes. Ou 13 joueurs pour 3 triplettes, etc.

Penses-tu donc qu’il y aurait la possibilité de modifier ton code de manière à dire : sur x joueurs à disposition (il y en a toujours au minimum le nombre nécessaire), il faudrait créer 1, 2 ou 3 triplettes en ayant le maximum de combinaisons possibles ?

En l’état actuel de ton travail, si j’ai par exemple 9 joueurs à disposition mais qu’il me faut 2 triplettes seulement, le résultat obtenu est beaucoup trop poussé et j’ai plein de combinaisons inutiles.

Il est bien entendu que si le nombre de joueurs à disposition est trop important, on pourrait travailler sur un nombre maximum et je m’arrangerai pour tirer au sort les joueurs utilisés. Par exemple, pour créer une triplette seulement, on chercherait les permutations possibles pour 3 à x joueurs seulement ; pour créer deux triplettes, on chercherait les permutations possibles pour 6 à y joueurs seulement et pour créer trois triplettes, on chercherait les permutations possibles pour 9 à z joueurs.

Idéalement la liste des joueurs à disposition se trouverait sur une feuille et les résultats obtenus sur une autre feuille.

Il se pourra que je doive créer exceptionnellement plus de 3 triplettes, mais je vais alors diviser arbitrairement les joueurs à disposition en x groupes afin de créer y fois z triplettes.

Si ça t’intéresse, je peux encore t’expliquer comment je pense utiliser le résultat souhaité : Si j’ai par exemple dans 6 colonnes les noms des 6 joueurs nécessaires aux deux triplettes, je vais créer dans la 7ème colonne la paire du joueur 1 de la triplette 1 – appelons-le j1t1 - avec le joueur j2t1, dans la 8ème colonne la paire j1t1/j3t1, dans la 9ème colonne j2t1/j3t1, etc. et je pourrai contrôler à l’aide d’une base de donnée séparée si ces joueurs ont déjà joué ensemble dans le passé ou non. Je peux alors choisir la ligne ayant les meilleurs résultats de paires n’ayant peu souvent joué ensemble.

J’espère de tout cœur que tu puisses encore m’aider sur ce coup-là.

Excellentes salutations.

Bonjour,

une proposition, noms à mettre en ligne 1 de feuil1 , résultats en feuil2

25permut-3-par-3.xlsm (21.10 Ko)

Salut h2so4,

Ta solution dépasse toutes mes espérances

Je vais vraiment pouvoir continuer à bricoler mon fichier d’une manière très satisfaisante.

Je peux chercher les 19'600 permutations possibles pour 1 triplette sur la base de 50 joueurs en 6 secondes environ, les 78'430 permutations possibles pour 2 triplettes sur la base de 15 joueurs en 50 secondes environ et les 57'120 permutations possibles pour 3 triplettes sur la base de 12 joueurs en 60 secondes. Du vrai bonheur.

Juste une petite question subsidiaire, si tu peux encore m’aider à ce niveau-là :

J’avais placé des formules de contrôle sur ton fichier – environ 1'000'000 de formules, soit 100'000 lignes x 10 colonnes – et ta macro prend alors environ 3 fois plus de temps, malgré que j’ai placé des instructions Application.Calculation = xlManual et Application.Calculation = xlCalculationAutomatic en début et fin de ta macro. Ceci me parait assez normal. Mais j’avais remarqué que ta première macro – appelée depuis l’une des miennes - fonctionnait également plus lentement dans un fichier contenant lui plusieurs autres macros. Ma question est donc la suivante : sais-tu si le fait d’avoir beaucoup de macros dans un fichier – ou d’appeler une macro depuis un autre - peut la ralentir ?

Amicalement.

re-bonjour,

je n'ai pas fait le test, mais je peux m'imaginer que pour exécuter une macro excel parcourt le code à la recherche de la macro à exécuter, il pourrait donc y avoir un intérêt à mettre la macro la plus souvent utilisée en première position dans le code. Mais je ne pense pas que ceci puisse expliquer une exécution 3 fois plus lente.

Ok, merci pour cette réponse et encore une fois un tout grand merci pour ton code.

Bon vent

Salut H2so4,

Aïe, c'est encore moi

J'ai bien pu avancer dans mon projet grâce à ton code, mais je tombe déjà sur le problème suivant.

J'ai maintenant réparti les joueurs devant jouer en triplettes et il me reste un certain nombre, toujours pair, de joueurs à disposition afin de former les doublettes (jusqu'à une cinquantaine de joueurs). Est-il possible de trouver toutes les manières possibles de former toutes les doublettes possibles ? Si ce n'est possible que pour un maximum de x joueurs, ce serait déjà ça

A nouveau, si les joueurs à disposition étaient placés sur une feuille et le résultat sur une autre, ce serait génial.

Amicalement.

Bonsoir Yvouille,

pas sûr d'avoir bien compris la demande, solution indépendante des messages précédents, noms en ligne 1 de la feuille sheet1, résultat en sheet2

Sub aargh2()

Set ws1 = Sheets("Sheet1")

Set ws2 = Sheets("sheet2")

dc = ws1.Cells(1, Columns.Count).End(xlToLeft).Column

For i = 1 To dc - 1

For j = i + 1 To dc

k = k + 1

ws2.Cells(k, 1) = ws1.Cells(1, i) & "-" & ws1.Cells(1, j)

Next j

Next i

End Sub

Salut H2so4,

Merci beaucoup pour ta réponse.

Effectivement que je me suis peut-être mal exprimé, mais ce n’est pas tout à fait le résultat attendu.

Je voudrais trouver toutes les possibilités de créer x/2 doublettes sur la base de x joueurs.

Ainsi si j’ai 6 joueurs à disposition, je voudrais trouver les x combinaisons de doublettes suivantes (si je ne fais erreur) :

Joueur 1 avec Joueur 2 / Joueur 3 avec Joueur 4 / Joueur 5 avec Joueur 6

Joueur 1 avec Joueur 2 / Joueur 3 avec Joueur 5 / Joueur 4 avec Joueur 6

Joueur 1 avec Joueur 2 / Joueur 3 avec Joueur 6 / Joueur 4 avec Joueur 5

Joueur 1 avec Joueur 3 / Joueur 2 avec Joueur 4 / Joueur 5 avec Joueur 6

Joueur 1 avec Joueur 3 / Joueur 2 avec Joueur 5 / Joueur 4 avec Joueur 6

Joueur 1 avec Joueur 3 / Joueur 2 avec Joueur 6 / Joueur 4 avec Joueur 5

Joueur 1 avec Joueur 4 / Joueur 2 avec Joueur 3 / Joueur 5 avec Joueur 6

Joueur 1 avec Joueur 4 / Joueur 2 avec Joueur 5 / Joueur 3 avec Joueur 6

Joueur 1 avec Joueur 4 / Joueur 2 avec Joueur 6 / Joueur 3 avec Joueur 5

Joueur 1 avec Joueur 5 / Joueur 2 avec Joueur 3 / Joueur 4 avec Joueur 6

Joueur 1 avec Joueur 5 / Joueur 2 avec Joueur 4 / Joueur 3 avec Joueur 6

Joueur 1 avec Joueur 5 / Joueur 2 avec Joueur 6 / Joueur 3 avec Joueur 4

Joueur 1 avec Joueur 6 / Joueur 2 avec Joueur 3 / Joueur 4 avec Joueur 5

Joueur 1 avec Joueur 6 / Joueur 2 avec Joueur 4 / Joueur 3 avec Joueur 5

Joueur 1 avec Joueur 6 / Joueur 2 avec Joueur 5 / Joueur 3 avec Joueur 4

Si j’ai 8 joueurs :

Joueur 1 avec Joueur 2 / Joueur 3 avec Joueur 4 / Joueur 5 avec Joueur 6 / Joueur 7 avec Joueur 8

……….

Joueur 1 avec Joueur 8 / Joueur 2 avec Joueur 7 / Joueur 3 avec Joueur 6 / Joueur 4 avec Joueur 5

Il me semble en fait que ça ne devrait être qu’une adaptation de ton code pour les triplettes, mais comme je ne suis pas arrivé à ‘’y entrer’’, je n’arrive pas à voir ce qu’il faut modifier.

Amicalement.

Rechercher des sujets similaires à "regroupement objets"