Générer combinaisons sans ordre

Bonjour à tous !

Voilà mon soucis, après avoir cherché quelques heure sur le net je n'arrive pas à réaliser ce que je souhaite (fonction décaler, macro, etc... pas de résultat probant).

La pratique (pour comprendre l'intérêt du fichier) :

Un ouvrier pratique 3 tâches par jours. Chaque tâche est associée à une valeur de sécurité.

Au démarrage du chantier, son chef dresse la liste des taches parmi une liste prédéfinie (allant de 1 à 30 mais qui augmentera à l'avenir).

Il sélectionne donc X taches (disons 10 maximum, on ne dépassera sans doute pas cette quantité).

La feuille doit pouvoir lui générer touts les combinaisons de taches journalières possible, peut importe l'ordre.

Un autre onglet fera ensuite le calcul des valeurs de sécurité pour chaque journée et renverra en rouge les combinaisons interdites (dont la valeur dépasse un seuil).

Pour résumer simplement.

La macro à trouver :

L'opérateur dispose d'une colonne avec une liste déroulante de choix (chiffres de 01 à 30).

On sélectionne jusqu'à 10 valeurs (sans doublons) une valeur par ligne, par exemple :

01

03

12

25

L'opérateur clique sur la macro, et ça génère les combinaisons possibles, en renvoyant une valeur par colonne, sur 3 colonnes donc, par exemple :

01 / 01 / 01

01 / 01 / 03

01 / 01 / 12

etc...

Mais peut importe l'ordre, ce qui limite les combinaisons, c'est à dire qu'ici, par exemple :

01 / 12 / 25

est la même chose que :

25 / 12 / 01

Car derrière je créerai une formule de calcul du genre 01+12+25 (suivant les valeurs de sécurité associées).

Auriez vous des idées pour m'aider ?

D'avance merci.

Bonjour,

oui c'est tout à fait faisable, mais je doit te mettre en garde. L'ayant déjà fait auparavant pour le même type de problème, la durée de traitement de cette macro peut être extrêmement long. Vraiment.

Le nombre de possibilité à 10 taches n'est pas énorme(1000 de tête) à 30 tu seras deja à 27 000.

Bref, la méthode à suivre c'est d'imbriquer des boucles. Dans le cas qui t’intéresse, tu veux trois valeur parmis 10 taches. il te faut donc imbriquer 3 boucles qui iront de la première à la dernière tache.

Sub Distribution()

Dim tache1 As Long, tache2 As Long, tache3 As Long
Dim numLigne As Long
Dim tabEntreeTache() As Variant
Dim nbTaches As Long
Dim nbSortieDistrib As Long
Dim tabSortieTache() As Variant

'On cherche le nombre de taches
nbTaches = ThisWorkbook.Sheets("feuil1").Range("A65536").End(xlUp).Row

'On recupere le nom des taches
tabEntreeTache = ThisWorkbook.Sheets("feuil1").Range("A1:A" & nbTaches).Value

'on va calculer le nombre de soluces possible, ici c'est spécifique à 3 mais c'est largement adapatble

nbSortieDistrib = nbTaches ^ 3

'On dimenssione le tableau de sortie
ReDim tabSortieTache(nbSortieDistrib, 2) As Variant

'Et on génere les possibilités

For tache1 = 1 To nbTaches
    For tache2 = 1 To nbTaches
        For tache3 = 1 To nbTaches

        tabSortieTache(numLigne, 0) = tabEntreeTache(tache1, 1)
        tabSortieTache(numLigne, 1) = tabEntreeTache(tache2, 1)
        tabSortieTache(numLigne, 2) = tabEntreeTache(tache3, 1)

        numLigne = numLigne + 1
        Next tache3
    Next tache2
Next tache1

'Fin de la génération des possibilités, on colle le tableau

ThisWorkbook.Sheets("feuil1").Range("C1:E" & nbSortieDistrib).Value = tabSortieTache

End Sub

Met les taches a exécuter en colonne A. Tu peux aller plus loins que 10! Et tu peux aussi appeler tes taches par leurs noms. Tu as les commentaires pour adapter.

Dit moi ce que ça donne de ton coté!

Yann

Merci beaucoup Yann pour ta solution !

Je l'ai adaptée à ma feuille mais quelques soucis subsistent :

Mes données d'entrées ne démarrent pas à A1 mais A11, en faisant les modif j'ai des erreurs sur la macro.

S

'On cherche le nombre de taches

nbTaches = ThisWorkbook.Sheets("entrants").Range("A11:A65536").End(xlUp).Row

'On recupere le nom des taches

tabEntreeTache = ThisWorkbook.Sheets("entrants").Range("A11:A" & nbTaches).Value

J'ai donc créé une feuille annexe qui démarre à A1 et reprend les valeurs, mais là problème il y'a des vides qui entrent dans le tableau.

J'ai utilisé cette formule sur le nouvel onglet : =SI(Entrants!A11="";"";Entrants!A11) que j'ai fait glisser sur 10 lignes.

Enfin, est-ce possible de filtrer les doublons, car j'ai beaucoup de solutions et dans mon cas la combinaison 1/1/2 est la même que 2/1/1 donc pas besoin de la répéter.

bonjour,

une autre proposition, liste des taches en colonne 1, sélection des taches par un x en colonne 2

Sub aargh()
    Dim t() ' tableau des taches sélectionnées
    i = 1
    'on remplit le tableau, sélection des taches avec x en colonne 2
    With Sheets("sheet1")
    While .Cells(i, 1) <> ""
        If UCase(.Cells(i, 2)) = "X" Then
            k = k + 1
            ReDim Preserve t(k)
            t(k) = .Cells(i, 1)
            End If
            i = i + 1

        Wend
        ' génération des combinaisons
        taches 3, t, li

        End With
    End Sub
Sub taches(n, t, ByRef li, Optional niveau = 1, Optional ci = 0, Optional s = "")
' n nombre d'éléments dans la combinaison
' t tableau des valeurs possibles (commence t(1))
' li nombre de combinaisons trouvées
' niveau nombre d'élements en cours
' numéro de la tache en cours
' s liste des taches (séparées par une ,)
    For i = ci + 1 To UBound(t)
        If s = "" Then s = t(i) Else s = s & "," & t(i)
        If niveau = n Then 'on a une combinaison de taches complète
            li = li + 1
            Worksheets("taches").Cells(li, 1).Resize(, n) = Split(s, ",")
        Else 'sinon on cherche une nouvelle tache à ajouter
            taches n, t, li, niveau + 1, i, s
        End If
        k = InStrRev(s, ",")
        If k <> 0 Then s = Left(s, k - 1) Else s = ""
    Next i
End Sub
44niko35.xlsm (16.93 Ko)

Re-bonjour

Modifie la macro comme suis alors :

'On cherche le nombre de taches
nbTaches = ThisWorkbook.Sheets("feuil1").Range("A65536").End(xlUp).Row

'On recupere le nom des taches
tabEntreeTache = ThisWorkbook.Sheets("feuil1").Range("A11:A" & nbTaches).Value

nbTaches = nbTaches - 10

Pour le premier problème ça devrait être réglé. Pour le deuxième, je suis un peu embêté. Je cherche, mais j'avoue que j'ai pas beaucoup d'idée.. ^^


Re-re bonjour (et bonjour h2So4! )

C'est bon, j'ai ton code! Il ne fais pas de doublons!

Sub Distribution()

Dim tache1 As Long, tache2 As Long, tache3 As Long
Dim numLigne As Long
Dim tabEntreeTache() As Variant
Dim nbTaches As Long
Dim nbSortieDistrib As Long
Dim tabSortieTache() As Variant

'On cherche le nombre de taches
nbTaches = ThisWorkbook.Sheets("feuil1").Range("A65536").End(xlUp).Row

'On recupere le nom des taches
tabEntreeTache = ThisWorkbook.Sheets("feuil1").Range("A11:A" & nbTaches).Value

nbTaches = nbTaches - 10

'on va calculer le nombre de soluces possible, ici c'est spécifique à 3 mais c'est largement adapatble

nbSortieDistrib = nbTaches ^ 3

'On dimenssione le tableau de sortie
ReDim tabSortieTache(nbSortieDistrib, 2) As Variant

'Et on génere les possibilités

numLigne = 0
For tache1 = 1 To nbTaches
    For tache2 = tache1 To nbTaches
        For tache3 = tache2 To nbTaches

        tabSortieTache(numLigne, 0) = tabEntreeTache(tache1, 1)
        tabSortieTache(numLigne, 1) = tabEntreeTache(tache2, 1)
        tabSortieTache(numLigne, 2) = tabEntreeTache(tache3, 1)

        numLigne = numLigne + 1
        Next tache3
    Next tache2
Next tache1

'Fin de la génération des possibilités, on colle le tableau

ThisWorkbook.Sheets("feuil1").Range("C1:E" & nbSortieDistrib).Value = tabSortieTache

End Sub

Dit moi ce que ça donne!

ça fonctionne parfaitement Yann, merci beaucoup !

j'ai aussi testé avec des entrants dans le désordre (05, 02, 15) et ça marche aussi, c'est magique

h2So4 merci aussi pour ta solution, j'ai plus de mal à la comprendre et à l'appliquer à ma feuille, mais merci quand même !

C'est parfait!

Content d'avoir pu t'aider! Passes une bonne journée!

Yann

Rechercher des sujets similaires à "generer combinaisons ordre"