Tri et arrondi

Bonjour,

voilà mon problème:

Dans un tableau sont rangés des articles dans une colonne. Dans les colonnes associées, pour chacun des articles, on trouve le pourcentage de consommation de ces derniers en fonction d'une localisation (titre des autres colonnes).

Après calcul d'un besoin global, il est maintenant nécessaire de répartir cette quantité en fonction de la clé de conso propre à chaque article.

Dans le calcul, il faut impérativement commencer la désagrégation du plus grand au plus petit :

par exemple , le besoin global est de 2, consommé par P12 pour 0,2 et P67 pour 0,8. Comme 0,8*2=1,6 et qu'un article ne se coupe pas, les 2 vont sur P67.

Mon problème est de trouver une formule me permettant d'après mon tableau initiale de réaliser le calcul (mais je n'ai aucune idée de comment faire) (CAS INITIALE FICHIER JOINT)

Pour l'instant, j'ai remis mes données sous une autre forme (SOL 1 FICHIER JOINT). Dans ce cas j'arrive presque à mes fins, en effet j'ai un problème avec l'arrondi qui en fonction de mon choix( simple, max, min) m'augmente ou diminue pour certaines lignes le besoin net.

Si quelqu’un à une idée, je suis preneur

15tri-et-arrondi.xlsx (11.84 Ko)

merci

cordialement

Bonjour,

N4P30,5665142
N4P40,355541
N4P10,0779840

C'est juste ? 4*0,56651>2 donc on devrait trouver 3 ?

Idem pour les autres

zero c'est impossible dans le raisonnement que tu nous a proposé

???

Bonjour,

Salut Djidji !

Une fonction personnalisée ?

Function REPARTIR(q As Long, kp As Range)
    Dim T(), r(), qr, i%, d&
    Application.Volatile
    ReDim T(kp.Cells.Count - 1)
    ReDim r(UBound(T))
    For i = 1 To kp.Cells.Count
            qr = q * kp.Cells(i)
            T(i - 1) = Int(qr): r(i - 1) = qr - T(i - 1)
    Next i
    For i = 0 To UBound(T)
        d = d + T(i)
    Next i
    d = q - d
    Do While d > 0
        qr = 0
        For i = 1 To UBound(T)
            If r(i) > r(qr) Then
                qr = i
            ElseIf r(i) = r(qr) Then
                If T(i) < T(qr) Then qr = i
            End If
        Next i
        T(qr) = T(qr) + 1: r(qr) = r(qr) - 1: d = d - 1
    Loop
    For i = 1 To kp.Cells.Count
        If kp.Cells(i) = "" Then T(i - 1) = ""
    Next i
    REPARTIR = T
End Function

Les arguments sont la quantité à répartir, la plage de clés de répartition (dont la somme est égale à 1).

La fonction est matricielle : sélection préalable d'autant de cellules qu'en contient la plage de clés de répartition, et validation par Ctrl+Maj+Entrée.

(Voir dans classeur.)

Cordialement.

Re,

le résultat de 4*0,56651 est 2,26 donc arrondi est 2, c'est bon.

En Fait mon problème est de régler celui de l'arrondi de façon à ce qu'au final la somme de mes quantités désagrégées soit toujours égale à la quantité totale (ni 1 de plus ou 1 de moins) et cela quelque soit la clé de répartition.

merci

cet


Salut M ferrand

je viens de voir ta réponse, j'imaginais une formule avec Excel , une macro et j'imagine bien plus puissante.

J'essaie de tenter cet après-midi

merci

clt

La macro est conçue pour fonctionner de la même façon que les fonctions intégrées d'Excel. C'est pour cela qu'on appelle ce type de macros fonctions personnalisées. Cela permet d'avoir des formules plus simples à l'utilisation quand cela devient compliqué d'opérer avec les seules fonctions classiques...

La fonction opère en faisant une répartition a-minima (ce qui revient à arrondir à l'entier inférieur) et notant le reste de l'opération (partie décimale). Exemple : 3 à répartir dans les proportions 0,3 et 0,7, on obtient donc : 0 (reste 0,9) et 2 (reste 0,1), et il reste 1 à répartir pour atteindre 3.

A ce stade, la fonction va procéder un peu comme pour les élections à la proportionnelle , elle va attribuer successivement les restes à répartir par unité, au plus fort reste. Dans l'exemple, c'est 0,9 donc la répartition devient : 1 (reste -0,1) et 2 (reste 0,1). Ici cela s'arrête puisque plus rien à répartir, sinon on poursuivrait...

Si on tombe sur une égalité des restes, on donnera l'avantage à celui qui a eu le moins d'éléments attribués jusqu'ici.

La fonction travaille avec des tableaux : lorsqu'elle a épuisée la quantité à répartir, elle affecte le tableau à la plage de cellules sélectionnée.

Cordialement.

bonjour

un essai à tester

9aokiba.xlsx (12.97 Ko)

cordialement

Bonsoir,

Avec un peu de retard

merci à Tulipe pour sa réponse mais celle de MFerrand correspond exactement à ce que je souhaitais faire, un grand merci aussi évidemment

bien cordialement

Rechercher des sujets similaires à "tri arrondi"