[EXCEL 97] Détermination du rang d'une valeur

Fermé
arthix Messages postés 52 Date d'inscription lundi 30 juin 2003 Statut Membre Dernière intervention 31 août 2006 - 20 avril 2005 à 14:29
random Messages postés 1612 Date d'inscription vendredi 26 novembre 2004 Statut Membre Dernière intervention 30 mars 2006 - 28 avril 2005 à 10:34
Salut,

ce petit pb se pose à moi, ca fait une heure que je m'arrache les cheveux dessus, rien à faire ... donc explication :

A B C
___________
1 | 2 | 10 | 22 |
2 | 3 | 20 |
3 | 5 | 30 |
4 | 6 | 40 |
5 | 8 | 50 |
6 | 9 | 60 |

là j'ai défini 6 lignes, mais je peux en avoir beaucoup plus.

Le but est le suivant : pour une valeur donnée (22 par exemple, en C1), je recherche son rang parmi la colonne B (pour la valeur directement inférieure, donc 20 ici) et je rend la valeur de la colonne A correspondante (soit 3 ici)

La solution la plus simple étant d'imbriquer des SI les uns dans les autres jusqu'à arriver à la limitation d'Excel (97 je précise... no coment) à imbriquer au max 7 fonction...

J'ai pensé utiliser NB.SI par exmple :
NB.SI(B1:B6-C1;">0") qui selon moi aurait rendu 2, donc facile de déterminer la ligne mais nan, Excel NB.SI ne prend en paramètre qu'une zone en premier, une condition "fixe" en second (pas possible de mettre >C1 par exemple...) donc c mort

G tenté les matrice, sans succès : je voulais créer une matrice de la forme suivante {B1:B6;C1} mais là aussi ca ne passe pas ... puis après faire un TRI et trouver le RANG de C1 dans cette même matrice ...

Des idées ??

A++

Auré
A voir également:

8 réponses

le problème est que la fonction rang ne fonctionne qu'avec la valeur exacte
alors on pourrait jouer ca comme ca
tu commences par une cellule intermédiaire
=cellule(c1)-mod(c1;10)
tu obtiens 20
ensuite tu veux le rang de 20
tu mets dans une autre cellule=rang(icicellullecontenant20;
c1:c6;1)
ca va te renvoyer 2 attention aux ex aequo
tu nommes b1:b1000 ch
puis tu utilises la fonctioon index(ch;cellule qui revoie2;3)
0
arthix Messages postés 52 Date d'inscription lundi 30 juin 2003 Statut Membre Dernière intervention 31 août 2006 5
20 avril 2005 à 15:22
Salut,

J'ai bien compris que rang ne fctionne que si la valeur dont on cherche le rang fait partie de la sélection, mais mon idée était d'executer la fonction rang sur la matrice formée par A1:A6 plus la valeur en question, soit en fait sur le vecteur :
{10;20;30;40;50;60;22}
après avoir effectué un tri,
cependant il ne semble pas possible (tjrs avec excel 97) de créer un vecteur formé d'une sélection (ici A1:A6) et d'une valeur (C1 par ex ...

enfin oui si je sais effectivement que mes valeurs sont 10 20 30 etc... il est facile d'adopter ta solution, mon pb est plutot que mes valeurs sont du genre 22430 25100 26855 etc ... aucune logique mathématique ...

Merci pour ton aide en tout cas

++
auré
0
random Messages postés 1612 Date d'inscription vendredi 26 novembre 2004 Statut Membre Dernière intervention 30 mars 2006 155
20 avril 2005 à 15:25
pas besoin de tri rang(matrice1;vecteur2)
0
random Messages postés 1612 Date d'inscription vendredi 26 novembre 2004 Statut Membre Dernière intervention 30 mars 2006 155
20 avril 2005 à 16:11
pardon j'ai été interrompu
essaye de faire rang(c2;b2:c6;1) tu obtiendras 22
si ca ne règle pas ta question il te reste les fonctions de base de données

0
arthix Messages postés 52 Date d'inscription lundi 30 juin 2003 Statut Membre Dernière intervention 31 août 2006 5
20 avril 2005 à 16:46
Pareil aucun résultat

ma solution : passer par une colonne intermédiaire pour eviter la saturation des 7 fonction enchainées ... pas glop pas glop excel 97 (je fais avec les outils fournis :-)

++
auré
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
G.David Messages postés 768 Date d'inscription vendredi 21 novembre 2003 Statut Membre Dernière intervention 1 juin 2020 203
27 avril 2005 à 15:59
A B C
___________
1 | 2 | 10 | 22 |
2 | 3 | 20 |
3 | 5 | 30 |
4 | 6 | 40 |
5 | 8 | 50 |
6 | 9 | 60 |

as tu essayé de retourner le tableau
_________
10 | 2 | 1 | 22
20 | 3 | 2 |

et de faire rechercheV(c1;tableau;2;vrai)
le parametre vrai donnant la valeur approchée
le faux donnant la valeur exact (logique microsoft !?!)
par contre j'ignore ce qui se passera après 25 ....
0
bonjour

je ne sais pas si tu peux inverser tes colonnes A et B,
mais en le faisant tu obtiens facilement ce que tu cherche :

A B C D
___________
1 | 2 | 10 | 22 |=RECHERCHEV(C1;A1:B6;2)
2 | 3 | 20 |
3 | 5 | 30 |
4 | 6 | 40 |
5 | 8 | 50 |
6 | 9 | 60 |

avec la formule en D1 tu obtiens 3

Le but est le suivant : pour une valeur donnée (22 par exemple, en C1), je recherche son rang parmi la colonne B (pour la valeur directement inférieure, donc 20 ici) et je rend la valeur de la colonne A correspondante (soit 3 ici)
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
28 avril 2005 à 09:00
bonjour

désolé c'est validé erroné, voici la bonne version :

A B C D
___________
1 | 10 | 2 | 22 |=RECHERCHEV(C1;A1:B6;2)
2 | 20 | 3 |
3 | 30 | 5 |
4 | 40 | 6 |
5 | 50 | 8 |
6 | 60 | 9 |

0
random Messages postés 1612 Date d'inscription vendredi 26 novembre 2004 Statut Membre Dernière intervention 30 mars 2006 155
28 avril 2005 à 10:34
tu crées un module de class que tu nommes mac
dans lequel tu copies
Dim v As New Collection
Public Sub ajout(x As Variant)
Dim ou As Integer
If IsNumeric(x) Then
If v.Count = 0 Then
v.Add (x)
Else
ou = 1
Do While (x < v(ou)) Or ou > v.Count
ou = ou + 1
Loop
If ou > v.Count Then
v.Add (x)
Else
v.Add x, before:=ou
End If
End If
End If
End Sub

Public Function ordre(valcherche As Double, croissant As Boolean) As Variant
Dim u As Integer
For u = v.Count To 1 Step -1
If valcherche = v(u) Then

If Not croissant Then
ordre = u
Else
ordre = v.Count - u + 1
End If
Exit Function
End If
Next u
ordre = "erreur"
End Function

ensuite dans un module tu fais

Function nrang(maval As Double, sens As Boolean, p1 As Range, p2 As Range) As Variant
Dim plage As Range
Dim maco As New mac
Dim boucle As Variant
For Each boucle In p1
maco.ajout (boucle.Value)
Next
For Each boucle In p2
maco.ajout (boucle.Value)
Next
nrang = maco.ordre(maval, sens)
Set maco = Nothing
End Function

ensuite tu invoques la fonction nrang(cellule1,ascendant ou descendant (vrai ou faux); plage1; plage2)
0