aide pour formule de condition sur excel

aide pour formule de condition sur excel - Logiciels - Windows & Software

Marsh Posté le 13-12-2006 à 19:56:33    

Bonjour,
 
voilà, je dois établir une formule sur Excel suivant ce principe:
 
si 0<A1>10 et B1=1 alors 5 mais si B1=0 alors -5  ET
si 10<A1>20 et B1=1 alors 10 mais si B1=0 alors -10 ET
si 20<A1>30 et B1=1 alors 20 mais si B1=0 alors -12 ....
 
Je n'arrive pas à rédiger une formule pour ce genre de conditions...
 
Merci pour votre aide
 
Sebdethebes

Reply

Marsh Posté le 13-12-2006 à 19:56:33   

Reply

Marsh Posté le 13-12-2006 à 22:11:47    

je vois pas la logique : quel est le résultat si a1=30 ?


Message édité par Prozac le 13-12-2006 à 22:11:59

---------------
La ligne droite n'est en aucun cas le plus court chemin entre deux points. Sauf, bien sûr, si les deux points sont bien alignés l'un en face de l'autre
Reply

Marsh Posté le 13-12-2006 à 22:13:35    

C'est complètement illogique ta formule. Tu as du te tromper sur certains signes là...

Reply

Marsh Posté le 13-12-2006 à 22:14:50    

Wolfman a écrit :

C'est complètement illogique ta formule. Tu as du te tromper sur certains signes là...


les signes ne peuvent pas être justes et il faut un >= ou <= quelque part sinon c'est indécidable pour 10, 20 etc

 

si le résultat se calcul d'après le nombre des dizaines, on pourrai cependant voir un truc comme
=si(mod(A1;10)<>0;0;f(A1/10))

 

ou f(A1/10) est la fonction du chiffre des dizaines

 

mod (je crois que c'est le même nom dans les versions US et FR) retourne le modulo, en gros le reste de la division euclidienne (je suis plus tout à fait sûr que la syntaxe soit suffisante)

 


Message édité par Prozac le 13-12-2006 à 22:19:13

---------------
La ligne droite n'est en aucun cas le plus court chemin entre deux points. Sauf, bien sûr, si les deux points sont bien alignés l'un en face de l'autre
Reply

Marsh Posté le 14-12-2006 à 08:43:16    

Merci pour vos messages.
 
Ok j'ai commis une erreur .......
si 0<=A1<10 et B1=1 alors 5 mais si B1=0 alors -5  ET  
si 10<=A1<20 et B1=1 alors 10 mais si B1=0 alors -10 ET  
si 20<=A1<30 et B1=1 alors 20 mais si B1=0 alors -20
 
J'espère que c'est plus clair maintenant
 
Merci pour votre aide
 
Sebdethebes

Reply

Marsh Posté le 14-12-2006 à 10:47:53    

Tu peux expliquer comment tu calcules le résultat de sortie d'après l'intervalle ? J'imagine que tu prend le chiffre des dizaines de la borne inférieure mais le 5 fout un peu la merde, là

 

si B1 ne peut prendre que la valeur 0 ou 1, ça peut simplifier aussi

 

Si c'est le cas tu peux essayer ça :
=IF(A1<10;5;ROUND(A1/10;0)*10)*-1^(-1+B1)

 

(version US)

 

Je crois que round c'est ARRONDI, IF est remplacé par SI


Message édité par Prozac le 14-12-2006 à 11:13:38

---------------
La ligne droite n'est en aucun cas le plus court chemin entre deux points. Sauf, bien sûr, si les deux points sont bien alignés l'un en face de l'autre
Reply

Marsh Posté le 14-12-2006 à 11:04:55    

si on découpe ce que tu as écris, on peut avoir comme conditions à tester :
=ET(A1>=0;A1<10;B1=0) alors -5
=ET(A1>=0;A1<10;B1=1) alors 5
=ET(A1>=10;A1<20;B1=0) alors -10
=ET(A1>=10;A1<20;B1=1) alors 10
=ET(A1>=20;A1<30;B1=0) alors -20
=ET(A1>=20;A1<30;B1=1) alors 20
 
on peut regrouper ça avec une fonction SI (je teste successivement les conditions notées ci-dessus)
 

Code :
  1. =SI(ET(A1>=0;A1<10;B1=0);-5;SI(ET(A1>=0;A1<10;B1=1);5;SI(ET(A1>=10;A1<20;B1=0);-10;SI(ET(A1>=10;A1<20;B1=1);10;SI(ET(A1>=20;A1<30;B1=0);-20;SI(ET(A1>=20;A1<30;B1=1);20;"Mauvaise valeur dans une des cellules" ))))))


 
attention, c'est loin d'être parfait, il manque des tests (par exemple, que faire si on a un chiffre <0 en A1, ou autre chose que 0 ou 1 en B1 ? Pour le moment, ça affiche : "Mauvaise valeur dans une des cellules).
il y a sans doute plus court et clair à faire, et on manque un peu d'éléments sur ce que tu veux faire, et d'où sortent ces données.

Message cité 1 fois
Message édité par blueteen le 14-12-2006 à 11:06:36
Reply

Marsh Posté le 14-12-2006 à 11:12:27    


Moi je dis : y'a moyen de faire plus court  :D


Message édité par Prozac le 14-12-2006 à 11:12:57

---------------
La ligne droite n'est en aucun cas le plus court chemin entre deux points. Sauf, bien sûr, si les deux points sont bien alignés l'un en face de l'autre
Reply

Marsh Posté le 14-12-2006 à 11:23:52    

Merci beaucoup de votre retour,
 
B1 ne peut etre que soit 1 ou 0
 
j'ai essayé la formule de Prozac mais cela ne marche pas...ça me demande d'activer les macros mais je ne sais pas comment faire....en plus je ne comprends pas vraiment la formule.....;o)
 
La formule de Blueteen, même si elle est longue, marche bien et me convient parfaitement.
 
Merci encore à vous!!
 
sebdethebes

Reply

Marsh Posté le 14-12-2006 à 11:36:24    

sebdethebes a écrit :

Merci beaucoup de votre retour,
 
B1 ne peut etre que soit 1 ou 0
 
j'ai essayé la formule de Prozac mais cela ne marche pas...ça me demande d'activer les macros mais je ne sais pas comment faire....en plus je ne comprends pas vraiment la formule.....;o)
 
La formule de Blueteen, même si elle est longue, marche bien et me convient parfaitement.
 
Merci encore à vous!!
 
sebdethebes


Elle marche chez moi
 
Pas de macro pour ça, tu as autre chose qui s'ouvre
 
Il ne faut pas la coller simplement, il faut remplacer les noms de fonctions (US) dans leur version française


---------------
La ligne droite n'est en aucun cas le plus court chemin entre deux points. Sauf, bien sûr, si les deux points sont bien alignés l'un en face de l'autre
Reply

Marsh Posté le 14-12-2006 à 11:36:24   

Reply

Marsh Posté le 14-12-2006 à 12:07:11    

oui, avec les fonctions en fr, ça marche
=SI(A1<10;5;ARRONDI(A1/10;0)*10)*-1^(-1+B1)
 
il manque aussi des tests, et même si cette fonction est plus courte, il va galérer le jour où il veut changer les intervalles ou le résultat des conditions :)
mais au moins il a 2 approches (mais je suis fâché avec les maths :D

Message cité 1 fois
Message édité par blueteen le 14-12-2006 à 12:07:21
Reply

Marsh Posté le 14-12-2006 à 12:08:50    

ok j'ai reformulé avec la version française mais en fait j'avais un peu simplifié le truc...voici le tableau de référence que je voudrais mettre en formule:
 
ecart  victoires   defaite    victoire    defaite
         normale    normale   anormale  anormale
 
0-24 6 -5 6 -5
25-49 5,5 -4,5 7 -6
50-99 5 -4 8 -7
100-149 4 -3 10 -8
150-199 3 -2 13 -10
200-299 2 -1 17 -12,5
300-399 1 -0,5 22 -16
400-499 0,5 0 28 -20
500+ 0 0 35 -25
 
donc les résultats ne sont pas toujours les mêmes...
et il faut donc gérer les victoires (B1=0 ou 1) mais aussi le fait que ce soit normal ou anormal (l'écart peut être négatif)
 
la formule de Blueteen marche mais j'ai l'impression qu'on est limité dans la longueur de la formule.....!!!!
 
en gros je suis encore bloqué!! ;o))
 
j'espère qu'avec ce tableau c'est encore plus clair...(je sais j'aurais du le mettre dès le départ!!)
 
Merci
 
Sebdethebes
 

Reply

Marsh Posté le 14-12-2006 à 12:13:01    

à la base, tu es limité à 7 imbrications de SI, je crois.
mais j'ai aussi vu un jour, un moyen de contourner ça.
une fonction macro sera sans doute la meilleur solution
 

Citation :


Si Critère 1 = 1 et Critère 2 = 1 et Critère 3 = 1 alors Situation = Cas 1
On pourrait tenter de gérer avec les fonctions SI et ET mais ça devient vite un peu lourd.


 
il s'agit de la problématique abordée dans ce fichier : http://kachouri.com.free.fr/pdf/53.pdf
 
on trouve dans ce document :

Citation :


Ceci est impossible à réaliser avec Si (7 imbrications possible au
maximum) et de toute façon la formule serait illisible.
Reste la solution de créer sa propre fonction qui, à partir des 3 critères qui lui seront passés en
arguments, déterminera le cas à retenir.


 
il y a sûrement moyen de regarder pour faire le même genre de fonction pour ton cas.


Message édité par blueteen le 14-12-2006 à 12:14:13
Reply

Marsh Posté le 14-12-2006 à 12:29:48    

blueteen a écrit :

oui, avec les fonctions en fr, ça marche
=SI(A1<10;5;ARRONDI(A1/10;0)*10)*-1^(-1+B1)

 

il manque aussi des tests, et même si cette fonction est plus courte, il va galérer le jour où il veut changer les intervalles ou le résultat des conditions :)
mais au moins il a 2 approches (mais je suis fâché avec les maths :D


Ah ben ouais, quand on voit à quoi ça doit servir, ça marche plus  [:maxmaker]

 

Par contre je comprends rien à ton nouveau tableau :/


Message édité par Prozac le 14-12-2006 à 12:30:45

---------------
La ligne droite n'est en aucun cas le plus court chemin entre deux points. Sauf, bien sûr, si les deux points sont bien alignés l'un en face de l'autre
Reply

Marsh Posté le 14-12-2006 à 13:14:54    

Salut,
 
Je n’ai pas tout compris mais il semble qu’il faut
 
soit une macro du type :
 
Sub ValeurEntreetEntre()
Select Case ActiveCell.Value
‘Si la valeur de la cellule active
Case 1 To 4, 8 To 12, 16 To 20
‘Est comprise entre 1 et 4, 8 et 12, 16 et 20
'Il s'agit d'un exemple
Range("A22" ).Value = "valeur"
‘A22 est un exemple
Case 5 To 7, 13 To 15
Range("A23" ).Value = "valeur"
Case Else
Range("A24" ) = "valeur"
End Select
End Sub
 
soit une fonction multiple à plusieurs conditions. Si le nombre de conditions est> à 7, il faut les imbriquer. Il faut faire une formule à 7 conditions et insérer un nom (nom1 par exemple). Il faut refaire la même chose (nom2 par exemple)
La formule est alors :
=SI(nom1;nom1;nom2)
 


Message édité par TAM136 le 14-12-2006 à 13:27:38
Reply

Marsh Posté le 14-12-2006 à 14:54:47    

euh merci tout le monde mais là je suis un peu paumé!!....
 
je vous refait mon tableau en plus simple:
 
si A1 est compris entre 0 et 24 et si B1=1 alors C1=6
 
si A1 est compris entre 0 et -24 et si B1=1 alors C1=6
 
si A1 est compris entre 0 et 24 et si B1=0 alors C1=-5
 
si A1 est compris entre 0 et -24 et si B1=0 alors C1=-5
 
si A1 est compris entre 25 et 49 et si B1=1 alors C1=5.5
 
si A1 est compris entre -25 et -49 et si B1=1 alors C1=7
 
si A1 est compris entre 25 et 49 et si B1=0 alors C1=-4.5
 
si A1 est compris entre -25 et -49 et si B1=0 alors C1=-6
 
etc.....
 
je crois effectivement qu'il me faut une macro mais alors là j'y connais que dalle!
 
y'at-il un site pour que je puisse tenter de réaliser moi-même cette macro?
 
ou si quelqu'un veut la faire ça me va aussi!! ;o))
 
ça me gonfle un peu, je croyais que ça allait être plus simple ....
 
sebdethebes

Reply

Marsh Posté le 14-12-2006 à 16:05:44    

re,
je viens de faire un test avec une macro.
je n'y connais pas grand chose, mais je me suis basé sur le pdf que je t'avais donné plus haut.
donc, en me basant sur tes 4 premières conditions, ça me donne :
 

Code :
  1. Function Situation(valA, valB As Integer) As Integer
  2. If (valA >= 0 And valA <= 24 And valB = 1) Then
  3.     Situation = 6
  4.     Else
  5.     If (valA >= 0 And valA <= 24 And valB = 0) Then
  6.     Situation = -5
  7.         Else
  8.         If (valA >= -24 And valA <= 0 And valB = 1) Then
  9.         Situation = 6
  10.             Else
  11.             If (valA >= -24 And valA <= 0 And valB = 0) Then
  12.             Situation = -5
  13.             End If
  14.         End If
  15.     End If
  16. End If
  17. End Function


 
il faudrait donc compléter le code, avec toutes les conditions que tu dois gérer.
il y en a beaucoup ?
elles sont susceptibles d'évoluer ?
 
dans une feuille de calcul, tu tapes ALT+F11
puis menu insertion/module
tu colles le code ci-dessus
tu enregistres, et tu retournes sur ta feuille de calcul
en C1, tu rentres cette formule : =situation(A1;B1)
et tu essaies des valeurs (uniquement parmi tes 4 premières conditions pour le moment)

Reply

Marsh Posté le 14-12-2006 à 16:22:33    

salut Blueteen,
 
d'abord merci de prendre du temps pour moi!
 
je vien d'effectuer le code que tu m'as donner.
ca marche....j'ais 36 conditions à tester.....mais je vais tacher de faire seul le reste du programme....;o))
 
merci encore pour ton aide!
 
et merci aussi a Prozac et a TAM136!
 
sebdethebes

Reply

Marsh Posté le 14-12-2006 à 16:36:14    

attends une minute avant de commencer, j'ai pris le problème d'une autre façon, ça devrait te faciliter la tâche pour compléter le script, et noter tes intervalle.
bouge pas, je reviens poster dans 3 min

Reply

Marsh Posté le 14-12-2006 à 16:51:17    

j'ai testé ça :
 

Code :
  1. Function Situation(valA, valB As Integer) As Variant
  2. If (valB = 1) Then
  3.             If (valA >= 0 And valA <= 24) Then
  4.             Situation = 1.5
  5.             ElseIf (valA >= 25 And valA <= 49) Then
  6.             Situation = 2
  7.             ElseIf (valA >= 50 And valA <= 74) Then
  8.             Situation = 2.5
  9.             ElseIf (valA >= 75 And valA <= 99) Then
  10.             Situation = 3
  11.             ElseIf (valA < 0 And valA >= -24) Then
  12.             Situation = 3.5
  13.             ElseIf (valA <= -25 And valA >= -49) Then
  14.             Situation = 4
  15.             ElseIf (valA <= -50 And valA >= -74) Then
  16.             Situation = 4.5
  17.             ElseIf (valA <= -74 And valA >= -99) Then
  18.             Situation = 5
  19.             End If
  20.         ElseIf (valB = 0) Then
  21.             If (valA >= 0 And valA <= 24) Then
  22.             Situation = 6
  23.             ElseIf (valA >= 25 And valA <= 49) Then
  24.             Situation = 6.5
  25.             ElseIf (valA >= 50 And valA <= 74) Then
  26.             Situation = 7
  27.             ElseIf (valA >= 75 And valA <= 99) Then
  28.             Situation = 7.5
  29.             ElseIf (valA < 0 And valA >= -24) Then
  30.             Situation = 8
  31.             ElseIf (valA <= -25 And valA >= -49) Then
  32.             Situation = 8.5
  33.             ElseIf (valA <= -50 And valA >= -74) Then
  34.             Situation = 9
  35.             ElseIf (valA <= -74 And valA >= -99) Then
  36.             Situation = 9.5
  37.         End If
  38. End If
  39. End Function


 
je teste d'abord ce qu'on a en B1.
Puis je teste les intervalles.
avec ce script, tu as donc juste à écrire une fois tes intervalles, puis les copier/coller (après le else)
et pour rajouter des conditions, tu as juste à ajouter du code du type :
 

Code :
  1. ElseIf (valA <= -74 And valA >= -50) Then
  2.             Situation = 4.5


 
par contre, j'ai encore un souci, avec tes résultats (virgules et chiffres négatifs)
je vais regarder ce que j'ai comme options à part 'integer' dans les déclarations de variables, je pense que ça doit être lié.
edit : http://silkyroad.developpez.com/VB [...] les/#LII-G
donc c'était bien lié au type de la variable, j'ai changé pour 'Variant'
 
reste peut-être à voir le sens des > et < lorsque tu as des valeurs négatives à tester.
je te laisse tester ça de ton côté
 
Edit2 : bon ça me semble ok pour les signes > et <
j'ai testé des valeurs dans toutes les plages, et ça semble me renvoyer les bonnes valeurs (je te laisse mettre tes propres valeurs pour le résultat : Situation = ....
adapte aussi les intervalles.
 
par contre je vais devoir arrêter pour ce soir.
 
edit3 : j'ai allégé en utilisant des elseif


Message édité par blueteen le 14-12-2006 à 17:34:59
Reply

Marsh Posté le 14-12-2006 à 18:12:59    

merci vraiment de te creuser la tête!!!
 
je vais tester ça !!
 
a tchao
 
sebdethebes

Reply

Marsh Posté le 15-12-2006 à 20:57:18    

Bonsoir

 

Si on se base sur tes conditions, la macro suivante devrait répondre à ton attente:

 

Sub Macro()
If Range("B1" ) = 1 Then
Select Case ActiveCell.Value
Case -24 To 24
Range("C1" ).Value = 6
Case 25 To 49
Range("C1" ).Value = 5.5
Case -49 To -25
Range("C1" ).Value = 7
End Select
End If
If Range("B1" ) = 0 Then
Select Case ActiveCell.Value
Case -24 To 24
Range("C1" ).Value = -5
Case 25 To 49
Range("C1" ).Value = -4.5
Case -49 To -25
Range("C1" ).Value = -6
End Select
End If
End Sub

 

Edit:
Avant de lancer la macro, la cellule A1 doit impérativement être sélectionnée (Select Case ActiveCell)

 

Tu écris:
si A1 est compris entre 0 et 24 et si B1=1 alors C1=6
si A1 est compris entre 0 et -24 et si B1=1 alors C1=6

 

ce qui est équivalent à
si A1 est compris entre -24 et 24 et si B1=1 alors C1=6
à moins que tu aies voulu dire dans une des conditions=-6 et non=6
 

 



Message édité par TAM136 le 16-12-2006 à 09:37:27
Reply

Marsh Posté le 16-12-2006 à 07:51:16    

Bonjour,
Dans feuil2 tu saisis ton barême:
 
   A        B            C         D            E
    0       6           -5          6            -5
25         5,5        -4,5        7            -6
50         5           -4           8           -7
100       4           -3          10           -8
150       3           -2          13           -10
200       2           -1          17           -12,5
300       1          -0,5        22           -16
400       0,5         0           28           -20
500       0            0           35           -25
 
 
 
dans C1 de feuil1 tu introduit la formule
 
=SI(A1<0;RECHERCHEV(ABS(A1);Feuil2!$A$1:$E$10;5-Feuil1!B1);SI(A1=0;"";RECHERCHEV(A1;Feuil2!$A$1:$E$10;4-Feuil1!B1)))
 
et tu étends
Cordialement


Message édité par seniorpapou le 16-12-2006 à 07:58:39
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed