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
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 SubBonjour
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.
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.
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
LoopOn regarde ça demain?
A+
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"
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"
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
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:=xlNoToujours pas de résultats en 'Séquences' mais c'est un détail!
À tester!
A+
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+
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+
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

