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

arthix Messages postés 53 Statut Membre -  
random Messages postés 1612 Statut Membre -
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é

8 réponses

  1. random
     
    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
    1. arthix Messages postés 53 Statut Membre 5
       
      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
  2. random Messages postés 1612 Statut Membre 155
     
    pas besoin de tri rang(matrice1;vecteur2)
    0
  3. random Messages postés 1612 Statut Membre 155
     
    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
  4. arthix Messages postés 53 Statut Membre 5
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. G.David Messages postés 790 Statut Membre 203
     
    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
  7. gbinforme
     
    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
  8. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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
  9. random Messages postés 1612 Statut Membre 155
     
    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