Creation de Sequence

re,

alors on a besoin d'un tableau avec tout ce qu'on a en stock, eventuellement avec leur prix, pour chosir la solution la moins chère ... . C'est possible cela ?

Je pense qu'il n'y a pas de problème de prix mais il faudrait effectivement une feuille 'Résultats regroupés' plus réaliste pour se faire une idée plus générale du problème.
Y a-t-il un choix de largeurs de rouleaux de base et où se trouve-t-il ?

...si j'ai bien compris le bazar, hein!

EDIT : y a-t-il un tableau de commandes de clients à partir duquel planifier une cession-machine en fonction de la date de livraison demandée?

beh, si on n'a pas le prix, on considère le rendement, donc la surface utilisée / la surface du rouleau, mais si on a aussi le prix unitaire, c'est 2 oiseaux avec 1 coup.

Voir exemple, on fait le choix pour le premier rouleau, donc on fait essaie tous les rouleaux en stock et Excel choisit pour chaqu'un la meilleur première option. Le rouleau "450", c'est la solution la moins chère par cm utile, cad 0.2273€/cm, donc on prend ce rouleau t on enlève 1 élément 230 et un élément 210 du "regroupé" et 1 rouleau du stock. Puis on fait cela jusqu'au moment où tout est traité.

j'ai ralenti la macro, parce qu'elle est prêt quasi instantanément

Nulle part, OlivCoco ne parle prix.
Le seul critère à respecter est le choix du mandrin.
Chaque commande doit respecter le même mandrin (outil de découpe?) .
Si tu as une commande de 50cm et une autre de 75cm, et que tu as en stock un rouleau brut de 130 cm (par exemple), c'est préférable d'utiliser un rouleau de base de 130 cm qui se rapproche plus de la somme des deux lignes : 50 + 75 = 125 cm.
Donc, ici, le rouleau de 450 cm ne se justifie pas.

...si j'ai bien compris le bazar, encore une fois!

Je répète ma question et si j'ai bien compris: y a-t-il un tableau avec ces rouleaux de matière brute en stock quelque part ?

Bonjour à tous 🙂

C'est quand même pas difficile de nous représenter le problème sous forme d'images, notamment sur la question des mandrins.

thumbnail

klin89

Encore une fois, je n'ai pas la science infuse et je manque de certitude mais je pense qu'à chaque section, la machine coupe toute la largeur du rouleau.

image

Bonjour

je n'ai jamais parler de prix
j'ai simplement une machine qui produit une matiere qui peux etre enrouler en bobines

la largeur de la machine varie en fonction du produit cela peux etre de 3500mm à 4620mm cette valeur est ajustable mais l'idée est d'être toujours au plus pres du maximun sachant que la vitesse de productino est la meme normal à 3500mm je produirai moins que à 4620mm
ensuite au moment de la decoupe nous faisons des largeurs differente
exemple laize de production 4400mm pour produire 4300mm + 2100mm = 4400mm
ensuite je peux faire 2100+2100 =4200mm
ou 1750+2100=3850mm
La longeur de bobine peux vairaer en fonction du client comme les mandrins c'est pour cela qu'on eviter de melanger les mandrins et les longueur des bobines
example
seq1 7800ml position 1 4300mm position 2 2100mm sot une largeur de 4400mm
7800ml parce que chaque bobines fait 1300 donc 1300*6=7800ml toujours des multiple de la longuer des bobines( ici 1300m
j espere que c'est plus claire
sinon pour le regoupement cela fonctionne je n'ai pas besoin sauf si vous vouler travailler en nombre de bobines

Salut Olivcoco,

comme tu es là...
Je demandais si il y avait un tableau avec le stock de bobines brutes (et leurs largeurs) pour pouvoir choisir la meilleure solution en fonction des commandes?
Y a-t-il aussi un tableau avec ces commandes en attente? Peut-on y choisir le planning?
Ou faut-il simplement exécuter une commande que tu élabores toi-même?
Bref, relis les discussions en amont et vois ce qui pourrait nous servir.

Plus on a d'infos, plus on peut visualiser la chose.

A+

Bonjour

je n'ai pas de largeur brute
quand on lance une production cette largeur est ajustable en fonctionne des largeur demander
sauf qu'on ne peut pas lancer pour une largeur tout petite on essaye de toujours travailler en largeur max de la machine
l'ideal c'est - 1000mm de la largeur max 4620mm cette valeur de 4620 peut varier en fonction des produits qu'on lance c'est pour cela dans le fichier on connait toujours la largeur max

ne gerer pas le regroupement je gere je voudrais de l'aider que que la partie sequence.

Salut Olivcoco,

ton dernier plan de coupe va du plus large au plus étroit sans vraiment chercher l'optimisation ou je me trompe?
Le fait de changer les couteaux de position souvent est-il un frein à ton travail ou non?

Cela dit, en parcourant ça et là, c'est hard comme truc!

A+

Bonjour Curulis
oui je vais du plus large au plus étroit mais en cherchant au maximum de travailler le plus large possible
l'ideal est de minimiser le changement de ciseaux
je peux avoir une sequence avec une seul levée si généralement il y a qu'un seul rouleaux a faire
par contre je peux dépasser de 20% les qty mettrage demandé (l ideal c'est de demandé si j'autorise avec une boite de dialogue me le demandant en inscrivant le numéro d'artilce associé dans la boite de dialogue si possible)
je sais que c'est hard

On passe beaucoup de temps pour faire les sequences.
de mon coté j'essaye de le faire aussi
voici mon dernier scrip
Pour l'instant je n'ai pas trier par plus large au plus etroit pour l'instant je creer les seq

Sub GenererSequences()
    Dim wsResultats As Worksheet
    Dim wsSequence As Worksheet
    Dim i As Long, seq As Long
    Dim largeurMax As Double
    Dim metrageDemande As Double
    Dim positions() As Double
    Dim rouleauxLargeurs() As Double
    Dim rouleauxLongueurs() As Double
    Dim rouleauxCount As Long
    Dim positionIndex As Long
    Dim currentWidth As Double
    Dim totalMetrageMachine As Double
    Dim totalLargeur As Double
    Dim totalRouleaux As Long
    Dim metrageRestantDict As Object
    Dim metrageRestant As Double
    Dim k As Long
    Dim ligneTraitee As Boolean
    Dim derniereSequence As String
    Dim sequenceActuelle As String

    ' Initialiser le dictionnaire pour suivre le métrage restant
    Set metrageRestantDict = CreateObject("Scripting.Dictionary")

    ' Vérifier si la feuille "Résultats Regroupés" existe
    On Error Resume Next
    Set wsResultats = ThisWorkbook.Sheets("Résultats Regroupés")
    On Error GoTo 0
    If wsResultats Is Nothing Then
        MsgBox "La feuille 'Résultats Regroupés' n'existe pas.", vbCritical
        Exit Sub
    End If

    ' Créer ou réinitialiser la feuille "Séquence"
    On Error Resume Next
    Set wsSequence = ThisWorkbook.Sheets("Séquence")
    On Error GoTo 0
    If Not wsSequence Is Nothing Then
        wsSequence.Cells.Clear ' Réinitialiser si la feuille existe
    Else
        Set wsSequence = ThisWorkbook.Sheets.Add(After:=wsResultats)
        wsSequence.Name = "Séquence"
    End If

    ' Ajouter les en-têtes à la feuille "Séquence"
    wsSequence.Cells(1, 1).Value = "SEQ"
    wsSequence.Cells(1, 2).Value = "Largeur totale"
    wsSequence.Cells(1, 3).Value = "Métrage machine par position"
    For i = 4 To 13
        wsSequence.Cells(1, i).Value = "Position " & i - 3
    Next i

    ' Initialiser la variable de séquence
    seq = 1
    derniereSequence = ""

    ' Parcourir chaque ligne dans la feuille "Résultats Regroupés" pour initialiser le dictionnaire
    Dim RowCount As Long
    RowCount = wsResultats.Cells(wsResultats.Rows.Count, 1).End(xlUp).Row
    For i = 2 To RowCount
        metrageRestantDict(i) = wsResultats.Cells(i, 8).Value ' Colonne 8 contient le métrage demandé
    Next i

    ' Boucle principale pour créer les séquences
    Do While metrageRestantDict.Count > 0
        totalLargeur = 0
        totalMetrageMachine = 0
        totalRouleaux = 0
        currentWidth = 0
        positionIndex = 1
        ReDim positions(1 To 10) ' Réinitialisation des positions
        sequenceActuelle = ""

        ' Parcourir les lignes pour ajouter à la séquence actuelle
        For i = 2 To RowCount
            ' Ignorer si le métrage restant est nul ou la ligne a déjà été traitée
            If Not metrageRestantDict.exists(i) Then GoTo NextRow
            If metrageRestantDict(i) <= 0 Then
                metrageRestantDict.Remove i
                GoTo NextRow
            End If

            ' Initialiser les variables pour la ligne actuelle
            largeurMax = wsResultats.Cells(i, 1).Value
            metrageRestant = metrageRestantDict(i)

            ' Récupérer les largeurs et longueurs des rouleaux
            rouleauxCount = 0
            Do While wsResultats.Cells(i + rouleauxCount, 4).Value <> ""
                rouleauxCount = rouleauxCount + 1
            Loop

            ReDim rouleauxLargeurs(1 To rouleauxCount)
            ReDim rouleauxLongueurs(1 To rouleauxCount)
            For k = 1 To rouleauxCount
                rouleauxLargeurs(k) = wsResultats.Cells(i + k - 1, 4).Value
                rouleauxLongueurs(k) = wsResultats.Cells(i + k - 1, 6).Value
            Next k

            ' Calcul de la largeur totale et du métrage pour la ligne actuelle
            ligneTraitee = False
            For k = 1 To rouleauxCount
                If currentWidth + rouleauxLargeurs(k) <= largeurMax And positionIndex <= 10 Then
                    ' Ajouter le rouleau à la séquence
                    currentWidth = currentWidth + rouleauxLargeurs(k)
                    positions(positionIndex) = rouleauxLargeurs(k)
                    positionIndex = positionIndex + 1
                    totalRouleaux = totalRouleaux + 1
                    totalMetrageMachine = totalMetrageMachine + rouleauxLongueurs(k)
                    ligneTraitee = True
                End If
                If ligneTraitee Then Exit For
            Next k

            ' Construire la séquence actuelle sous forme de chaîne
            sequenceActuelle = sequenceActuelle & currentWidth & ";"

            ' Mettre à jour le dictionnaire
            If ligneTraitee Then
                metrageRestantDict(i) = metrageRestantDict(i) - rouleauxLongueurs(1)
                If metrageRestantDict(i) <= 0 Then metrageRestantDict.Remove i
            End If

NextRow:
        Next i

        ' Vérifier si la séquence actuelle est identique à la dernière
        If sequenceActuelle = derniereSequence Then
            ' Ajouter le métrage machine à la séquence existante
            wsSequence.Cells(seq, 3).Value = wsSequence.Cells(seq, 3).Value + totalMetrageMachine / totalRouleaux
        Else
            ' Diviser le métrage machine par le nombre de positions utilisées
            Dim metrageParPosition As Double
            If totalRouleaux > 0 Then
                metrageParPosition = totalMetrageMachine / totalRouleaux
            Else
                metrageParPosition = 0
            End If

            ' Ajouter une nouvelle séquence dans la feuille "Séquence"
            wsSequence.Cells(seq + 1, 1).Value = "SEQ " & seq
            wsSequence.Cells(seq + 1, 2).Value = currentWidth
            wsSequence.Cells(seq + 1, 3).Value = metrageParPosition
            For k = 1 To 10
                If k <= totalRouleaux Then
                    wsSequence.Cells(seq + 1, k + 3).Value = positions(k)
                Else
                    wsSequence.Cells(seq + 1, k + 3).Value = ""
                End If
            Next k

            ' Passer à la séquence suivante
            seq = seq + 1
        End If

        ' Mettre à jour la dernière séquence
        derniereSequence = sequenceActuelle
    Loop

    MsgBox "Les séquences ont été générées avec succès dans la feuille 'Séquence'.", vbInformation
End Sub

Bonjour

pourquoi on ne travaillerai pas avec une variable pour un numéro d'article et que dans cette variable on retrouve le nombre de rouleau a produire

au maximun on peut avoir 30 articles different

et le programme pioche dans chaque variable pour trouver la meilleur combinaison possible

en décomptant cette variable quand une sequence est créer et a la fin il rassemble toutes les sequence qui se ressemble en utilisant les meme numéro d'article

avoir

Salut OlivCoco,

J'arrive à quelque chose mais avant toute chose, n'y a-t-il pas une erreur dans ton dernier fichier envoyé ?
Si je calcule bien, le rouleau 175 fait un total de 23400 + 16900 = 40300 or ton 'Résultats regroupés' n'en prévoit que 23950.

image image

Partant de là, j'ai élaboré un système à peaufiner qui me donne ceci dans ce cas de figure-ci.
- en [J], un rappel du nombre de bobines nécessaires pour le métrage souhaité
- en [K], la largeur souhaitée
- en [L] la longueur totale en fonction des doublons éventuels (ex : 175)
- en [M], encore le nb. de bobines nécessaires d'où sera soustrait les bobines de séquence en séquence
- ensuite, les séquences et le nb de bobines utilisées par séquence.

image

Et un petit bouton rouge en 'Résultats regroupés' pour démarrer tout ça à volonté.
Pas encore d'affichage en 'Séquences'

Do While [ROL] > 0
    iLg = 0
    iCol = Cells(2, Columns.Count).End(xlToLeft).Column + 1
    For x = 1 To 2
        For y = 0 To Dico.Count
            If x = 1 Then
                Cells(y + 2, iCol) = "-"
                If Cells(y + 2, 13) > 0 And iLg + Cells(y + 2, 11) <= iMax Then _
                    iLg = iLg + Cells(y + 2, 11): _
                    Cells(y + 2, iCol) = Cells(y + 2, 13)
            Else
                If Cells(y + 2, iCol) <> "-" Then _
                    Cells(y + 2, iCol) = iMin: _
                    Cells(y + 2, 13) = Cells(y + 2, 13) - iMin
            End If
        Next
        iMin = WorksheetFunction.Min(Range(fctCol(iCol) & "2:" & fctCol(iCol) & iRow))
    Next
Loop

On regarde ça demain?

A+

5olivcoco.xlsm (37.92 Ko)

re, salut Curulis,

par une forme de paresse (refus de réinventer l'eau chaude), je vous propose un contournement vers Opticutter. La macro "Opticutter" prépare un fichier "xlsx" qu'on peut importer dans Opticutter et puis on calcule le résultat

lien : https://www.opticutter.com/cut-list-optimizer/edit#form

on clicque sur ce bouton "import" et on sélectionne le dernier fichier "Olivcoco_Cahier_de_charge_YYMMDD_HHMMSS"

image

Alors, on voit le même cahier de charge (évntuellement on peut modifier encore des choses là) et on n'a qu'à pousser sur le bouton "Calculate"

image

Quand je comprends bien la solution de Curulis, on a besoin de 46 rouleaux de 1300x450. Cette solution vous propose une solution avec 35 rouleaux (pour compliquer les choses, j'avais 4 sortes de rouleaux dans mon stock primaire et Opticutter a utilisé les 4). On peut imprimer le résultat ou exporter de nouveau vers Excel

14opticutter.pdf (149.67 Ko)
7olivcoco-1.xlsm (46.11 Ko)

Salut OlivCoco,

amélioration, j'espère...
À toi d'essayer sur plusieurs scenarios.
Avant chaque séquence de découpe, je trie le tableau en mettant en tête les éventuels doublons de solde de bobines, histoire de rassembler au max les découpes de même longueur totale restantes.

Do While [ROL] > 0
    iLg = 0
    iCol = Cells(2, Columns.Count).End(xlToLeft).Column + 1
    Range("J2").FormulaLocal = "=SI($M2=0;0;NB.SI($M$2:$M$" & iRow & ";$M2" & "))"
    Range("J2:J" & iRow).FillDown
    Range("J2").Resize(iRow, iCol - 9).Sort _
        key1:=Range("J2"), order1:=xlDescending, _
        key2:=Range("K2"), order2:=xlDescending, _
        Orientation:=xlTopToBottom, Header:=xlNo

Toujours pas de résultats en 'Séquences' mais c'est un détail!
À tester!

A+

5olivcoco.xlsm (38.41 Ko)

Salut OlivCoco,
Salut les as,

presque peur de dire avoir trouvé une solution fonctionnelle même si le côté optimisation extrême n'est pas encore rencontré!
Une chose à la fois!
Je t'envoie ceci et, dans la foulée, après de petites tâches bricolo-bricola domestiques, je m'attacherai à l'affichage des résultats dans la feuille 'Séquences'.

J'oubliais : certains chiffres des séquences ont une fonte en couleurs :
- vert = la même largeur demandée est doublée sur la largeur MAX
- rouge = la même largeur demandée est triplée sur la largeur MAX

A+

12olivcoco.xlsm (36.57 Ko)

re,

one-man-show ,

37 rouleaux et 5 coupes, c'est déjà bien ça !

Salut OlivCoco,

version avec affichage des résultats en 'Séquence' et petit tableau STATS.
Prochaine étape : optimiser les positions de chaque séquence pour réduire au max les changements de ciseaux.

A+

8olivcoco-v2.xlsm (42.92 Ko)

Bonjour Curulis
excuse moi mais je viens de voir le résultat

c'est tres bon job je te félicite.

* Premier remarque mais je ne pense pas que je vous l'avais dit

j'évite de faire qu'une seul levée sauf si il y a 1 rouleau à faire ( généralement c'est un essai)
minimum par levée 3 ou 4
* Deuxièmes remarque mais je ne pense pas que je vous l'avais dit

on peut faire au max 10% voir 20% de plus par reference pour éviter de faire des sequence moins large dans le fichier j'ai mis un autre exemple dans votre résultat

il a créé une seq 7 3x 104 il aurais pu mettre +500m dans la seq 6 en 4*104

idem dans la seq 5 il aurai pu faire +500 m dans la seq 3

l'ideal pour moi c'est qu'il envoie une fenêtre de dialogue pour me le signaler ça serai le top.

* troisieme remarque mais qui est facile a faire est de trier les seq a la fin du plus grand au plus petit

et encore un Grand merci

9olivcoco-v2-1.xlsm (52.96 Ko)
Rechercher des sujets similaires à "creation sequence"