1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim TS As Variant 'déclare la variable TS (Tableau des Stocks)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim P As String 'déclare la variable P (Produit)
Dim TPS() As Variant 'déclare la variable TPS (Tableau des Produits Stockés)
Dim QD As Integer 'déclare la variable QD (Quantité Demandé)
Set O = Worksheets("Feuil1") 'définit l'onglet O (à adapter à ton cas)
TV = O.Range("B2").CurrentRegion 'définit le tableau des valeurs TV
For I = 2 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
TS = O.Range("B14").CurrentRegion 'définit le tableau des stocks TS
K = 1 'initialise la variable K
Erase TPS 'vide le tableau TPS
P = TV(I, 2): QD = TV(I, 3) 'définit le produit P et la quantité demandée QD
For J = 2 To UBound(TS, 1) 'boucle 2 : sur toutes les lignes J du tableau des stocks TS (en partant de la seconde)
If TS(J, 1) = P Then 'condition : si la donnée en colonne 1 de TS est égale au produit P
ReDim Preserve TPS(1 To 3, 1 To K) 'redimensionne le tableau TPS des produits en stock (3 lignes, K colonnes)
TPS(1, K) = J + 13 'récupère le numéro de ligne dans la ligne 1 de TPS (on ajoute 13 car J = 2 donne la ligne 15)
TPS(2, K) = TS(J, 2) 'récupère le nom de l'entrepot dans la ligne 2 de TPS
TPS(3, K) = TS(J, 3) 'récupère la quantité de l'entrepot de ligne 3 de TPS
K = K + 1 'incrémente K (ajoute une colonne au tableau TPS des produits en stock)
End If 'fin de la condition
Next J 'prochaine ligne de la boucle 2
On Error GoTo fin 'gestion des erreur (en cas d'erreur va à l'etiquette "fin")
Select Case QD 'agit en fonction de la quantité demandée QD
Case Is <= TPS(3, 1) 'cas inférieure ou égale à la quantité du premier entrepot
'met à jour le calcul de la quantité de l'entrepot 1
O.Cells(TPS(1, 1), "D").Value = O.Cells(TPS(1, 1), "D").Value - QD
O.Cells(I + 1, "E") = TPS(2, 1) 'renvoie le nom de l'entrepot dans la ligne I+1 colonne E de l'onglet O
O.Cells(I + 1, "F") = QD 'renvoie la quantité demandée dans la cellule ligne I+1 colonne F de l'onglet O
Case Is <= TPS(3, 1) + TPS(3, 2) 'cas inférieur ou égale au total des quantités des entrepots 1 à 2
'met à jour le calcul de la quantité de l'entrepot 2
O.Cells(TPS(1, 2), "D").Value = O.Cells(TPS(1, 2), "D").Value + O.Cells(TPS(1, 1), "D").Value - QD
O.Cells(TPS(1, 1), "D").Value = 0 'vide le stock de l'entrepot 1
O.Cells(I + 1, "E") = TPS(2, 1) 'renvoie le nom de l'entrepot 1 dans la ligne I+1 colonne E de l'onglet O
O.Cells(I + 1, "F") = TPS(3, 1) 'renvoie le stock de l'entrepot 1 dans la ligne I+1 colonne F de l'onglet O
O.Cells(I + 1, "G") = TPS(2, 2) 'renvoie le nom de l'entrepot 2 dans la ligne I+1 colonne G de l'onglet O
'renvoie la quantité demandée moins le stock de l'entrepot 1 dans la cellule ligne I+1 colonne H de l'onglet O
O.Cells(I + 1, "H") = QD - TPS(3, 1)
Case Is <= TPS(3, 1) + TPS(3, 2) + TPS(3, 3) 'cas inférieur ou égale au total des quantités des entrepots 1 à 3
'met à jour le calcul de la quantité de l'entrepot 3
O.Cells(TPS(1, 3), "D").Value = O.Cells(TPS(1, 3), "D").Value + O.Cells(TPS(1, 2), "D").Value + O.Cells(TPS(1, 1), "D").Value - QD
O.Cells(TPS(1, 1), "D").Value = 0 'vide le stock de l'entrepot 1
O.Cells(I + 1, "E") = TPS(2, 1) 'renvoie le nom de l'entrepot 1 dans la ligne I+1 colonne E de l'onglet O
O.Cells(I + 1, "F") = TPS(3, 1) 'renvoie le stock de l'entrepot 1 dans la ligne I+1 colonne F de l'onglet O
O.Cells(TPS(1, 2), "D").Value = 0 'vide le stock de l'entrepot 2
O.Cells(I + 1, "G") = TPS(2, 2) 'renvoie le nom de l'entrepot 2 dans la ligne I+1 colonne G de l'onglet O
O.Cells(I + 1, "H") = TPS(3, 2) 'renvoie le stock de l'entrepot 2 dans la ligne I+1 colonne H de l'onglet O
O.Cells(I + 1, "I") = TPS(2, 3) 'renvoie le nom de l'entrepot 3 dans la ligne I+1 colonne I de l'onglet O
'renvoie la quantité demandée moins le stock des entrepots 1 à 2 dans la cellule ligne I+1 colonne J de l'onglet O
O.Cells(I + 1, "J") = QD - (TPS(3, 1) + TPS(3, 2))
Case Is <= TPS(3, 1) + TPS(3, 2) + TPS(3, 3) + TPS(3, 4) 'cas inférieur ou égale au total des quantités des entrepots 1 à 4
'met à jour le calcul de la quantité de l'entrepot 4
O.Cells(TPS(1, 4), "D").Value = O.Cells(TPS(1, 4), "D").Value + O.Cells(TPS(1, 3), "D").Value + O.Cells(TPS(1, 2), "D").Value + O.Cells(TPS(1, 1), "D").Value - QD
O.Cells(TPS(1, 1), "D").Value = 0 'vide le stock de l'entrepot 1
O.Cells(I + 1, "E") = TPS(2, 1) 'renvoie le nom de l'entrepot 1 dans la ligne I+1 colonne E de l'onglet O
O.Cells(I + 1, "F") = TPS(3, 1) 'renvoie le stock de l'entrepot 1 dans la ligne I+1 colonne F de l'onglet O
O.Cells(TPS(1, 2), "D").Value = 0 'vide le stock de l'entrepot 2
O.Cells(I + 1, "G") = TPS(2, 2) 'renvoie le nom de l'entrepot 2 dans la ligne I+1 colonne G de l'onglet O
O.Cells(I + 1, "H") = TPS(3, 2) 'renvoie le stock de l'entrepot 1 dans la ligne I+1 colonne H de l'onglet O
O.Cells(TPS(1, 3), "D").Value = 0 'vide le stock de l'entrepot 3
O.Cells(I + 1, "I") = TPS(2, 3) 'renvoie le nom de l'entrepot 3 dans la ligne I+1 colonne I de l'onglet O
O.Cells(I + 1, "J") = TPS(3, 3) 'renvoie le stock de l'entrepot 3 dans la ligne I+1 colonne J de l'onglet O
O.Cells(I + 1, "K") = TPS(4, 2) 'renvoie le nom de l'entrepot 4 dans la ligne I+1 colonne K de l'onglet O
'renvoie la quantité demandée moins le stock des entrepots 1 à 3 dans la cellule ligne I+1 colonne J de l'onglet O
O.Cells(I + 1, "L") = QD - (TPS(3, 1) + TPS(3, 2) + TPS(3, 3))
End Select 'fin de l'action en fonction de la quantité demandée
GoTo suite 'va à l'etiquette "suite"
fin: 'etiquette
Err.Clear 'supprime l'erreur
MsgBox "Le total des quantités en stock ne permet pas de fournir cette commande !" 'message
O.Rows(I + 1).Select 'sélectionne la ligne qui pose problème
On Error GoTo 0 'annule la gestion des erreurs
suite: 'étiquette
Next I 'prochaine ligne de la boucle 1
End Sub |
Partager