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.

57test.xlsx (19.65 Ko)

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 Sub

A+

43mrseb.xlsm (28.49 Ko)

Merci beaucoup pour votre solution.

Elle semble fonctionner.

Je vais la tester sur plusieurs lignes

Rechercher des sujets similaires à "repartition ponderee quantite clients"