VBA - résolution problème pour mettre des palettes dans un camion
Bonjour,
Vous avez tous réussi à m'aider et je n'osais pas demander pour de l'aide encore une fois mais je me heurte à un problème trop grand.
Donc pour situer le problème, voici le contexte :
J'ai créer des colis avec des dimensions spécifiques que j'ai ensuite rassembler par dimensions (jusque ici tout marche bien). Et maintenant j'aimerais créer un nombre de camions optimisé pour permettre de livrer tout les colis.
Je me heurte à un problème : le travail avec 3 variables (Longueur, Largeur et Hauteur) n'est pas vraiment mon fort...
La largeur est de 1200 et ne change presque pas donc peut être considéré comme un nombre et non une variable. Mon plus gros soucis étant qu'il y a donc deux "lignes" de colis puisqu'on peut mettre deux colis côte à côte dans un camion.
Je vous mets le fichier en pièce-jointe et reste dispo pour toute question.
Merci d'avance.
Bonjour
ça fonctionne comment ?
Remarques : Comme je vous ai signalé das un autre fil mettez toutes vos SUB dans un module et pas dans Thisworkbook. Elle n'ont rien à faire à cet endroit.
Cordialement
D'accord, mais quels est la différence entre le Workbook et les modules ?
Alors pour a feuille, je vais vous expliquer en plusieurs étapes :
1- Feuille("Données_d'entrée") : On clique sur le bouton Nb de panneaux par colis, on renseigne le nombre de ligne (ici 3) et on fait plusieurs fois OK pour valider le nombre de panneuax par colis.
2- Feuille ("Colisage") : On clique sur la macro Actualiser (Il y a une forme caché donc cliquer sur le texte en haut à gauche) et on clique sur NON. Cela nous donne tout les colis qui sont créer.
3- Feuille ("Colisage") : Décaler vous dans la feuille et cliquer sur le bouton "Créer tableau". Cela regroupe les colis en double
4- Feuille ("Colisage") : copier/coller le tableau obtenu dans la case W6 et cliquer sur le bouton au dessus. Cette macro rassemble tout les colis identique. et incrémente une case pour spécifier leur nombre.
5- Feuille ("Plan_de_chargement") : J'aimerais dans cette feuille qu'une macro me mette automatiquement les colis dans un camion. Il y a bien évidement des contraintes de taille pour le colis en le camion (feuille Données). Idéalement on aurais le choix si on veut un ordre particulier ou non.
Mes plus gros soucis étant que je travail en "3D" et que les contraintes du camion peuvent changer car des colis sont trop haut pour un camion classique.
Bien sur dans un premier temps si on arrive à faire que pour un camion classique ca me suffira amplement.
Pour l'instant j'ai fait ce code mais je ne pense pas qu'il soit bon et j'avoue que je me noie sous la complexité :
Sub N032_Modification()
Dim NbColis_Restant, NbdeColis, NbCamion_Complet, NbColis_P1, NbColis_P2, N°Camion As Integer
Dim c, X As Integer
Dim Longueur, LongueurComplétéee As Integer
Dim Sh As Worksheet
NbColis_P1 = NbColis_P2 = 6
Set Sh = Worksheets("Colisage")
Longueur = 13600 * 2
LongueurComplétée = 0
a = 6
v = 1
N°Camion = 1
F = 6
'Donne le nombre de camion complet que je peux faire avec le type de colis sélectionné
Do While Sh.Cells(a, 26).Value <> ""
a = a + 1
Loop
a = a - 1
For c = 6 To a
If Sh.Cells(c, 24).Value <> "" Then
If LongueurComplétée <> 0 Then
Do Until Sh.Cells(c, 24).Value * Y > (Longueur - LongueurComplétée)
Y = Y + 1
Loop
Y = Y - 1 'Donne le nombre de colis Y que je peux mettre dans le camion incomplet
Else
Do Until Sh.Cells(c, 24).Value * X > (Longueur - LongueurComplétée)
X = X + 1
Loop
X = X - 1 'Donne le nombre de colis X que je peux mettre dans un camion vide
End If
'Ecrit le numéro du colis avec le bon nombre trouvé ci-dessus
NbCamion_Complet = Int(Sh.Cells(c, 28) / X)
If NbCamion_Complet >= 1 Then
For b = 6 To NbCamion_Complet + 5
Sheets("Plan_de_chargement").Cells(F, 1).Value = "Camion" & "-" & N°Camion
N°Camion = N°Camion + 1
F = F + 1
Next b
Else
End If
NbColis_Restant = Sh.Cells(c, 28) - NbCamion_Complet * X
If NbColis_Restant = 0 Then
'Si cela enlêve tout les colis alors on ne fait rien et on passe au chiffre suivant
Else
' on ajoute les colis restant dans un autre camion
Sheets("Plan_de_chargement").Cells(F, 1).Value = "Camion" & "-" & N°Camion
N°Camion = N°Camion + 1
F = F + 1
End If
'Sinon on calcule la longueur déjà complêtée
LongueurComplétéee = Sh.Cells(c, 24) * NbColis_Restant
End If
Next c
End Sub
Il y aurai aussi une contrainte client à prendre en compte avec (c'est que j'ai pensé) un camion type à créer et qui est répété indéfiniment.
UPDATE : J'ai changer de technique et ai réussi à avoir un résultat assez convenable. Seul problème, les camions ne se complête pas (valeur de camion 1 supérieur au nombre max de colis par camion). Les noms sont donc les mêmes mais dans la réalité, il s'agit de camions différent.
J'aimerais pouvoir changer ca en mettant une condition de remplissage de camion.
Dans la feuille partagé : aller dans Plan_de_chargement puis cliquer sur Bouton 1, La macro s'appelle N07_Création_Camion. Vous aurez ce que je trouve. ce que je voudrais est du même style mais avec le bon nombre de camions...
Fichier voir post suivant --> https://forum.excel-pratique.com/s/goto/1022949
Bonjour
Je passe sur ce fil à la suite du fil précédent --> https://forum.excel-pratique.com/excel/listbox-copier-des-lignes-a-plusieurs-colonnes-vers-des-cellu...
Peut être pourriez-vous reprendre votre post précédent et changer le fichier pour ne pas poster deux fois la version 10 ?
Si soucis je peux aussi supprimer le fichier V10 au profit du nouveau
Cordialement
Edit : Vous pouvez déjà modifier ce code dans votre fichier. Evitez les accents en VBA dans les noms de code.
D'ailleurs c'est aussi valable pour les noms de feuilles de même que les espaces. Exemple votre feuille Données_d'entrée appelez la plutôt comme ceci --> Donnees_entree ou Entree_Donnees
Sub N071_Supprimer_Creation_camion()
Dim dlg As Integer
Application.ScreenUpdating = False
With Sheets("Plan_de_chargement")
dlg = .Range("A" & Rows.Count).End(xlUp).Row
.Range(.Cells(6, 1), .Cells(dlg, 6)).Delete shift:=xlUp
End With
Application.ScreenUpdating = True
End SubOui absolument, je vais vous transmettre le fichier le plus récent ce sera plu simple pour nous deux.
D'accord, j'y penserais à l'avenir à ne pas mettre d'accent. Soit dit en passant cela s'entend car il s'agit de caractère spéciaux.
J'ai supprimé la version V10 dans votre post précédent (cela ne sert à tien d'alourdir le forum dans ce cas)
- Dans votre nouveau fichier, vous n'avez pas mis le code que j'avais donné dans mon post précédent. Vous avez testé ? Si ok je le change déjà
- Dans la feuille Colisage, en colonne B vous avez des doublons. Je suppose que c'est une erreur ?
- Un autre point que j'avais aussi vu. Vous pourriez supprimer les Userform Nb Ligne et panneaux au profit d'une INPUBOX. Y avez-vous pensé ? Cela me parait plus simple dans votre cas.
Pour le point qui concerne le fil pour la création Camion,....
Edit :
Voici déjà 2 questions :
1. variable e : e = 5 au départ, puis plus bas vous dites e = e + 1 ... ce qui revient à mettre la valeur de c qui part de 6. Cette variable e ne sert pas et pourrait être remplacée par la variable c. A vérifier notamment lorsque C = 6 au début de la boucle For c = 6 to... et où le code va directement à cette ligne --> 'Création de camion complet (=X)
2. variable X : Au début vous déclarez X = Int((13600 * 2) / Sh.Cells(c, 24).Value). Vu que la variable longeur_restante est de 27200 et que 13600 x 2 = 27200, pourquoi ne pas mettre ceci -> X = Int(Longeur_Restante / Sh.Cells(c, 24).Value) ?
Oui allez-y, je n'y vois pas de problème. Mais comment pouvez-vous supprimer des fichiers ?
Oui je ne l'avais pas mis car j'étais pressé hier soir. Mais je ne comprend pas bien pourquoi je dois modifier ma suppression de création de camion ?
La colonne B comporte des doublons et c'est normal, il s'agit des colis incomplet qui sont compléter par un deuxième type de panneaux. donc cela fait Colis 7 : 2 x Type1 puis Colis 7 : 4 x Type2. Les doublons sont rassemblé ensuite dans le premier tableau de droite.
Je ne sais pas si des INPUTBOX serait vraiment plus simple. Certes cela nécessiterais moins de clique mais le plupart du temps, le nombre max de colis sera demandé donc plus rapide de maintenir entrée pour tout passer.
Je vous avoue que ca m'as pris la tête pendant 2 jours sans avancer d'un poil. Cependant, aujourd'hui j'ai réussi à faire un code qui marche et qui à l'air de marcher plutôt bien. Vous pouvez le trouver dans la macro "Création de camion". Le code est surement très enfantin mais il marche ahah
Pour l'utiliser vous pouvez cliquer sur le bouton "Création de camion" dans la feuille "Plan_de_chargement".
Maintenant l'enjeu est de modifier ce code pour le rendre plus automatique en changeant avec le type de camion sélectionné mais aussi en rajoutant les contraintes qu'il y a en hauteur et en largeur. En effet aujourd'hui je considère le camion comme un long rectangle avec une unité de colis en largeur.
1. Oui allez-y, je n'y vois pas de problème. Mais comment pouvez-vous supprimer des fichiers ?
Comme je suis modérateur, je peux intervenir sur les posts.
2. Oui je ne l'avais pas mis car j'étais pressé hier soir. Mais je ne comprend pas bien pourquoi je dois modifier ma suppression de création de camion ?
Je l'ai rajouté dans la version 13. Je n'ai pas compris au sujet de la suppression de camion....
3. La colonne B comporte des doublons et c'est normal, il s'agit des colis incomplet qui sont compléter par un deuxième type de panneaux. donc cela fait Colis 7 : 2 x Type1 puis Colis 7 : 4 x Type2. Les doublons sont rassemblé ensuite dans le premier tableau de droite.
Ok. Pas de soucis
4. Je ne sais pas si des INPUTBOX serait vraiment plus simple. Certes cela nécessiterais moins de clique mais le plupart du temps, le nombre max de colis sera demandé donc plus rapide de maintenir entrée pour tout passer.
C'est juste que cela vous évite d'avoir des userforms. Je ne vois pas l'utilité dans votre cas d'autant que vous n'avez qu'une seul rubrique par userform et que cela rend le fichier plus complexe. A voir plus tard si vous le voulez.
5. Pour l'utiliser vous pouvez cliquer sur le bouton "Création de camion" dans la feuille "Plan_de_chargement".
Oui je l'ai fait et cela crée 8 camions. Est-ce correct dans le fichier ?
J'ai essayé de comprendre chaque ligne afin d'améliorer le code car c'est vraiment trop complexe surtout avec l'utilisation de toutes vos variables. D'ailleurs vous ne répondez pas à mes questions dans mon post précédent. A moins que vous vouliez que je fasse rien de ce coté.... ?
6. Mise en forme tableau
J'ai apporté une simplification dans le code pour la mise en forme du tableau. Faites ceci :
Dans le code Sub N07_Creation_Camion à la ligne en vert '-----MISE EN FORME DU TABLEAU-----, effacez toutes les lignes en dessous jusqu'au END SUB puis coller le code ci-dessous :
dlg = Sh2.Range("A" & Rows.Count).End(xlUp).Row
With Sh2.Range("A5:F" & dlg)
.BorderAround LineStyle:=xlContinuous
.BorderAround ColorIndex:=0
.BorderAround Weight:=xlMedium
With .Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = 0
.Weight = xlThin
End With
With .Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ColorIndex = 0
.Weight = xlThin
End With
End With
For c = 6 To dlg
If Sh2.Range("A" & c) <> Sh2.Range("A" & c - 1) Then
With Sh2.Range("A" & c & ":F" & c).Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.Weight = xlMedium
End With
End If
Next cfaites un test
1. D'accord je vois ca donne quelques avantages
2. Le code que vous m'avez demandé de rajouter est le code N071_Supprimer_création_camion. Sauf que j'ai déjà créer un code pour cette macro et elle marche bien. Donc je me demandais pourquoi est ce que vous en aviez créer un ? Y a-t-il une amélioration ?
4. Oui d'accord je vois, Je vais y réfléchir et m'y plonger car cela n'as pas l'air plus compliqué que des MsgBox. Mais je ne pense pas avoir besoin de votre aide là-dessus. Merci de m'avoir orienté !
5. Oui pardon j'ai zappé :
1. je pense en effet qu'on peut supprimer la variable e car pas utile.
2. Je ne pense pas que cela soit juste car X = Int((13600 * 2) / Sh.Cells(c, 24).Value) permet de calculer le nombre max de colis du type A (ou B ou C) que je peux mettre dans un camion. Ce X est utilisé ensuite en Ligne 714 pour créer un camion composé d'un seul type.
Mais c'est clair que maintenant que vous avez amené le sujet, on pourrais faire ca mais il faudrait changer le code un peu je pense. Pour que quand le camion est comple il recommence avec Longueur_Restante = 27200.
6. Merci ! Ca simplifie drôlement la longueur du code. Et c'est beaucoup plus facile à lire. Je vais changer ça pour tout le reste.
Point 2 : code N071_Supprimer_création_camion
Vous pouvez utiliser ce code-ci à la place (j'ai enlevé l'accent sur le nom Création - à éviter comme je vous ai dit avant)
Sub N071_Supprimer_Creation_camion()
Dim dlg As Integer
Application.ScreenUpdating = False
With Sheets("Plan_de_chargement")
dlg = .Range("A" & Rows.Count).End(xlUp).Row
.Range(.Cells(6, 1), .Cells(dlg, 6)).Delete shift:=xlUp
End With
Application.ScreenUpdating = True
End subPoint 5 : Variable X
- je n'ai pas dit de supprimer X mais simplement de changer la formule pour mettre Longueur_Restante à la place de 13600*2. cette idée parce que quelques lignes avant vous déclarez Longueur_restante = 27200. Mais ok
J'aborde les points suivants dans le code création :
1. Lorsque vous mettez cette ligne --> Dim Sh, Sh2 As Worksheet seule la variable sh2 est de type Worksheet. La variable sh est de type Variant. Ceci est plus correct --> Dim Sh as worksheet, Sh2 As Worksheet. Idem ailleurs dans votre projet
2. Au début du code, supprimez d'abord DIM a et ensuite les lignes ci-dessous
a = 6
Do While Sh.Cells(a, 24).Value <> ""
a = a + 1
Loop
a = a - 13. A l'instruction For c = 6 To a, remplacez cette ligne celle ci-dessous
For c = 6 To Sh.Range("X" & Rows.Count).End(xlUp).Row4. Je vais regarder pour la variable e
5. Dans un post précédent vous écrivez ceci
Dans la feuille partagé : aller dans Plan_de_chargement puis cliquer sur Bouton 1, La macro s'appelle N07_Création_Camion. Vous aurez ce que je trouve. ce que je voudrais est du même style mais avec le bon nombre de camions..
J'ai 8 camions avec le choix Tautliner. Ce n'est pas correct ? Comment sait-on ce que le camion est capable de prendre ?
Point 2 : Oui j'ai remplacé le code
Point 5 : Ah d'accord. Mais je pense que ce sera toujours problématique puisque l'on change la valeur de Longueur_Restante dans la suite du code et sachant que X ne fonctionne que pour un camion vide (longueur max) j'ai peur que cela ne fonctionne pas.
J'essaye et je vous tiens au courant.
1. Je ne savais pas ca ! c'est fait
2.3. Fait et fait
Merci de m'apprendre des nouvelles fonctionnalités.
4. OK j'essaye de voir aussi de mon côté
5. Le nombre colis max est de 6 car (2 lignes de colis *13600)/longueur colis (4000) = 6
Le nombre peut varier en fonction de la longueur seulement pour l'instant et puisque les longueurs sont de 4000 on peut en mettre 6 au max.
Normalement on trouve 4 camions car il y a 24 colis. Peut être n'avez vous pas supprimez l'ancien plan de chargement ? Pour ma part je trouve bien 4 camions.
Normalement on trouve 4 camions car il y a 24 colis. Peut être n'avez vous pas supprimez l'ancien plan de chargement ? Pour ma part je trouve bien 4 camions.
J'ai prit ce qui était dans votre dernier fichier V13 - macro N07. Cela me donne 8 camions dans le tableau entre les colonnes A et F
5. Le nombre colis max est de 6 car (2 lignes de colis *13600)/longueur colis (4000) = 6
Je peux vérifier cela à quel endroit du code ?
Pour les 8 camions, ils affichent combien de colis par camion. Peut être un beugue là-dessus. Je vous mets le code pour la création de camion comme ca nous avons la même base.
Sub N07_Création_Camion()
Dim X, NbColis, MaVariable, Longueur_Restante, Hauteur_Restante, NbColis_Compléter As Integer
Dim Sh As Worksheet
Dim Sh2 As Worksheet
Set Sh = Worksheets("Colisage")
Set Sh2 = Worksheets("Plan_de_chargement")
D = 6
N = 6
g = 6
h = 6
m = 1
o = 5
e = 5
Longueur_Restante = 27200
Hauteur_Restante = 2700
For c = 6 To Sh.Range("X" & Rows.Count).End(xlUp).Row
e = e + 1
X = Int((13600 * 2) / Sh.Cells(c, 24).Value)
NbColis = Sh.Cells(c, 29).Value
If Sh.Cells(c, 30).Value = "OUI" Then
'Cas où le colis sélectionné est gerbable
NbColis = Int(Sh.Cells(c, 29) / 2 + 1)
Else
'Cas où les colis sélectionné n'est pas gerbable
End If
'Permet de changer de camion quand il est plein (seulement pour les prochain colis qui sont inférieur à X) mais ne complête pas avec un nombre de colis quand le type est sup. à X
If c > 6 Then
If Sh2.Cells(e - 1, 6).Value + Sh.Cells(c, 24).Value > 27200 Then
N = N + 1
Else
NbColis_Compléter = Int(Longueur_Restante / Sh.Cells(c, 24).Value)
If NbColis > NbColis_Compléter Then
NbColis = NbColis - NbColis_Compléter
Sh2.Cells(e, 3).Value = NbColis_Compléter
Sh2.Cells(e, 1).Value = "Camion " & N - 5
D = D + 1
N = N + 1
o = o + 1
'Calcul des dimensions en longueurs pour un colis compléter
Sh2.Cells(o, 5) = Sh.Cells(c, 24) * Sh2.Cells(e, 3)
MaVariable = Sh2.Cells(D - 1, 1).Value
e = e + 1
Sh2.Cells(o, 2) = Sh.Cells(o, 28)
If MaVariable Like "Camion ?" Then
Do While Sh2.Cells(D - m, 1).Value = MaVariable 'Pour la somme des longueurs
Sh2.Cells(D - 1, 4).Value = Sh2.Cells(D - 1, 4).Value + Sh2.Cells(D - m, 3)
Sh2.Cells(D - 1, 6).Value = Sh2.Cells(D - 1, 6).Value + Sh2.Cells(D - m, 5)
m = m + 1
Loop
If Sh2.Cells(D - 1, 3) < Y And Sh.Cells(c + 1, 24) <> "" Then
Longueur_Restante = 13600 * 2 - Sh2.Cells(D - 1, 6).Value
NbColis_Compléter = Int(Longueur_Restante / Sh.Cells(c, 24).Value)
If NbColis_Compléter >= 1 Then
Sh2.Cells(D, 1) = Sh2.Cells(D - 1, 1)
Sh2.Cells(D, 2) = Sh.Cells(c, 23)
Sh2.Cells(D, 3) = Sh2.Cells(D, 3).Value
End If
End If
End If
Y = X
m = 1
Else
Sh2.Cells(e, 3).Value = NbColis
Sh2.Cells(e, 1).Value = "Camion " & N - 5
NbColis = 0
D = D + 1
End If
End If
End If
'Création de camion complet (=X)
Do While NbColis >= X
Sh2.Cells(D, 1) = "Camion " & N - 5
Sh2.Cells(D, 2) = Sh.Cells(c, 28)
Sh2.Cells(D, 3) = Sh2.Cells(D, 3).Value + X
NbColis = NbColis - X
D = D + 1
N = N + 1
o = o + 1
Sh2.Cells(o, 5) = Sh.Cells(c, 24) * Sh2.Cells(e, 3)
MaVariable = Sh2.Cells(D - 1, 1).Value
e = e + 1
If MaVariable Like "Camion ?" Then
Do While Sh2.Cells(D - m, 1).Value = MaVariable
Sh2.Cells(D - 1, 4).Value = Sh2.Cells(D - 1, 4).Value + Sh2.Cells(D - m, 3)
Sh2.Cells(D - 1, 6).Value = Sh2.Cells(D - 1, 6).Value + Sh2.Cells(D - m, 5)
m = m + 1
Loop
If Sh2.Cells(D - 1, 3) < Y And Sh.Cells(c + 1, 24) <> "" Then
Longueur_Restante = 13600 * 2 - Sh2.Cells(D - 1, 6).Value
NbColis_Compléter = Int(Longueur_Restante / Sh.Cells(c, 24).Value)
If NbColis_Compléter >= 1 Then
Sh2.Cells(D, 1) = Sh2.Cells(D - 1, 1)
Sh2.Cells(D, 2) = Sh.Cells(c, 23)
Sh2.Cells(D, 3) = Sh2.Cells(D, 3).Value
End If
End If
End If
Y = X
m = 1
Loop
'Création de camion incomplet
If NbColis > 0 Then
Sh2.Cells(D, 1) = "Camion " & N - 5
Sh2.Cells(D, 2) = Sh.Cells(c, 23)
Sh2.Cells(D, 3).Value = Sh2.Cells(D, 3).Value + NbColis
NbColis = 0
D = D + 1
N = N
End If
'Création des infos complémentaire (Longueur, Somme des longueurs,...)
o = o + 1
Sh2.Cells(o, 5) = Sh.Cells(c, 24) * Sh2.Cells(e, 3)
MaVariable = Sh2.Cells(D - 1, 1).Value
Sh2.Cells(o, 2) = Sh.Cells(c, 28)
If MaVariable Like "Camion ?" Then
Do While Sh2.Cells(D - m, 1).Value = MaVariable
Sh2.Cells(D - 1, 4).Value = Sh2.Cells(D - 1, 4).Value + Sh2.Cells(D - m, 3)
Sh2.Cells(D - 1, 6).Value = Sh2.Cells(D - 1, 6).Value + Sh2.Cells(D - m, 5)
m = m + 1
Loop
If Sh2.Cells(D - 1, 3) < Y And Sh.Cells(c + 1, 24) <> "" Then
Longueur_Restante = 13600 * 2 - Sh2.Cells(D - 1, 6).Value
NbColis_Compléter = Int(Longueur_Restante / Sh.Cells(c, 24).Value)
If NbColis_Compléter >= 1 Then
Sh2.Cells(D, 1) = Sh2.Cells(D - 1, 1)
Sh2.Cells(D, 2) = Sh.Cells(c, 23)
Sh2.Cells(D, 3) = Sh2.Cells(D, 3).Value
End If
End If
End If
Y = X
m = 1
'Passage à la prochaine valeur
Next c
'--------------------------------------------MISE EN FORME DU TABLEAU-------------------------------------
dlg = Sh2.Range("A" & Rows.Count).End(xlUp).Row
With Sh2.Range("A5:F" & dlg)
.BorderAround LineStyle:=xlContinuous
.BorderAround ColorIndex:=0
.BorderAround Weight:=xlMedium
With .Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = 0
.Weight = xlThin
End With
With .Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ColorIndex = 0
.Weight = xlThin
End With
End With
For c = 6 To dlg
If Sh2.Range("A" & c) <> Sh2.Range("A" & c - 1) Then
With Sh2.Range("A" & c & ":F" & c).Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.Weight = xlMedium
End With
End If
Next c
Range("A1").Select
End SubLa valeur de X donne le nombre max de colis que l'on peut mettre dans un camion vide. ici 6
1. Avec votre dernier code j'ai bien 8 camions. Cela me parait correct car le nombre de colis en feuille colisage correspond (48 colis)
2. Autre chose que je regarde et à corriger je pense
Dans le code création après la ligne --> 'Création de camion incomplet vous avez cette instruction --> Sh2.Cells(D, 2) = Sh.Cells(c, 23)
Cette instruction ne renvoie rien parce que cela fait référence à la colonne W dans la feuille colisage. Est-ce que cela ne devrait pas être 28 ?
Si oui, je ne comprends pas le pourquoi de la ligne --> Sh2.Cells(o, 2) = Sh.Cells(c, 28) qui se trouve 10 lignes plus bas.
Si Nbcolis n'est jamais nul elle peut être supprimée
Si Nbcolis est > 0 le remplissage de Sh2.Cells(D, 2) est exécuté deux fois
Votre avis ?
3. Au début de ce code, j'ai modifié la déclaration des variables comme ceci
Dim c As Byte
Dim NbColis As Integer, NbColis_Compléter As Integer
Dim MaVariable As String
Dim X
Dim Longueur_Restante As Long
Dim Sh As Worksheet, Sh2 As WorksheetNotez que si le nombre de colis n'est jamais supérieur à 250, vous pouvez passer les 2 variables nbcolis à BYTE au lieu de Integer
1. Ah d'accord !! Autant pour moi, nous avions pas le même nombre de colis. Mais du coup tout est bon !
2. Oui j'avais modifié ça dans ma version ensuite car j'avais testé et le nom se supprimais justement. Donc cells(c,23) --> cells(c,28) et Sh2.Cells(o, 2) = Sh.Cells(c, 28) est supprimable
3. d'accord je vais modifier ca. Non je ne pense pas que l'on ai plus de 250 colis. Quel est la différence entre Byte et Integer ?
Point 2 : je supprime donc Sh2.Cells(o, 2) = Sh.Cells(c, 28) mais vérifez car cette colonne ne sera remplie que si le nbcolis est > 0. Je change le 23 en 28
Edit : en fait non c'est celle-ci qu'il faut supprimer --> Sh2.Cells(D, 2) = Sh.Cells(c, 23) et laisser Sh2.Cells(o, 2) = Sh.Cells(c, 28)
Point 3 :
Quel est la différence entre Byte et Integer ?
Une petit lien vaut mieux qu'un long discours --> https://www.excel-pratique.com/fr/vba/variables
Je continue sur l'analyse de votre code (le but étant de simplifier ce qui peut l'être) ou vous voulez que je regarde autre chose ?
J'ai fais l'inverse pourtant et après plusieurs tests, aucun problème à signalé. Justement pour moi c'était Sh2.Cells(o, 2) = Sh.Cells(c, 28) qui supprimait la désignation du colis.
Certes il serait bien d'améliorer le code et le rendre plus claire mais je pense que la plus important (pour moi) serait de le rendre plus automatique. Je parle de mettre dans les camions en fonction de la hauteur et de la largeur.
Et aussi changer les valeurs de longueurs, hauteur et largeur en fonction du camion (style rechercheV).
De plus, je n'ai pas envie de gaspiller votre temps à réparer les trucs qui j'ai fais, je ne pense pas que vous trouvez ca vraiment "fun"
D'ailleurs, j'ai essayé de créer une inputbox mais je n'arrive pas à extraire la valeur rentrée pour la mettre dans ma cellule.
Mon code :
Dim a As Integer
Dim Résultat As Byte
Dim b As Integer
Dim Sh As Worksheet
Dim NbPanneaux_exact As Integer
Dim Nbpanneaux As Integer
Set Sh = Worksheets("Colisage")
b = Nombre_de_ligne.TextB5ox1.Value + 7
For a = 8 To b
NbPanneaux_exact = Format(Sheets("Données_d'entrée").Cells(5, 4).Value / Sheets("Données_d'entrée").Cells(a, 6).Value, "0.00")
Nbpanneaux = Int(Sheets("Données_d'entrée").Cells(5, 4).Value / Sheets("Données_d'entrée").Cells(a, 6).Value)
Résultat = InputBox("Votre nombre de panneaux pour le colis de " & Sheets("Données_d'entrée").Cells(a, 2).Value & " correspond exactement à " & NbPanneaux_exact & "." & Chr(13) & "Le nombre de panneaux utilisé sera de : " & Nbpanneaux & Chr(13) & Chr(10) & "Validez-vous ce résultat ? ", "Validation de colis", Nbpanneaux)
Sheets("Données_d'entrée").Cells(a, 8).Value = Résultat
Next a