Arrondi selon Conditions (valeur de cellule)
Bonjour à tous et bon début d'année 2017 ! =)
D'avance merci pour toute l'aide qui pourrait m'être apportée sur ce problème. J'avais déjà fait appel à ce forum il y a quelques années et je sais qu'on avait pu beaucoup m'aider pour mes petits soucis de formules
J'ai avec moi une liste de prix de quelques milliers de références que mon charmant patron souhaiterait modifier/arrondir selon la règle suivante :
Voici les échelles de prix pour les listes de prix que nous ferons:
- Pour les prix de vente entre 1 et 49.90, nous faisons des prix avec des finitions en 0,10-0,20-0,30-0,40-0,50-0,60-0,70-0,80-0,90 ou 00
=> Principe d’arrondi = en dessous de 0,05 (0,04) = en dessous et (0,06) en dessus
- Pour les prix de vente entre 49.90 et 99.90, nous faisons uniquement 44,50 ou 49,90
=> Principe d’arrondi = 49,76 à 49,99 = 49,90 // 49,00 à 49,74 = 49.50 (pas de prix finissant en 49,00)
- Pour les prix de vente à partir de 100.00, nous ne faisons que des prix pleins et pas de prix qui finissent en 1.00 ou en 6.00, par exemple 120.-/122.-/123.-/124.-/125.-/127.-/128.-/129.-/130.-
=> Principe d’arrondi = 128,49 = 128.00 // 128.51 = 129.00, si on arrive à 128.50 on fait 129.00.
J'ai essayé avec une fonction IF, mais je bloque assez rapidement..
Est-ce qu'il est possible d'avoir une fonction qui permet d'arrondir ces prix comme demandé ou est-ce qu'il faut forcément passer par une macro?
J'ai mis un ficher excel en exemple.
Pour l'instant c'est notre assistante qui s'en occupe et elle doit tout se taper à la main... si on peut automatiser j'avoue que ce serait top !
Merci encore de votre aide,
Bon début de semaine à vous !
Laetitia.
Salut !
Est ce que cette formule répond à ta demande ?
=SI(B8<50;ARRONDI(B8;1);SI(B8<100;SI(MOD(B8;1)<0,75;ENT(B8)+0,5;ENT(B8)+0,9);ARRONDI(B8;0)))
bonjour
une contribution
SI(B8<=49,9;ENT(B8)+SIERREUR(INDEX(LIGNE($1:$9)*0,1;EQUIV(B8-ENT(B8);(LIGNE($1:$9)*0,1);1)+1);0,5);"")&SI(ET(B8>49,9;B8<=99,9);SI(B8-ENT(B8)<=0,74;ENT(B8)+0,5;ENT(B8)+0,9);"")&SI(B8>=100;SI(B8-ENT(B8)<0,5;ENT(B8)+0,5;ENT(B8)+1);"")
a valider avec Ctrl+ maj +entrée
cordialement
Bonjour,
Une autre contribution, à tester.
Cdlt.
=SI(A1<=49,9;ARRONDI(A1/0,1;0)*0,1;SI(A1<=99,9;ARRONDI(A1/0,5;0)*0,5;ARRONDI(A1/1;0)*1))
Bonjour Laetitia,
bonjour les as de la formule!
Et VBA, alors?
Voici ma petite pierre à l'édifice! N'étant pas matheux pour deux sous
Avant de cliquer mon petit bouton rouge, tu pourras cliquer sur divers prix du tableau : l'arrondi calculé selon les critères de ton charmant patron sera renvoyé dans une MsgBox.
Certains arrondis d'Excel pour contenir l'affichage en 2 décimales provoqueront des 'erreurs' d'arrondi. Par exemple : 47,15, mais en réalité, 47,1523698, renverra 47,20 là où 14,15, en réalité, 14,1499999 renverra correctement 14,10!
Petit mystère que je n'ai pas bien saisi : au-delà de 100, pas d'unité 1 ou 6!! On fait quoi dans ce cas? Perso, j'ai alors incrémenté de 1.
Je suppose que ton tableau réel se présente autrement à l'écran. La macro va détecter ses position et dimensions en se basant sur la cellule 'Articles' (oui, j'ai changé : de 'article', c'est devenu 'Articles' - un peu maniaque sur les bords!
Pour tester l'affaire, j'ai copié ton tableau sur 5000 lignes. Ça devrait le faire!
Private Sub cmdGO_Click()
'
Dim tTab
Dim rCel As Range
'
iRow = Range("A" & Rows.Count).End(xlUp).Row
Set rCel = Range("A1:A" & iRow).Find(what:="Articles", lookat:=xlWhole, searchdirection:=xlNext)
iCol = Cells(rCel.Row, Columns.Count).End(xlToLeft).Column
sCol = Split(Columns(iCol).Address(ColumnAbsolute:=False), ":")(1)
'
tTab = Range("B" & rCel.Row + 1 & ":" & sCol & iRow)
iCol1 = iCol - 1
iRow1 = iRow - rCel.Row
'
Application.ScreenUpdating = False
'
For x = 1 To iCol1
For y = 1 To iRow1
dDbl = CDbl(tTab(y, x) - (Int(tTab(y, x)))) * 100
If dDbl > 0 Then
Select Case tTab(y, x)
Case Is < 50
tTab(y, x) = IIf(dDbl / 10 - Int(dDbl / 10) <= 0.5, Int(tTab(y, x)) + Int(dDbl / 10) / 10, Int(tTab(y, x)) + Int((dDbl + 10) / 10) / 10)
Case 50 To 99.9
tTab(y, x) = IIf(Int(dDbl) >= 1 And Int(dDbl) <= 74, Int(tTab(y, x)) + 0.5, Int(tTab(y, x)) + 0.9)
Case Else
dDbl2 = IIf(Int(dDbl) <= 49, Int(tTab(y, x)), Int(tTab(y, x)) + 1)
tTab(y, x) = IIf(dDbl2 - Int(dBl2 / 10) * 10 = 1 Or dDbl2 - Int(dDbl2 / 10) * 10 = 6, dDbl2 + 1, dDbl2)
End Select
End If
Next
Next
'
Range("B" & rCel.Row + 1 & ":" & sCol & iRow) = tTab
'
Application.ScreenUpdating = True
'
End Sub
Bon travail!
A+
Bonjour à tous !
Désolée pour ma réponse un peu tardive. On a eu un peu de mal à faire fonctionner les macro et à les adapter au ficher final
Mais on a pu mettre en place les solutions proposées avec ça fonctionne !! Merci bcp !!
Vraiment encore mille fois merci, c'est absolument génial de pouvoir recevoir de l'aide sur ce genre de problème.
Une excellente journée à vous tous !!
Laetitia.
Bonjour,
Content que tu sois contente.
Pour ma part j'aimerai savoir si ma petite formule correspondait peu, ou prou, à ta demande.
Car évidemment, traduire cette formule en fonction personnalisée (VBA), est relativement (!?) aisé.
A te relire, peut-être.
Cdlt.