OVH Cloud OVH Cloud

petite.valeur

13 réponses
Avatar
j-pascal
Bonjour à tous (et à toutes ;-) ),

Je dois extraire les 3 plus petites valeurs d'un tableau qui comporte
plusieurs valeurs à "0" et des cellules vides (" ").
Ma cellule de formule ne me renvoit rien, quelque soit la valeur mise pour
"k" !

Ca marche très bien avec "grande.valeur" !

Ex :

si j'ai comme plage (ie) :

0
5
2
9
0
0
4
""
2
2

avec =petite.valeur(plage;3) je devrais avoir 4 comme résultat, non ?

Mystère !

Je sens que je vais encore poser une question bête, mais bon ...

Merci d'avance pour vos lumières,

JP

3 réponses

1 2
Avatar
docm
Qu'en pense nos gurus?

"j-pascal" wrote in message
news:
Re,

En fait, j'ai l'impression que cette "formidable" formule ralentit
l'exécution de mes macros !
Penses-tu que je puisse l'appliquer une seule fois par un test
conditionnel

par exemple ? Ex : si "A1" = 1 alors la formule s'exécute ! Je n'y crois
pas

trop, mais bon... Par ailleurs, dans le cas d'une formule matricielle, je
ne

sais pas comment on peut la faire précéder d'un test, et même si c'est
possible.

J'ai bien pensé à une macro, qui m'inscrirait les valeurs dans les
cellules

et qui ne s'exécuterait qu'une fois, mais là encore j'ignore si je peux
faire un enregistrement automatique avec la saisie d'une formule
matricielle

???

A+ ?

JP


docm wrote:
EQUIV(Vals;Vals;0) donne N/A s'il y a une cellule vide et qu'aucune
cellule ne contient la valeur 0.

Voici qui accepte les cellules vides
d'après AV ( d'après Daniel M):


=SI(ET(NB.VIDE(Vals)>0;NB.SI(Vals;0)=0);PETITE.VALEUR(SI(PRODUITMAT((plage=T



RANSPOSE(plage))*(LIGNE(plage)>=TRANSPOSE(LIGNE(plage)));LIGNE(plage)^0)=1;p



lage);{2;3;4});PETITE.VALEUR(SI(PRODUITMAT((plage=TRANSPOSE(plage))*(LIGNE(p


lage)>=TRANSPOSE(LIGNE(plage)));LIGNE(plage)^0)=1;plage);{1;2;3}))

docm


"j-pascal" wrote in message
news:u#
Bonjour docm,

Merci pour toutes ces explications détaillées. J'ai (je crois !)
suivi scrupuleusement tes conseils, et le résultat qui s'affiche
dans les 3 cellules est "#N/A". J'ai l'habitude de traîter ces
fameux "#N/A" lorsque j'utilise la fonction "RECHERCHEV" mais même
si j'en comprends la nécessité, les formules matricielles ne me sont
pas d'une grande limpidité (doux euphémisme...). Dans le cas
présent, je suis incapable de corriger l'erreur car la formule est
trop complexe pour moi.

A+ ? ;-)

Amicalement,

JP


wrote:
1. Copie la formule donnée par le grand maître AV.
2.Sélectionne la plage contenant toutes les valeurs et nomme-la Vals
(écris Vals au-dessus de la colonne A et p`se sur Entrée)
3. Sélectionne les 3 cellules où tu veux voir les 3 plus petites
valeurs. Ces 3 cellules étant sélectionnées, colle la formule de AV
dans la barre de formule.
4. Confirme que c'est une formule matricielle en pesant sur CTRL-MAJ
Entrée - c-à-d Pèse sur la touche Entrée en maintenant enfoncées les
touches CTRL et MAJ.

Amicalement

docm



"j-pascal" wrote in message
news:
Bonsoir AV,

Ouahhh, c'est plus compliqué que je croyais !!!!
En fait, je ne veux pas le résultat sous forme de "série", je veux
une valeur dans chaque cellule (donc 3 cellules avec un résultat).
En fait je veux récupérer ces valeurs pour les mettre dans une
liste déroulante afin d'en sélectionner une.
Suis-au obligé de recopier manuellement la formule ? Si je fais un
"copié/collé" je ne vois pas comment faire CTRL MAJ ENT !
A+ ?
Merci encore,
JP

wrote:
La série de valeurs : 0;5;2;9;0;0;4;"";2;2

avec =petite.valeur(plage;3) je devrais avoir 4 comme résultat,
non ?


Ben non car, même en excluant les zéros, la 3° petite.valeur des
tes données est
bien 2 !

Pour avoir les 3 plus petites valeurs en excluant les zéros et les
doublons et
donc, pour ta série de données, obtenir comme résultat : 2;4;5
Avec la plage des valeurs nommées "Vals", tu sélectionnes 3 lignes
consécutives --> dans la barre de formule :







=PETITE.VALEUR(SI((Vals>0)*(EQUIV(Vals;Vals;0)=LIGNE(INDIRECT("1:"&LIGNES(Va


ls))));Vals;"");{1;2;3})

Validation matricielle par ctrl+maj+entrée

AV














Avatar
JB
Bonjour,

Ne fonctionne pas si cellules vides sans zéros.

=PETITE.VALEUR(SI((Vals>0)*(EQUIV(Vals;Vals;0)=LIGNE(INDIRECT("1:"&LIGN ES(Vals))));Vals;"");{1;2;3})

http://cjoint.com/?gvxefsHO5i

=PETITE.VALEUR(SI(NON(ESTNA(EQUIV(ch;ch;0)));SI((EQUIV(ch;ch;0)=LIGNE(I NDIRECT("1:"&LIGNES(ch)))*(ch>0));ch));{1;2;3})

JB

Regarde l'exemple joint : http://cjoint.com/?gujykrQGAT

Précise si ça n'est pas ce que tu veux

AV


Avatar
j-pascal
Bonjour JB,

Merci pour cette précision. Docm m'avait mis sur la voie. Je pars bosser et
je regarde vos formules respectives "dans le détail" ce soir...

Comme je l'avais dit à docm, je crains que cette formule matricielle soit
responsable du ralentissement de mes autres macros (la zone Vals est
importante). Je me demande comment je peux momentanément désactiver cette
formule car en fait je n'ai besoin des résultats qu'à l'ouverture du fichier
ou de certaines mises à jours. J'essayerai peut-être avec un test
conditionnel (!!) ou même une macro qui me recopierait lesdits résultat en
"valeurs" ...

A+ ?

JP (et encore merci)


wrote:
Bonjour,

Ne fonctionne pas si cellules vides sans zéros.

=PETITE.VALEUR(SI((Vals>0)*(EQUIV(Vals;Vals;0)=LIGNE(INDIRECT("1:"&LIGNES(Vals))));Vals;"");{1;2;3})

http://cjoint.com/?gvxefsHO5i

=PETITE.VALEUR(SI(NON(ESTNA(EQUIV(ch;ch;0)));SI((EQUIV(ch;ch;0)=LIGNE(INDIRECT("1:"&LIGNES(ch)))*(ch>0));ch));{1;2;3})

JB

Regarde l'exemple joint : http://cjoint.com/?gujykrQGAT

Précise si ça n'est pas ce que tu veux

AV




1 2