Calculer le nombre de pièce à enfourner en VBA
Bonjour à tous,
Je vous présente ma première vraie formule VBA, et évidement je suis bloqué et n’arrive pas à renvoyer le résultat de ma formule.
Je rencontre deux problèmes :
Dans un premier temps je n’arrive pas à renvoyer le résultat de la VBA que j’ai déjà écrite dont voici le raisonnement (à la base il s'agissait d'une formule Excel que j'ai convertit en vba, voir vba dans code ci-dessous),
Il s’agit ici de calculer le nombre de pièce qu’il est possible de mettre dans un four (il y a quatre compartiment par four et les pièces sont mises debout dans le four), et j’ai trois type de pièce 1, 2 ou 3 qui ont une multitude de dimension différentes.
Premier SI :
Si il s’agit d’une pièce de type 1 ou de type 2 alors la VBA doit calculer le nombre de pièce qu’il est possible de mettre dans un compartiment sachant qu’il ne peut contenir que (((Hauteur*x) + (50*x)) <=2570)*4 (Soit (la hauteur d’une pièce * nombre de pièce) + (50 * nombre de pièce) inférieur ou égal à 2570. Et étant donné qu’il y a 4 compartiments je multiplie le tout par 4.
Deuxième SI :
Si la hauteur de la pièce est supérieur à la hauteur maxi (520) on retourne alors la pièce pour avoir le calcul suivant (((Largeur*x)+(50*x))<=2570)*4
Dans un deuxième temps je souhaiterais créer une boucle pour calculer le nombre de pièce que je peux entrer dans le four avec une contrainte de volume pour les pièces type 3. Ce qui renverrais le même calcul que pour les pièces de type 1 et 2 mais avec un calcul en plus qui serait:
((hauteur*0.001)+(longueur*0.001)+(largeur*0.001))*nombre de pièce<1.2 si le calcul est supérieur à 1.2 alors mettre une pièce de moins dans le four
Sub CalculNbPieceParFour()
Dim Four5 As Integer, DimLarg As Integer, DimHaut As Integer, DimLong As Integer, Nuance As String, VolumeCrit As Single, F5_LR_Max As Integer, F5_L_Max As Integer, F5_lar_Max As Integer
Four5 = 0
DimLarg = Range("K2").Value '690
DimHaut = Range("L2").Value '485
DimLong = Range("M2").Value '2750
Nuance = Range("J2").Value 'type 1
F5_LR_Max = 2570
F5_L_Max = 4200
F5_lar_Max = 520
'ci dessous formule Excel transformé en vba
If Nuance = "type 1" Or Nuance = "type 2" Then
If DimLong < F5_L_Max And DimLarg <= F5_lar_Max Then
If ((DimHaut * 10) + (50 * 10)) <= F5_LR_Max Then
Four5 = 10 * 4
ElseIf ((DimHaut * 9) + (50 * 9)) <= F5_LR_Max Then
Four5 = 9 * 4
ElseIf ((DimHaut * 8) + (50 * 8)) <= F5_LR_Max Then
Four5 = 8 * 4
ElseIf ((DimHaut * 7) + (50 * 7)) <= F5_LR_Max Then
Four5 = 7 * 4
ElseIf ((DimHaut * 6) + (50 * 6)) <= F5_LR_Max Then
Four5 = 6 * 4
ElseIf ((DimHaut * 5) + (50 * 5)) <= F5_LR_Max Then
Four5 = 5 * 4
ElseIf ((DimHaut * 4) + (50 * 4)) <= F5_LR_Max Then
Four5 = 4 * 4
ElseIf ((DimHaut * 3) + (50 * 3)) <= F5_LR_Max Then
Four5 = 3 * 4
End If
ElseIf DimLong < F5_L_Max And DimLarg > F5_lar_Max Then
If ((DimLarg * 10) + (50 * 10)) <= F5_LR_Max Then
Four5 = 10 * 4
ElseIf ((DimLarg * 9) + (50 * 9)) <= F5_LR_Max Then
Four5 = 9 * 4
ElseIf ((DimLarg * 8) + (50 * 8)) <= F5_LR_Max Then
Four5 = 8 * 4
ElseIf ((DimLarg * 7) + (50 * 7)) <= F5_LR_Max Then
Four5 = 7 * 4
ElseIf ((DimLarg * 6) + (50 * 6)) <= F5_LR_Max Then
Four5 = 6 * 4
ElseIf ((DimLarg * 5) + (50 * 5)) <= F5_LR_Max Then
Four5 = 5 * 4
ElseIf ((DimLarg * 4) + (50 * 4)) <= F5_LR_Max Then
Four5 = 4 * 4
ElseIf ((DimLarg * 3) + (50 * 3)) <= F5_LR_Max Then
Four5 = 3 * 4
End If
End If
End If
End SubVoilà en espérant que quelqu'un pourra me filer un coup de main sur ce sujet, en vous remerciant d'avance,
Ps: ci-joint le fichier excel test si besoin est.
Cordialement
SALUT
REGARDER CA
JE CROIS QUE LES CONDITIONS SONT PAS CORECTES
MERCI
Bonjour et merci de ta réponse Amir,
Cela répond parfaitement à mon premier problème, merci.
Au niveau des conditions je m'étais en effet trompé dans l'écriture du "If Nuance="type 1", j'avais rajouter un espace inutile. La condition fonctionne donc correctement.
Pour parfaire ma formule je souhaiterais maintenant créer une boucle, je pense qu'il s'agit de la meilleur façon de procéder, pour prendre en compte une contrainte supplémentaire c'est à dire le volume maxi à partir du nombre de pièce déterminé précédemment.
Dans l'exemple si on retient que l'on peut mettre 24 pièce dans le four alors avec condition cela donnerais ceci:
SI (24*((Hauteur*0.001)*(Largeur*0.001)*(longueur*0.001)))>12.5 alors (23*((Hauteur*0.001)*(Largeur*0.001)*(longueur*0.001))) sinon si (23*((Hauteur*0.001)*(Largeur*0.001)*(longueur*0.001)))>12.5 alors (22*((Hauteur*0.001)*(Largeur*0.001)*(longueur*0.001))) sinon si...
Evidemment si je fais ça sous forme de condition la formule ne va pas en finir, c'est pourquoi je pensais à créer une boucle, n'en ayant jamais fais je sèche.
A la base j'étais partis sur une boucle do until... Loop mais je ne vois pas du tout comment la concevoir.
Si quelqu'un pouvait m'orienter sur une façon de procéder,
Cdlt et encore merci à Amir,
bonsoir
essaies quelque chose comme ca
Debut
i =100
For i to 1 step-1
If (i*((Hauteur*0.001)*(Largeur*0.001)*(longueur*0.001)))>12.5 then
valeur_ok = i
goto valeur_trouvee
Next
goto sortie
valeur_trouvee:
sortie: ' aucune valeur n'est bonne
Fin
Bonjour,
SI (24*((Hauteur*0.001)*(Largeur*0.001)*(longueur*0.001)))>12.5 alors (23*((Hauteur*0.001)*(Largeur*0.001)*(longueur*0.001))) sinon si (23*((Hauteur*0.001)*(Largeur*0.001)*(longueur*0.001)))>12.5 alors (22*((Hauteur*0.001)*(Largeur*0.001)*(longueur*0.001))) sinon si...
=ent(12.5/((Hauteur*0.001)*(Largeur*0.001)*(longueur*0.001)))ça ne le fait pas ?
eric
PS : int(...) en vba
Bonjour,
Désolé pour cette réponse tardive, vacance oblige
Après avoir vu vos réponse je me suis rendu compte qu'il fallait que je calcul dans un premier temps le nombre de pièce enfournable pour tous les types de produit et que j'insère seulement après la boucle uniquement pour les produit de type 3. J'ai enfin réussi à créer une boucle qui calcul le volume maxi avec le nombre de pièce calculé par défaut.
Voilà ce que ça donne:
Sub CalculNbPieceParFour()
Dim FinLignes As Long
Dim i As Integer
Dim Four5 As Integer
Dim DimLarg As Integer
Dim DimHaut As Integer
Dim DimLong As Integer
Dim TypeDeProduit As String
Dim VolumeCrit As Single
Dim VolumeCritMax As Single
Dim F5_LR_Max As Integer
Dim F5_L_Max As Integer
Dim F5_lar_Max As Integer
Dim j As Long
'ci dessous formule Excel transformé en vba
F5_LR_Max = 2570
F5_L_Max = 4200
F5_lar_Max = 520
VolumeCritMax = 12.7
FinLignes = Application.CountA(Range(Cells(2, 10), Cells(65000, 10))) + 1
For i = 2 To FinLignes
DimLarg = Range("K" & i).Value '690
DimHaut = Range("L" & i).Value '485
DimLong = Range("M" & i).Value '2750
TypeDeProduit = Range("J" & i).Value 'type 1
If TypeDeProduit <> "" Then
If DimLong < F5_L_Max And DimLarg <= F5_lar_Max Then
If ((DimHaut * 10) + (50 * 10)) <= F5_LR_Max Then
Range("N" & i).Value = 10 * 4
ElseIf ((DimHaut * 9) + (50 * 9)) <= F5_LR_Max Then
Range("N" & i).Value = 9 * 4
ElseIf ((DimHaut * 8) + (50 * 8)) <= F5_LR_Max Then
Range("N" & i).Value = 8 * 4
ElseIf ((DimHaut * 7) + (50 * 7)) <= F5_LR_Max Then
Range("N" & i).Value = 7 * 4
ElseIf ((DimHaut * 6) + (50 * 6)) <= F5_LR_Max Then
Range("N" & i).Value = 6 * 4
ElseIf ((DimHaut * 5) + (50 * 5)) <= F5_LR_Max Then
Range("N" & i).Value = 5 * 4
ElseIf ((DimHaut * 4) + (50 * 4)) <= F5_LR_Max Then
Range("N" & i).Value = 4 * 4
ElseIf ((DimHaut * 3) + (50 * 3)) <= F5_LR_Max Then
Range("N" & i).Value = 3 * 4
End If
ElseIf DimLong < F5_L_Max And DimLarg > F5_lar_Max Then
If ((DimLarg * 10) + (50 * 10)) <= F5_LR_Max Then
Range("N" & i).Value = 10 * 4
ElseIf ((DimLarg * 9) + (50 * 9)) <= F5_LR_Max Then
Range("N" & i).Value = 9 * 4
ElseIf ((DimLarg * 8) + (50 * 8)) <= F5_LR_Max Then
Range("N" & i).Value = 8 * 4
ElseIf ((DimLarg * 7) + (50 * 7)) <= F5_LR_Max Then
Range("N" & i).Value = 7 * 4
ElseIf ((DimLarg * 6) + (50 * 6)) <= F5_LR_Max Then
Range("N" & i).Value = 6 * 4
ElseIf ((DimLarg * 5) + (50 * 5)) <= F5_LR_Max Then
Range("N" & i).Value = 5 * 4
ElseIf ((DimLarg * 4) + (50 * 4)) <= F5_LR_Max Then
Range("N" & i).Value = 4 * 4
ElseIf ((DimLarg * 3) + (50 * 3)) <= F5_LR_Max Then
Range("N" & i).Value = 3 * 4
End If
End If
End If
Next i
For j = 2 To FinLignes
If Range("J" & j).Value = "type3" Then
VolumeCrit = Range("N" & j).Value * ((Range("L" & j).Value * 0.001) * (Range("K" & j).Value * 0.001) * (Range("M" & j).Value * 0.001))
'Range("O" & j).Value = VolumeCrit
While VolumeCrit > VolumeCritMax
Range("N" & j).Value = Range("N" & j).Value - 1
VolumeCrit = Range("N" & j).Value * ((Range("L" & j).Value * 0.001) * (Range("K" & j).Value * 0.001) * (Range("M" & j).Value * 0.001))
'Range("O" & j).Value = VolumeCrit
Wend
End If
Next j
Range("J1").Select
End SubJ'avais quand même pris en compte toute vos réponse, mais il était impératif de partir du nombre maximum de pièce enfournable avant de calculer la limite de volume.
Merci à tous pour votre aide,
Oneame.