Comment trouver une valeur dans un tableau?

C

Carl

Guest
Bonjour les amis,

existe-t-il un moyen de rechercher une réference dans un tableau et qui renverrait la valeur qui se trouve dans la Nième colonne à GAUCHE de cette référence ?

Par exemple: la fonction recherchev(a1;table;3); cette fonction recherche la valeur a1 dans la "table" et renvoi la valeur dans la 3e. colonne à sa droite.

Est-ce qu'il existe une fonction qui ferait la même chose sauf qu'elle renverrait la valeur de la Nième colonne à sa gauche ?

Merci à vous
Carl
 
M

Monique

Guest
Bonjour,

C'est l'inconvénient de Recherchev(), ça va de gauche à droite.

Ta plage nommée "Table" va de K2 à M10
=RECHERCHEV(A1;Table;3;0)
peut être transformé en
=INDEX(M$2:M$10;EQUIV(A1;K$2:K$10;0))

Si tu cherches une valeur située à gauche, en G2:G10 par exemple :
=INDEX(G$2:G$10;EQUIV(A1;K$2:K$10;0))
 
@

@+Thierry

Guest
Bonjour Monique, Carl, le Forum

Oui, avant de partir avec une solution VBA, j'attendais de voir si je ne passais pas à coté d'une Fonction standard pouvant le faire. Et comme à son habitude notre "Fée des Formules" nous trouve une solution.

Mais sinon, donc en VBA, on peut aussi fabriquer les Functions pour faire ses Propres Formules dans des cas de Figures comme celui-ci.

Donc en Feuille "Feuil1" on a son tableau d'items à scanner qui serait en Colonne "H" et on voudrait retourner le correspondance se trouvant en Colonne "A"... sur la feuille active on a en "B1" la valeur à chercher, en "C1" on peut appeler sa Fonction Personnalisée (une fois que l'aura crée ci-dessous) comme ceci :

=VlookUpLeft(B1;7)

Pour procéder à la réalisation d'un fonction personalisée, il suffit d'ouvrir VBE (Visual Basic Editor) et de créer un Module Standard (Module1) et d'y copier ce code :

Option Explicit
Public Function VlookUpLeft(ByVal TheString As String, ByRef TheColumn As Integer) As String
Dim ThePlage As Range, TheCell As Range
Application.Volatile

  With Sheets("Feuil1")
    Set ThePlage = .Range("H1:H" & .Range("H65536").End(xlUp).Row)
  End With

   For Each TheCell In ThePlage
       If TheCell = TheString Then
         VlookUpLeft = TheCell.Offset(0, -TheColumn).Value
         Exit For
       End If
   Next

End Function


A la ligne "Exit For", dans le cas d'une possibilité de plusieurs occurences retournées, on peut laisser ou supprimer cette ligne si on veut, au choix, le retour du Premier Item retourné ou bien sans cette ligne retour du Dernier Item retourné respectivement.


Une variante, afin de pouvoir aussi faire la sélection par l'assistant de fonction de son tableau où se trouve les Items à scanner :

=VlookUpLeftByPlage(B1;H1:H12;7)

Ceci s'appuyant sur cette Function suivante qui passe aussi cette Plage dans les Arguments plutot que de l'avoir en dûr dans le Code :

Public Function VlookUpLeftByPlage(ByVal TheString As String, ByRef ThePlage As Range, ByRef TheColumn As Integer) As String
Dim TheCell As Range
Application.Volatile

   For Each TheCell In ThePlage
      If TheCell = TheString Then
        VlookUpLeftByPlage = TheCell.Offset(0, -TheColumn).Value
        Exit For
      End If
   Next

End Function

Bon Dimanche à tous et toutes
@+Thierry
 
C

Carl

Guest
Salut les amis,

Merci beaucoup pour vos réponses spontanées.

La solution de Monique à l'inconvénient que le tableau de recherche doit être trié dans l'ordre croissant, la fonction me donnait parfois des résultats erronés.

Pour Thierry, j'aurais souhaité ne pas devoir créer des fonctions moi-même, j'ai peur qu'elles prennent trop de temps à l'exécution. Cette formule devrait quand même s'exécuter 80 fois et le tableau de recherche contient près de 2000 lignes!.

J'ai trouvé une solution qui à l'air de fonctionner, je ne sais pas si elle prendrait plus ou moins de temps qu'une autre.

INDIRECT("'Encodage ventes'!A"&EQUIV(B89;v.facture;0)+6)

=> EQUIV(B89;v.facture;0)+6 me renvoi le numéro de ligne (+6) de la valeur en B9 dans la colonne nommée "v.facture".

Avec ce numéro de ligne, je peux construire une formule qui me renvois la valeur de la colonne "A" de la feuille "Encodage ventes" et de la ligne calculée avec EQUIV.

Merci pour votre attention et votre dévouement
Carl
 
M

Monique

Guest
Re,

Mais non, c'est une légende, ça.
Les données n'ont pas besoin d'être triées si tu utilises l'argument 0 ou FAUX
=INDEX(G$2:G$10;EQUIV(A1;K$2:K$10;0))
ou bien :
=INDEX(G$2:G$10;EQUIV(A1;K$2:K$10;FAUX))
 
C

Carl

Guest
Re Monique,

Ca fonctionne parfaitement. je ne sais pas pourquoi mais la première fois que je j'ai essayé ta formule, elle ne me donnait pas tjs la bonne réponse.
J'ai dû mal taper la formule.
En tout cas maintenant ca fonctionne super bien, j'utilise ta formule à la place de la mienne, elle est plus "excel" et prendra surement moins de temps à s'exécuter que la mienne.


Encore merci à toi
Carl
 

Discussions similaires

Statistiques des forums

Discussions
312 749
Messages
2 091 623
Membres
105 009
dernier inscrit
aurelien76110