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 Sub

Voilà 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 Sub

J'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.

Rechercher des sujets similaires à "calculer nombre piece enfourner vba"