Recherche de valeur dans liste d'arguments

Résolu
Bonjour,

Tout d'abord, une bonne et heureuse année 2010 à toutes et à tous ;-)

Ensuite, mon problème...

J'ai une feuille excel avec différentes valeurs... J'aimerai une formule qui me rendre un "TRUE" si cette une valeur est présente dans une liste d'arguments, et "FALSE" si elle ne l'est pas.

Donc en admettant que dans A1 j'ai une valeur "papa" et que de C1 à C5 j'ai "soeur, frère, maman, chien, chat, poisson rouge", j'aimerai que dans B1 il me mette un FALSE (car pas dans la liste) et un "TRUE" si cela avait été "chien" par exemple dans A1... Vous me suivez ? ^^
D'autre part, il faudrait que cela respecte la casse. Il devrait me renvoyer "TRUE" quand "chien" se trouve dans la liste, mais "FALSE" quand "Chien" se trouve dans la liste... idem pour "chienne" (FALSE), ...

A vi, tout ça en sachant que j'ai excel en anglais :-)

Merci d'avance pour l'aide que vous pourrez me fournir !

Bonne journée,
Nim
Configuration: Windows XP Internet Explorer 6.0

26 réponses

Résumé de la discussion

Le fil explore comment déterminer, dans Excel, si une valeur en A1 figure dans une liste (C1:C5) et renvoyer TRUE ou FALSE avec une vérification sensible à la casse. Plusieurs méthodes Excel existent, notamment une combinaison de EXACT et RECHERCHEV pour tester la présence avec casse stricte, mais elles peuvent échouer en présence de doublons. D'autres répondants privilégient une macro VBA pour effectuer une recherche sensible et contourner les limites des formules, mais cela implique du code. En cas de liste dynamique ou très longue, la solution la plus robuste est souvent une fonction personnalisée ou l'adaptation des plages.

Bobot (l’IA à votre service)
  1. Modérateur
    Bonjour,
    Il existe certainement 3-4 méthodes pour parvenir à ce résultat. J'ai combiné 3 fonctions excel : ESTERREUR, EXACT et RECHECHEV ; il ne s'agit là que d'un exemple.
    En A1 ton nom, en B1:B1000 ta liste en C1 : =SI(ESTERREUR(EXACT(A1;RECHERCHEV(A1;B1:B1000;1;FAUX)));"FAUX";EXACT(A1;RECHERCHEV(A1;B1:B1000;1;FAUX)))
    0
    1. Ouille ouille... y a-t-il moyen d'avoir en Anglais svp ?

      Merci !
      0
      1. Modérateur
        Oula...
        A tester, c'est pas vraiment sur...
        =IF(ISERROR(EXACT(A1;VLOOKUP(A1;C1:C1000;1;FALSE)));"FALSE";EXACT(A1;VLOOKUP(A1;C1:C1000;1;FALSE))")
        Attention, cette formule ne fonctionne pas s'il y a des doublons dans la liste.
        Je l'ai actualisé avec :
        en A1 la valeur
        en C1:C1000 la liste.
        Donc formule à placer en B1
        0
        1. Ah, ça à l'air de fonctionner. Je vais tester plus amplement quand j'aurais un peu plus de temps :-)

          Merci en tout cas !
          0
          1. Hmm,

            J'ai un tit souchis... Quand j'ai deux valeurs "pareils" dans la liste des arguments (par exemple CHIEN et chien) il prend en compte le CHIEN mais pas le chien.... pourtant c'est assez important.

            Il devrait chercher la valeur IDENTIQUE EN TOUT POINTS... Moyen d'arranger ça ? :(

            Bonne journée ;-)
            0
            1. Dans la mesure ou quand je retire "chien" dans la liste des valeurs et qu'il ne reste donc plus que "CHIEN", il me mets quand même un "FALSE", y a quelque chose qui ne va pas.

              Je suis allé voir ton lien, qui semble correspondre à ce que j'ai besoin, mais je connais strictement rien aux macros :/ Je ne saurais même pas ou je dois aller tapper tout ça :(
              0
              1. Modérateur
                Salut,
                Pour "installer" ce code dans ton classeur, ouvre le, tape ALT+F11, Insertion/Modules et copie/colle ce code dans la fenêtre. Ferme ensuite la fenêtre Visual Basic et teste ta macro : ALT+F8 sélectionne "Trouve" et OK.

                Sub Trouve() 
                With Worksheets("Feuil1").Range("C1:C40") 
                Set c = .Find(Range("A1").Value, LookIn:=xlValues) 
                If Not c Is Nothing Then 
                Range("B1") = "True" 
                Else 
                Range("B1") = "False" 
                End If 
                End With 
                End Sub 


                Je l'ai adapté à ton cas : valeur cherchée en A1, Résultat en B1 et plage de recherche C1:C5.
                Reviens ici si tu en as besoin.
                0
                1. Bon, dans la mesure ou ça devient de plus en plus précis, et au-delà de mes compétence en la matière, je vais expliquer exactement.

                  Je travail dans une compagnie d'assurance, et j'ai besoin de savoir combien d'offres sont faite chaque jour sur notre site web.
                  J'extrait ces statistique, que je colle dans une feuillle excel.
                  Toutefois, je dois retirer toutes les offres n'ayant pas de numéro, et toutes les offres "tests" (que nous on fait pour vérifier si certaines mises à jour ont bien été éffectuée).

                  Bref, ce rapport je le colle à partir A7 va jusqu'en H et a une langueur indéterminée (un jour il peut y avoir 15 offres, et le lendemain 150 par exemple).

                  Les numéros des offres se trouvent en C et les noms (là ou il y aura également marqué si c'est un test) dans la D.

                  Une ligne est donc comme ceci:

                  Marque - Date - Numéro de l'offre - Nom client - modèle véhicule - concession - vendeur

                  Ce que j'ai tenté de faire, c'est d'abord vérifié s'il y a un numéro à l'offre (colonne C). Si non, c'est directement 0 qui apparait dans la colonne I
                  S'il y a un numéro, il vérifie si c'est un test (colonne D) ou non. Si c'est un test, il marque 0 donc la colonne I, si ce n'est pas un test, c'est 1.

                  Merci

                  Vous pourriez vous demandé ce que les chiens et autres venaient faire dans l'histoire ? Bah, dans la mesure ou c'est pour mon boulot, je ne suis pas sensé donner ce genre d'informations. J'ai donc dit des exemples, et puis je me serais débrouillé après. Mais vu qu'on commence avec des macros et tout et tout et que ça, ça me dépasse, je préfère dire ce qu'il en est afin que vous puissiez m'aider de façon optimale :-)

                  Merci en tout cas !
                  0
                  1. Modérateur
                    Lorsque vous faites un "test" qu'est ce qui s'inscrit en colonne D?
                    0
                    1. Justement, c'est ce qu'il faut voir. Ca peut être différentes choses. C'est pour ça que j'ai créé une liste avec ceux que j'avais déjà découvert jusqu'à présent...

                      Par exemple, un client ne souhaitant pas mettre son nom et tout ça mettra aussi "test", mais ça il ne faut pas retirer. Mais si c'est moi qui fait un test je mettrais "Test Nim" pour reconnaitre.
                      Mais, mon boss peut très bien faire un test, et dès lors il mettra "Test JDG" ou "test jdg" ou autre. Ou encore, mon collègue peut en faire un et ce sera "test LM" ou autre. Il se peut même qu'il ne mettent pas le test, et seulement le "JDG" ou "LM", ...
                      0
                      1. Modérateur
                        Alors allons y...
                        Tout d'abord, placer la liste des noms à tester (Test JDG, test jdg, Test Nim etc...) en Feuil2 entre A1 et A40 (en gras dans le code si dessous pour adapter chez vous)

                        Sub Trouve()
                        Dim derlig As Integer, i As Integer, j As Integer
                        'vérifie si la cellule C... contient quelque chose, si oui alors inscrit 1 en colonne I
                        derlig = Range("C65536").End(xlUp).Row
                        For i = 1 To derlig
                        If Range("C" & i) <> "" Then
                        Range("I" & i) = 1
                        Else
                        Range("I" & i) = 0
                        End If
                        Next i
                        'vérifie si le contenu de la cellule D... est contenu entre A1 et A40 feuille2
                        derlig = Range("D65536").End(xlUp).Row
                        With Worksheets("Feuil2").Range("A1:A40")
                        For j = 1 To derlig
                        Set c = .Find(Range("D" & j).Value, LookIn:=xlValues)
                        If Not c Is Nothing Then
                        If c Like Range("D" & j).Value Then
                        Range("I" & j) = 0
                        Else
                        Range("I" & j) = 1
                        End If
                        End If
                        Next j
                        End With
                        End Sub


                        0
                        1. A première vu ça à l'air de fonctionner :-)

                          Je verrais ça plus en détail dès que j'ai un peu plus le temps, et je vous dirai quoi. En tout cas, déjà un grand merci. Simple question, si je rajoute des valeurs et que la liste dépasse le A40, je n'ai qu'à changer le

                          Range("A1:A40")

                          en adaptant le A40 par A45 par exemple ?
                          0
                          1. Modérateur
                            Salut,
                            Oui tout à fait. Il est possible aussi de le faire de manière variable afin que le Range s'adapte de lui même :

                            Dim numlig as Integer
                            numlig = Sheets("Feuil2").Range("A65536").End(XlUp).Row
                            'blablabla
                            'et remplacer : Range("A1:A40") par :
                            Range("A1:A" & numlig)

                            0
                            1. Ok. Parcontre, je viens de faire quelques tests, et j'ai remarqué que certaines valeurs dans la liste ne sont pas pris en compte. Il met donc des 1 là où il devrait y avoir des 0.
                              0
                              1. Modérateur
                                Oui effectivement problème de casse. Si .find cherche ChiEn et trouve cHien, il s'arrête là...
                                Je suis en train de repenser le code pour le simplifier et faire en sorte que cela fonctionne. Peux tu me dire, dans ta feuille 1 (celle qui comprends toute ton extraction) qu'elle est la colonne qui sera systématiquement la plus longue?
                                0
                                1. La première colonne. (donc à partir de A7 jusqu'à... )
                                  0
                                  1. Modérateur
                                    Alors teste ce code :

                                    Sub test()
                                    Dim cel As Range
                                    Dim derlig As Integer, j As Integer, numlig As Integer
                                    derlig = Sheets("Feuil1").Range("A65536").End(xlUp).Row
                                    numlig = Sheets("Feuil2").Range("A65536").End(xlUp).Row
                                    With Worksheets("Feuil2")
                                    For j = 7 To derlig
                                        For Each cel In .Range("A1:A" & numlig)
                                            If cel.Value Like Range("D" & j).Value Then
                                            Range("I" & j) = 0
                                            GoTo suivant
                                            Else
                                                If Range("C" & j) = "" Then
                                                Range("I" & j) = 0
                                                Else
                                                Range("I" & j) = 1
                                                End If
                                            End If
                                        Next cel
                                    suivant:
                                    Next j
                                    End With
                                    End Sub

                                    0
                                    1. Hier j'ai fait un test vite fait, mais il mais énormément de temps...

                                      Aujourd'hui, premier test, il me met un bug à cette ligne là...

                                      numlig = Sheets("Test List").Range("A65536").End(xlUp).Row
                                      0
                                      1. Modérateur
                                        Salut,
                                        Très long c'est normal, je ne suis pas le roi de la macro rapide. Là il y a deux tests à faire sur de nombreuses données je suppose?
                                        numlig = Sheets("Test List").Range("A65536").End(xlUp).Row

                                        ne doit pas bugger... As tu déclaré
                                        numlig as Integer
                                        0
                                        • 1
                                        • 2