Bonjour à tous,
je veux une macro qui dispatche une valeur sur plusieurs ligne
Merci
Version imprimable
Bonjour à tous,
je veux une macro qui dispatche une valeur sur plusieurs ligne
Merci
Bonjour Wat, bonjour le forum,
[Édition]
Il semblerait que tu aies édité ton premier message. Ma réponse ci-dessous paraît complètement débile du coup...
Trop nul en formules pour envisager une solution par ce moyen. Si une proposition VBA te convient, je te propose le code ci-dessous qui va faire rire tellement il est complexe (je suis sûr que l'on peut faire beaucoup plus simple mais je n'y arrive pas). Pense à mettre à jour le nom de l'onglet. J'ai mis Feuil1 par défaut :
Code:
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