Recherche de valeur dans liste d'arguments

[Résolu/Fermé]
Signaler
Messages postés
53
Date d'inscription
dimanche 5 octobre 2008
Statut
Membre
Dernière intervention
11 juillet 2012
-
Messages postés
53
Date d'inscription
dimanche 5 octobre 2008
Statut
Membre
Dernière intervention
11 juillet 2012
-
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

26 réponses

Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
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)))
Messages postés
53
Date d'inscription
dimanche 5 octobre 2008
Statut
Membre
Dernière intervention
11 juillet 2012
13
Ouille ouille... y a-t-il moyen d'avoir en Anglais svp ?

Merci !
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
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
Messages postés
53
Date d'inscription
dimanche 5 octobre 2008
Statut
Membre
Dernière intervention
11 juillet 2012
13
Ah, ça à l'air de fonctionner. Je vais tester plus amplement quand j'aurais un peu plus de temps :-)

Merci en tout cas !
Messages postés
53
Date d'inscription
dimanche 5 octobre 2008
Statut
Membre
Dernière intervention
11 juillet 2012
13
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 ;-)
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
Salut,
J'ai bien précisé [cf post 3] que : Attention, cette formule ne fonctionne pas s'il y a des doublons dans la liste

Pour faire ce que tu désires, tu dois passer par VBA.
Une piste ici :

https://forums.commentcamarche.net/forum/affich-3623448-macro-excel-recherche-multiple
Messages postés
53
Date d'inscription
dimanche 5 octobre 2008
Statut
Membre
Dernière intervention
11 juillet 2012
13
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 :(
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
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.
Messages postés
53
Date d'inscription
dimanche 5 octobre 2008
Statut
Membre
Dernière intervention
11 juillet 2012
13
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 !
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
Lorsque vous faites un "test" qu'est ce qui s'inscrit en colonne D?
Messages postés
53
Date d'inscription
dimanche 5 octobre 2008
Statut
Membre
Dernière intervention
11 juillet 2012
13
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", ...
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
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


Messages postés
53
Date d'inscription
dimanche 5 octobre 2008
Statut
Membre
Dernière intervention
11 juillet 2012
13
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 ?
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
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)

Messages postés
53
Date d'inscription
dimanche 5 octobre 2008
Statut
Membre
Dernière intervention
11 juillet 2012
13
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.
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
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?
Messages postés
53
Date d'inscription
dimanche 5 octobre 2008
Statut
Membre
Dernière intervention
11 juillet 2012
13
La première colonne. (donc à partir de A7 jusqu'à... )
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
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

Messages postés
53
Date d'inscription
dimanche 5 octobre 2008
Statut
Membre
Dernière intervention
11 juillet 2012
13
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
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
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