Automatisation de gestion de stock
frangy a écrit :Tu peux refaire un test après avoir remplacé le point par une virgule (2,01 au lieu de 2.01).
C'est bien là que réside le problème : la macro redémarre lorsque le remplacement est effectué
bonjour,
Merci beaucoup cette fois c'est bon
Désolé de dire ça mais maintenant je suis bloqué à un autre endroit
Pour le calcul de la couverture mensuelle, je n'arrive pas à faire apparaître le calcul.
Pour rappel, la formule de ce calcul est : stock moyen (calculé précédemment) / conso moyenne (la somme des sorties/12)
Je voudrais que, si la somme des sortie est = à 0 ou si le stock moyen =0, la case indique 0 sinon elle calcule la formule.
Dans certaines cases de la colonne correspondante apparaît des 0 mais je ne sais pas pourquoi pas dans tous!
Sub Stock()
Dim NumProduit As Long, DerLig As Long, StockInit As Long, StockFinal As Long, Quantite As Long
Dim Mouvement As String
Application.ScreenUpdating = False
With Sheets("Feuil1")
DerLig = .Cells(Rows.Count, 1).End(xlUp).Row
i = 2
While i <= DerLig
StockInit = .Cells(i, 8)
StockFinal = StockInit
Do
NumProduit = .Cells(i, 1)
Quantite = .Cells(i, 10)
Mouvement = .Cells(i, 9)
Select Case Mouvement
Case "S"
StockFinal = StockFinal - Cells(i, 10)
Sumquantite = Sumquantite + Cells(i, 10)
Case Else
StockFinal = StockFinal + Cells(i, 10)
End Select
i = i + 1
Loop Until NumProduit <> .Cells(i, 1)
Cells(i - 1, 11) = (StockInit + StockFinal) / 2 'Stock moyen
If Cells(i - 1, 11) <> 0 Then
Cells(i - 1, 12) = Sumquantite / Cells(i - 1, 11)
Else
Cells(i - 1, 12) = 0 'Taux de rotation
If Sumquantite = 0 Or Cells(i - 1, 11) = 0 Then
Cells(i - 1, 13) = 0
Else
Cells(i - 1, 13) = Cells(i - 1, 11) / (Sumquantite / 12) 'Couverture mensuelle
End If
End If
Sumquantite = 0
Wend
End With
Application.ScreenUpdating = True
End Sub
Cordialement
Bonjour,
Sub Stock()
Dim NumProduit As Long, DerLig As Long, StockInit As Long, StockFinal As Long, Quantite As Long
Dim Mouvement As String
Application.ScreenUpdating = False
With Sheets("Feuil1")
DerLig = .Cells(Rows.Count, 1).End(xlUp).Row
i = 2
While i <= DerLig
StockInit = .Cells(i, 8)
StockFinal = StockInit
Sumquantite = 0
Do
NumProduit = .Cells(i, 1)
Quantite = .Cells(i, 10)
Mouvement = .Cells(i, 9)
Select Case Mouvement
Case "S"
StockFinal = StockFinal - Cells(i, 10)
Sumquantite = Sumquantite + Cells(i, 10)
Case Else
StockFinal = StockFinal + Cells(i, 10)
End Select
i = i + 1
Loop Until NumProduit <> .Cells(i, 1)
Cells(i - 1, 11) = (StockInit + StockFinal) / 2 'Stock moyen
If Cells(i - 1, 11) <> 0 Then
Cells(i - 1, 12) = Sumquantite / Cells(i - 1, 11)
Else
Cells(i - 1, 12) = 0 'Taux de rotation
End If
If Sumquantite = 0 Or Cells(i - 1, 11) = 0 Then
Cells(i - 1, 13) = 0
Else
Cells(i - 1, 13) = Cells(i - 1, 11) / (Sumquantite / 12) 'Couverture mensuelle
End If
Wend
End With
Application.ScreenUpdating = True
End SubA+
Bonjour,
Merci Frangy pour cette réponse rapide et efficace !!
Je voulais savoir si à la fin de chaque If il fallait un End If, ou si plusieurs If pouvaient se suivre et et se terminer par un seul End If?
Faut-il toujours décaler, après un Else, la ligne en dessous ?
Exemple: If Cells(i - 1, 11) <> 0 Then
Cells(i - 1, 12) = Sumquantite / Cells(i - 1, 11)
Else
Cells(i - 1, 12) = 0 'Taux de rotation
End If
Cordialement
Je voulais savoir si à la fin de chaque If il fallait un End If, ou si plusieurs If pouvaient se suivre et se terminer par un seul End If?
La structure de base est :
If <Condition> then
<Instruction1>
else
<Instruction2>
End ifLes instructions peuvent également contenir le même type de structure
If <Condition1> then
If <Condition2> then
<Instruction1>
Else
<Instruction2>
End If
Else
<Instruction3>
End ifTu peux donc aller très loin dans la construction de ces structures.
Il y a d’autres écritures possibles mais il est essentiel de bien maitriser cette structure de base.
Exemple de structure aménagée:
Si tu n’as qu’une instruction à placer, tu peux te contenter d’écrire
If <Condition> then <Instruction> Dans ce cas, le "End if " est implicite.
Tu peux également aller voir l’aide sur la fonction IIf, la clause ElseIf, etc.
Faut-il toujours décaler, après un Else, la ligne en dessous ?
Ce décalage appelé indentation facilite la lecture d’un code car il permet de repérer facilement les structures utilisées et leur niveau.
Regarde ce que donne une structure à 3 niveaux. On voit bien les 3 décalages correspondants.
If <Condition1> then
If <Condition2> then
If <Condition3> then
<Instruction1>
Else
<Instruction2>
End If
Else
<Instruction3>
End If
Else
<Instruction4>
End IfA+