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
merci
cordialement
Bonjour,
| N4 | P3 | 0,56651 | 4 | 2 |
| N4 | P4 | 0,3555 | 4 | 1 |
| N4 | P1 | 0,07798 | 4 | 0 |
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 FunctionLes 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
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
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.
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