OVH Cloud OVH Cloud

Transformer une formule en vba

9 réponses
Avatar
AbedH
Bonjour,
Comment transformer cette formule en vba
=SI(M6<15000;0;SI(M6>120000;ARRONDI.SUP(((M6-120000)*35%);0)+29500;ARRONDI(SI(ET((ENT(M6/10)*10)*12>120000;(ENT(M6/10)*10)*12<360000);SI((40*((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100<1000;(((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)-1000;SI((40*((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100>1500;(((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)-1500;(((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)-(40*((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100));SI(ET((ENT(M6/10)*10)*12>=360000;(ENT(M6/10)*10)*12<=1440000);SI((40*((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100<1000;(((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)-1000;SI((40*((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100>1500;(((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)-1500;(((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)-(40*((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100));SI(ET((ENT(M6/10)*10)*12>1440000;(ENT(M6/10)*10)*12<9999999);SI((40*((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100<1000;(((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-1000;SI((40*((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100>1500;(((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-1500;(((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-(40*((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100));SI((ENT(M6/10)*10)*12>9999999;(((((ENT(M6/10)*10)*12-9999999)*35/100)+3368999,65)/12)-1500))));0)))
j'ai réussi avec msgbox Range("M6").formula mais quand je l’insère dans un sub il m'indique erreur et se change de couleur en rouge.
merci par avance

9 réponses

Avatar
isabelle
bonjour AbedH ,

ce serait plus facile si tu nous donnais la logique de cette formule

isabelle

Le 2014-04-09 16:08, AbedH a écrit :
Bonjour,
Comment transformer cette formule en vba
Avatar
HD
Bonjour,

Tu as essayé de lancer l'enregistrement de macro et de cliquer sur la
cellule. Avec cela tu auras la formule dans un code VBA et tu n'auras
alors plus qu'à faire un copier/coller... c'est ce que je fais pour
reconstituer rapidement une formule Excel en VBA.

@+
HD
Avatar
abedh
Le mercredi 09 Avril 2014 à 22:08 par AbedH :
Bonjour,
Comment transformer cette formule en vba
=SI(M6<15000;0;SI(M6>120000;ARRONDI.SUP(((M6-120000)*35%);0)+29500;ARRONDI(SI(ET((ENT(M6/10)*10)*12>120000;(ENT(M6/10)*10)*12<360000);SI((40*((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100<1000;(((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)-1000;SI((40*((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100>1500;(((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)-1500;(((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)-(40*((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100));SI(ET((ENT(M6/10)*10)*12>60000;(ENT(M6/10)*10)*12<40000);SI((40*((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100<1000;(((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)-1000;SI((40*((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100>1500;(((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)-1500;(((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)-(40*((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100));SI(ET((ENT(M6/10)*10)*12>1440000;(ENT(M6/10)*10)*12<9999999);SI((40*((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100<1000;(((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-1000;SI((40*((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100>1500;(((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-1500;(((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-(40*((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100));SI((ENT(M6/10)*10)*12>9999999;(((((ENT(M6/10)*10)*12-9999999)*35/100)+3368999,65)/12)-1500))));0)))
j'ai réussi avec msgbox Range("M6").formula mais quand je
l’insère dans un sub il m'indique erreur et se change de couleur
en rouge.
merci par avance


Bonjour isabelle,HD
j'utilise cette formule excel pour calculer l’abattement irg(impôt sur les revenus global) depuis un salaire imposable pour chaque employé, pour
éviter de changer à chaque fois l'adresse de la cellule contenant le soumis à l'irg j'aimerai la transformer en fonction personnalisé en vba et j'inscris dans une cellule exemple IRG(B4) c'est ça marche j’espère que c'est clair et merci de vos réponses par la même occasion j'essaye la proposition de HD.
Avatar
abedh
Le mercredi 09 Avril 2014 à 22:08 par AbedH :
Bonjour,
Comment transformer cette formule en vba
=SI(M6<15000;0;SI(M6>120000;ARRONDI.SUP(((M6-120000)*35%);0)+29500;ARRONDI(SI(ET((ENT(M6/10)*10)*12>120000;(ENT(M6/10)*10)*12<360000);SI((40*((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100<1000;(((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)-1000;SI((40*((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100>1500;(((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)-1500;(((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)-(40*((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100));SI(ET((ENT(M6/10)*10)*12>60000;(ENT(M6/10)*10)*12<40000);SI((40*((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100<1000;(((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)-1000;SI((40*((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100>1500;(((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)-1500;(((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)-(40*((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100));SI(ET((ENT(M6/10)*10)*12>1440000;(ENT(M6/10)*10)*12<9999999);SI((40*((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100<1000;(((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-1000;SI((40*((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100>1500;(((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-1500;(((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-(40*((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100));SI((ENT(M6/10)*10)*12>9999999;(((((ENT(M6/10)*10)*12-9999999)*35/100)+3368999,65)/12)-1500))));0)))
j'ai réussi avec msgbox Range("M6").formula mais quand je
l’insère dans un sub il m'indique erreur et se change de couleur
en rouge.
merci par avance


Bonjour isabelle,HD
j'utilise cette formule excel pour calculer l’abattement irg(impôt sur les revenus global) depuis un salaire imposable pour chaque employé, pour
éviter de changer à chaque fois l'adresse de la cellule contenant le soumis à l'irg j'aimerai la transformer en fonction personnalisé en vba et j'inscris dans une cellule exemple IRG(B4) c'est ça marche j’espère que c'est clair et merci de vos réponses par la même occasion j'essaye la proposition de HD.
Avatar
abedh
Le mercredi 09 Avril 2014 à 22:08 par AbedH :
Bonjour,
Comment transformer cette formule en vba
=SI(M6<15000;0;SI(M6>120000;ARRONDI.SUP(((M6-120000)*35%);0)+29500;ARRONDI(SI(ET((ENT(M6/10)*10)*12>120000;(ENT(M6/10)*10)*12<360000);SI((40*((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100<1000;(((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)-1000;SI((40*((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100>1500;(((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)-1500;(((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)-(40*((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100));SI(ET((ENT(M6/10)*10)*12>60000;(ENT(M6/10)*10)*12<40000);SI((40*((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100<1000;(((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)-1000;SI((40*((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100>1500;(((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)-1500;(((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)-(40*((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100));SI(ET((ENT(M6/10)*10)*12>1440000;(ENT(M6/10)*10)*12<9999999);SI((40*((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100<1000;(((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-1000;SI((40*((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100>1500;(((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-1500;(((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-(40*((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100));SI((ENT(M6/10)*10)*12>9999999;(((((ENT(M6/10)*10)*12-9999999)*35/100)+3368999,65)/12)-1500))));0)))
j'ai réussi avec msgbox Range("M6").formula mais quand je
l’insère dans un sub il m'indique erreur et se change de couleur
en rouge.
merci par avance


re,
j'ai lancer l'enregistrement de macro qui ma donnée exactement comme il ma dit HD je lai insérée dans une fonction et quand j'utilise cette même fonction comme ça IRG8(B4) par exemple j'obtiens #REF donc quel est le problème d’après vous?

Function IRG8(zz)
'
' Macro2 Macro
'

'
IRG8 = _
"IF(zz<15000,0,IF(zz>120000,ROUNDUP(((zz-120000)*35%),0)+29500,ROUND(IF(AND((INT(zz/10)*10)*12>120000,(INT(zz/10)*10)*12<360000),IF((40*((((INT(zz/10)*10)*12-360000)*20/100)+48000)/12)/100<1000,(((((INT(zz/10)*10)*12-360000)*20/100)+48000)/12)-1000,IF((40*((((INT(zz/10)*10)*12-360000)*20/100)+48000)/12)/100>1500,(((((INT(zz/10)*10" & _
"000)*20/100)+48000)/12)-1500,(((((INT(zz/10)*10)*12-360000)*20/100)+48000)/12)-(40*((((INT(zz/10)*10)*12-360000)*20/100)+48000)/12)/100)),IF(AND((INT(zz/10)*10)*12>60000,(INT(zz/10)*10)*12<40000),IF((40*((((INT(zz/10)*10)*12-360000)*30/100)+48000)/12)/100<1000,(((((INT(zz/10)*10)*12-360000)*30/100)+48000)/12)-1000,IF((40*((((INT(zz/1" & _
"-360000)*30/100)+48000)/12)/100>1500,(((((INT(zz/10)*10)*12-360000)*30/100)+48000)/12)-1500,(((((INT(zz/10)*10)*12-360000)*30/100)+48000)/12)-(40*((((INT(zz/10)*10)*12-360000)*30/100)+48000)/12)/100)),IF(AND((INT(zz/10)*10)*12>1440000,(INT(zz/10)*10)*12<9999999),IF((40*((((INT(zz/10)*10)*12-1440000)*35/100)+382000)/12)/100<1000,(((((INT(R[-1]" & _
"*12-1440000)*35/100)+382000)/12)-1000,IF((40*((((INT(zz/10)*10)*12-1440000)*35/100)+382000)/12)/100>1500,(((((INT(zz/10)*10)*12-1440000)*35/100)+382000)/12)-1500,(((((INT(zz/10)*10)*12-1440000)*35/100)+382000)/12)-(40*((((INT(zz/10)*10)*12-1440000)*35/100)+382000)/12)/100)),IF((INT(zz/10)*10)*12>9999999,(((((INT(zz/10)*10)*12-9999999)*35/100)" & _
"65)/12)-1500)))),0)))"
End Function
merci
Avatar
MichD
Bonjour,

Regarde ceci :

Exemple : Pour copier ta formule en C1
'-------------------------------------------------------------
Sub test()
Dim F As String
F = "=IF(M6<15000,0,IF(M6>120000,ROUNDUP(((M6-120000)*.35),0)+29500," & _
"ROUND(IF(AND((INT(M6/10)*10)*12>120000,(INT(M6/10)*10)*12<360000)," & _
"IF((40*((((INT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100<1000," & _
"(((((INT(M6/10)*10)*12-360000)*20/100)+48000)/12)-1000," & _
"IF((40*((((INT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100>1500," & _
"(((((INT(M6/10)*10)*12-360000)*20/100)+48000)/12)-1500," & _
"(((((INT(M6/10)*10)*12-360000)*20/100)+48000)/12)-" & _
"(40*((((INT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100))" & _
",IF(AND((INT(M6/10)*10)*12>60000,(INT(M6/10)*10)*12<40000)" & _
",IF((40*((((INT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100<1000," & _
"(((((INT(M6/10)*10)*12-360000)*30/100)+48000)/12)-1000," & _
"IF((40*((((INT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100>1500," & _
"(((((INT(M6/10)*10)*12-360000)*30/100)+48000)/12)-1500," & _
"(((((INT(M6/10)*10)*12-360000)*30/100)+48000)/12)-" & _
"(40*((((INT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100))," & _
"IF(AND((INT(M6/10)*10)*12>1440000,(INT(M6/10)*10)*12<9999999)" & _
",IF((40*((((INT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100<1000," & _
"(((((INT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-1000," & _
"IF((40*((((INT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100>1500," & _
"(((((INT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-1500," & _
"(((((INT(M6/10)*10)*12-1440000)*35/100)+382000)/12)" & _
"-(40*((((INT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100))" & _
",IF((INT(M6/10)*10)*12>9999999,(((((INT(M6/10)*10)*12" & _
"-9999999)*35/100)+3368999.65)/12)-1500)))),0)))"

Range("C1").Formula = F

End Sub
'-------------------------------------------------------------
Avatar
abedh
Le mercredi 09 Avril 2014 à 22:08 par AbedH :
Bonjour,
Comment transformer cette formule en vba
=SI(M6<15000;0;SI(M6>120000;ARRONDI.SUP(((M6-120000)*35%);0)+29500;ARRONDI(SI(ET((ENT(M6/10)*10)*12>120000;(ENT(M6/10)*10)*12<360000);SI((40*((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100<1000;(((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)-1000;SI((40*((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100>1500;(((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)-1500;(((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)-(40*((((ENT(M6/10)*10)*12-360000)*20/100)+48000)/12)/100));SI(ET((ENT(M6/10)*10)*12>60000;(ENT(M6/10)*10)*12<40000);SI((40*((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100<1000;(((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)-1000;SI((40*((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100>1500;(((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)-1500;(((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)-(40*((((ENT(M6/10)*10)*12-360000)*30/100)+48000)/12)/100));SI(ET((ENT(M6/10)*10)*12>1440000;(ENT(M6/10)*10)*12<9999999);SI((40*((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100<1000;(((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-1000;SI((40*((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100>1500;(((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-1500;(((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)-(40*((((ENT(M6/10)*10)*12-1440000)*35/100)+382000)/12)/100));SI((ENT(M6/10)*10)*12>9999999;(((((ENT(M6/10)*10)*12-9999999)*35/100)+3368999,65)/12)-1500))));0)))
j'ai réussi avec msgbox Range("M6").formula mais quand je
l’insère dans un sub il m'indique erreur et se change de couleur
en rouge.
merci par avance


Bonjour MichD
je souhaiterai pas la recopier dans une autre cellule, je voudrais l’utiliser comme fonction personnalisée en vba genre IRG(M6), le problème dans cette fonction et de la modifier à chaque fois quand je change de cellule ici c'est M6 qui devrai être changée càd si l'imposable se trouve dans la cellule H10 je dois modifier M6 par H10 c'est un peut fatigant, si vous avez d'autre solution je suis preneur merci.
Avatar
MichD
Tu travailles avec quelle version d'Excel?

Les versions précédentes permettaient 8 imbrications de "si".
Depuis Excel 2007, au niveau de la feuille de calcul, tu as droit à 64

Il faudrait que tu transformes ta formule en utilisant des imbrications,
mais
en utilisant soit des If ... else ... End If

Dans un deuxième temps, il serait possible de transformer la procédure de If
....End If
en fonction.

En VBA, la référence à une cellule s'écrit comme ceci : Range("M6")
Tu utilises une variable pour affecter le résultat dans le cas où la
condition se réalise
comme dans la suggestion suivante :

If Range("M6") <15000 then
X = 0
IF(Range("M6") >120000 then
X = ROUNDUP(((PLG-120000)*.35),0)+29500 ....

Dans la formule que j'ai présentée, tu as déjà toutes les fonctions
traduites en anglais!


Ceci pour toutes les conditions. Ce n'est pas une mince tâche que de
splitter ce type de formule
lorsque l'on a aucune idée de la problématique!
Avatar
isabelle
bonjour,

tu pourrais recréer les conditions à l'aide de Select Case
tu peut mettre autant de "Case" que besoin.

http://support.microsoft.com/kb/141691/fr

Function IRG(rng) 'sur la feuille de calcul =IRG(M6)
Select Case rng
Case Is < 15000: IRG = 0
Case Is > 120000: IRG = RoundUp(((M6 - 120000) * 0.35), 0) + 29500
Case 12000 To 36000: IRG = xx
End Select
End Function

isabelle

Le 2014-04-10 06:57, abedh a écrit :

Bonjour isabelle,HD
j'utilise cette formule excel pour calculer l’abattement irg(impôt sur les
revenus global) depuis un salaire imposable pour chaque employé, pour
éviter de changer à chaque fois l'adresse de la cellule contenant le soumis à
l'irg j'aimerai la transformer en fonction personnalisé en vba et j'inscris dans
une cellule exemple IRG(B4) c'est ça marche j’espère que c'est clair et merci de
vos réponses par la même occasion j'essaye la proposition de HD.