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

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. 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. 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. pas besoin de tri rang(matrice1;vecteur2)
    0
    1. 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
      1. 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
        1. 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
          1. 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
            1. Contributeur
              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
              1. 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