Fonction SI avec ET ou OU et des intervalles

Josée

XLDnaute Nouveau
Bonjour à tous,

Je suis un peu perdue ;0... et j'aurais besoin d'aide.
En même temps je suis nouvelle sur le blog et je ne sais pas trop comment ça fonctionne...

Je dois créer une formule qui me permettrait d'identifier des SECTEURS à partir de CENTRES DE RESPONSABILITÉ.
Pour être plus claire, je m'explique :
J'ai une colonne A avec les centres de responsabilité:
ex. de 1121 à 8999
Je veux dans ma colonne B indiquer que : Si b1>=1221<1370 ou <=4129<4200;"SM", etc.
Voici mes intervalles (qui sont bien différentes l'une des autres) :
Cabinet = 1121 et 1122
SM = 1221 à 1369 et 4129 à 4199
Admin= 1422 à 1589 et 3000 et 64000

Merci de m'aider. :(
 

piga25

XLDnaute Barbatruc
Bonjour,
Il aurait été préférable de poster dans la rubrique QUESTION - Forum Excel
D'autre part un petit fichier exemple est toujours mieux pour cerner la question.
Voir si le fichier joint convient
 

Pièces jointes

  • PIGA25 Classeur2.xlsx
    9.8 KB · Affichages: 126

Josée

XLDnaute Nouveau
Bonjour,
Il aurait été préférable de poster dans la rubrique QUESTION - Forum Excel
D'autre part un petit fichier exemple est toujours mieux pour cerner la question.
Voir si le fichier joint convient
@piga25... Ça ne fonctionne pas. J'ai 17 paramètres différents, Est-ce que ça peut être la raison? Je joins un fichier si vous voulez bien m'aider ;( Merci d'avance.
 

Pièces jointes

  • Classeur1.xlsx
    14.7 KB · Affichages: 99

Josée

XLDnaute Nouveau
Bonjour à tous,

A essayer cette formule matricielle
Code:
=INDEX($A$3:$A$19;PETITE.VALEUR(SI(($F2<=$C$3:$C$19)*($F2>=$B$3:$B$19);LIGNE($B$3:$B$19)-2);1))

JHA
Allo JHA,
Ta formule marche super bien dans ton fichier... Quand je la reporte dans le mien, il y a un problème, ma matricielle se copie mais indique l'erreur #NOMBRE!. Il y a une chose que je ne comprends pas bien dans la formule et qui fait peut-être la différence. Que veulent dire le -2);1) de la fin. Merci à l'avance je sens que j'arrive vers un résultat probant. ;)
 

JHA

XLDnaute Barbatruc
Bonjour à tous,

LIGNE($B$3:$B$19)-2);1
La plage débute en b3, le moins 2 permet de revenir au numéro 1 pour comptabiliser le bon numéro de ligne de la petite valeur

Le 1 en bout de formule indique à la fonction de rechercher la valeur la plus petite.

JHA
 

JHA

XLDnaute Barbatruc
Bonjour à tous,

la formule est correcte mais tu as validé en matricielle toute la plage "$c$2:$c$50".
Il faut mettre la formule en "$c$2", la valider en matricielle puis recopier la cellule "$c$2" vers le bas.
Ci joint l'exemple.

JHA
 

Pièces jointes

  • Formule CR TB Classeur1.xlsx
    12.2 KB · Affichages: 72

Dugenou

XLDnaute Barbatruc
Bonjour,
2 problemes dans ta formule :
1) ta zone de recherche commence en ligne 5 donc dans la logique "le moins 2 permet de revenir au numéro 1 pour comptabiliser le bon numéro de ligne de la petite valeur" là il faut écrire -4 pour obtenir 1 quand le résultat est sur la première ligne.
2) les données de la colonne B (titre CR) sont au format texte et non comprises comme des chiffres par excel : 2 solutions : tu changes le format + tu convertis la colonne, tu ecris -- devant chaque référence à la colonne B : donc en B2, à valider en matriciel et à recopier jusqu'en bas :
Code:
=INDEX(PARAMÈTRES!$C$5:$C$21;PETITE.VALEUR(SI((--'Données dotation'!B2<=PARAMÈTRES!$E$5:$E$21)*(--'Données dotation'!B2>=PARAMÈTRES!$D$5:$D$21);LIGNE(PARAMÈTRES!$D$5:$D$21)-4);1))

voir pj : il reste des résultats #nombre : pour 6434 par exemple, car cette valeur n'est dans aucun intervalle
 

Pièces jointes

  • josee.xlsm
    236.3 KB · Affichages: 84

Josée

XLDnaute Nouveau
Rebonjour,

Dans la continuité de ma requête, quelqu'un pourrait me dire ce qu'il y a de problématique dans ma macro (Visual basic)... Tout fonctionne sauf que ma formule matricielle me ramène "faux" sur toute la colonne.

Range("c2:c" & [A100000].End(xlUp).Row).FormulaR1C1 = _
Selection.FormulaArray = _
"=INDEX(PARAMÈTRES!R5C3:R21C3,SMALL(IF((--'Données dotation'!RC[-1]<=PARAMÈTRES!R5C5:R21C5)*(--'Données dotation'!RC[-1]>=PARAMÈTRES!R5C4:R21C4),ROW(PARAMÈTRES!R5C4:R21C4)-4),1))"
Columns("C:C").Select
 

Dugenou

XLDnaute Barbatruc
Bonjour,
Je tente une réponse pour le -4 ou le -2 : libre à tous de me compléter/corriger.

Dans la formule
Code:
PETITE.VALEUR(SI((....);LIGNE($B$3:$B$19)-2);1)
on renvoie la plus petite valeur (donc la première ligne) qui correspond aux critères grâce au ;1) final
Cette valeur retournée est un N° de ligne grâce à la fonction LIGNE($B$3:$B$19) mais on aura la valeur 3 pour la ligne 3. à partir de là deux solutions :
  • soit commence la zone d'index en ligne 1 pour que, quand on retourne la valeur 3, on affiche bien le contenu de la ligne 3 (mais ceci est parfois troublant car on va avoir une formule INDEX($A$1:$A$19.... et toutes les autres plages sur 3:19)
  • soit on enlève directement 2 (quand on est sur une zone 3:xx) pour que la valeur retournée soit 1 et donc la première ligne de la zone d'index (INDEX($A$3:$A$19..). Dans ce cas le point troublant c'est que si on fait la formule sur une autre plage (5:24 par exemple) il faut changer ce -2 en -4 pour avoir 1 quand on retourne le premier "bon" numéro de ligne.
Cordialement
 

Josée

XLDnaute Nouveau
o_Oo_Oo_Oo_Oo_O Ouf! je suis scotchée là!! Dugenou, je suis plus mêlée qu'avant hi!

Quelqu'un pourrait répondre à mon autre requête dans le même ordre d'idée :

Qu'Est-ce qui est problématique dans ma macro (Visual basic)... Ma formule matricielle me ramène "faux" sur toute la colonne. Je sais que ma formule est bonne parce que je l'ai testé et pas de problème mais dans la macro ça ne fonctionne pas...

Range("c2:c" & [A100000].End(xlUp).Row).FormulaR1C1 = _
Selection.FormulaArray = _
"=INDEX(PARAMÈTRES!R5C3:R21C3,SMALL(IF((--'Données dotation'!RC[-1]<=PARAMÈTRES!R5C5:R21C5)*(--'Données dotation'!RC[-1]>=PARAMÈTRES!R5C4:R21C4),ROW(PARAMÈTRES!R5C4:R21C4)-4),1))"
Columns("C:C").Select
 

Josée

XLDnaute Nouveau
Bon, finalement je pense que le problème était : Range("c2:c" & [A100000].End(xlUp).Row).FormulaR1C1 =
qui semble ne pas fonctionner avec une matricielle... Voici ce que j'ai fait:

Range("C4").Select
Selection.FormulaArray = _
"=INDEX(PARAMÈTRES!R5C3:R21C3,SMALL(IF((--'Données dotation'!RC[-1]<=PARAMÈTRES!R5C5:R21C5)*(--'Données dotation'!RC[-1]>=PARAMÈTRES!R5C4:R21C4),ROW(PARAMÈTRES!R5C4:R21C4)-4),1))"
Range("C4").Select
Application.CutCopyMode = False
Selection.Copy
Range(Selection, Selection.End(xlDown)).Select
ActiveSheet.Paste
 

Statistiques des forums

Discussions
315 094
Messages
2 116 148
Membres
112 670
dernier inscrit
Flow87