Répartition pondérée d'une quantité sur des clients
Bonjour,
Je suis nouveau sur le forum.
J'utilise EXCEL 2010.
Objectif :
Nous avons une quantité de colis commandée sur un produit. Nous répartissons cette quantité en fonction du poids du client. Cependant chaque client doit avoir minimum 1 colis et une quantité entière de colis.
Comment pouvons nous définir la répartition des colis sur nos clients grâce à une formule ou une macro?
Vous trouverez ci-joint un fichier exemple reprenant notre tentative de résolution du problème.
Description du fichier :
Colonne A : Code article.
Colonne B : Personne qui commande
Colonne C : Quantité commandée
Colonne D : Arrondi.SUP de Répartition de la quantité commandée en fonction des commandes des mois précédents
Colonne E : Somme de la réparation par rapport à chaque code article. Utilisation de la fonction SOMME.SI.ENS
Colonne F : Valeur recherchée.
Colonne G : Nouvelle Somme de la réparation par rapport à chaque code article. Colonne E + Colonne F
Colonne H : Vérification que la nouvelle somme de la répartition. Utilisation de la fonction SOMME.SI.ENS
Il y a dans l'exemple 3 références dans la colonne A mais on peut en avoir beaucoup plus
Le but est de calculer dans la colonne F une valeur.
Si colonne E > Colonne C pour un article (article présent sur plusieurs lignes), il faut répartir le delta à soustraire sur une partie des magasins. Idéalement le répartir sur les magasins qui ont la valeur "Répartition"-Colonne D la plus élevée.
Un fois cette répartition faite, il faut que la valeur de la colonne H soit égale à celle de la colonne C.
Petite difficulté, dans la colonne G aucune ligne ne doit être à ZERO.
Si colonne E < Colonne C, c'est identique sauf qu'il faut ajouter au lieu de soustraire
Si colonne E = Colonne C, il ne faut pas faire de calcul mais mettre ZERO dans la colonne
Merci beaucoup pour votre aide.
Salut MR SEB,
j'ai bien trouvé une formule qui collerait mais pas la solution pour qu'elle s'applique aux seules lignes ad hoc...
=SI(C2=E2;0;ENT(((C2-E2)*(D2/E2))))Une solution VBA, peut-être, à tester en situation réelle ? Un double-clic en ligne 1 démarre la macro.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim iRow1%, iRow2%, iRow3%, iDiff%, iOK%, dblStep%
'
Application.ScreenUpdating = False
'
If Not Intersect(Target, Rows(1)) Is Nothing Then
Cancel = True
iRow1 = 2
Range("F2:F" & Range("F" & Rows.Count).End(xlUp).Row).Value = ""
Do
iRow2 = Range("A:A").Find(what:=Range("A" & iRow1).Value, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlPrevious).Row
If CInt(Range("C" & iRow1).Value) <> CInt(Range("E" & iRow1).Value) Then
iDiff = CInt(Range("C" & iRow1).Value) - CInt(Range("E" & iRow1).Value)
iRow3 = Range("D" & iRow1 & ":D" & iRow2).Find(what:=1, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Row - 1
Do
iOK = 1: dblStep = 0
Range("F" & iRow1 & ":F" & iRow2).Value = ""
For x = iRow1 To iRow3
Range("F" & x).Value = CInt((iDiff * CDbl((Range("D" & x).Value / Range("E" & x).Value) + dblStep)) + IIf(iDiff > 0, 0.5, -0.5))
If WorksheetFunction.Sum(Range("G" & iRow1 & ":G" & iRow2)) = Range("C" & iRow1).Value Then
iOK = 0
Exit For
End If
Next
If iOK = 1 Then dblStep = dblStep + 0.01
Loop Until iOK = 0
End If
iRow1 = iRow2 + 1
Loop Until iRow2 = Range("A" & Rows.Count).End(xlUp).Row
End If
'
Application.ScreenUpdating = True
'
End SubA+
Merci beaucoup pour votre solution.
Elle semble fonctionner.
Je vais la tester sur plusieurs lignes