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

10 réponses

1 2
Avatar
AV
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(Vals))));Vals;"");{1;2;3})

Validation matricielle par ctrl+maj+entrée

AV
Avatar
j-pascal
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(Vals))));Vals;"");{1;2;3})

Validation matricielle par ctrl+maj+entrée

AV



Avatar
docm
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
j-pascal
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
AV
Regarde l'exemple joint : http://cjoint.com/?gujykrQGAT

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

AV
Avatar
j-pascal
http://cjoint.com/?guttKslhCK


Ca ne ressemble plus vraiment à qq ch mais l'essentiel y est !

Rappel : mon "fichier" commence à la ligne 307 (le reste est habituellement
masqué).

Je suis très impatient de voir où j'ai pu oublier ou mal interpréter tes
conseils...

PS : la zone concernée par ton exemple est en "BJ25:BJ27"

A+

JP



AV wrote:
Publie un extrait de ton fichier à l'aide de :
http://cjoint.com

AV


Avatar
docm
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
j-pascal
Bonsoir docm,

CA MARCHE !!!!!!!!!!!!!!!

J'en suis baba d'admiration !!!!!!!!!!!!!

MERCI ++++++++++++++++++++++++++++++++++

PS : je ne comprends rien à cette formule; d'habitude j'essaie toujours de
décortiquer par égard pour celui, ou celle qui à pris la peine de m'aider,
mais là je jette l'éponge. C'est TROP FORT pour moi. Le seul truc que j'ai
su faire c'est remplacer les "plage" par "Vals" ;-)

Ah, tout ceci me met de bonne humeur :o)

JP

PS bis : avec 2 grosses pointures, j'avais le pressentiment que tout ceci
n'était qu'affaire de quelques heures ;-)


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
j-pascal
Re,

Je viens de mettre en pratique les conseils de docm ; ça marche !

Si j'ai mal interprété ta formule, n'hésite pas à me le dire.

Merci encore pour ta patience. Je vais essayer de me pencher un peu plus sur
les formules matricielles mais je ne suis pas sûr que cela soit de mon
niveau...

JP

AV wrote:
Publie un extrait de ton fichier à l'aide de :
http://cjoint.com

AV


Avatar
j-pascal
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











1 2