Recherche de valeur dans liste d'arguments

Résolu/Fermé
Nimsir Messages postés 53 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 11 juillet 2012 - 11 janv. 2010 à 12:42
Nimsir Messages postés 53 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 11 juillet 2012 - 20 janv. 2010 à 14:18
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
A voir également:

26 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
11 janv. 2010 à 13:10
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
Nimsir Messages postés 53 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 11 juillet 2012 13
11 janv. 2010 à 14:05
Ouille ouille... y a-t-il moyen d'avoir en Anglais svp ?

Merci !
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
11 janv. 2010 à 14:31
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
Nimsir Messages postés 53 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 11 juillet 2012 13
11 janv. 2010 à 14:54
Ah, ça à l'air de fonctionner. Je vais tester plus amplement quand j'aurais un peu plus de temps :-)

Merci en tout cas !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Nimsir Messages postés 53 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 11 juillet 2012 13
15 janv. 2010 à 09:57
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
15 janv. 2010 à 11:14
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
0
Nimsir Messages postés 53 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 11 juillet 2012 13
18 janv. 2010 à 10:32
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
18 janv. 2010 à 10:54
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
Nimsir Messages postés 53 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 11 juillet 2012 13
18 janv. 2010 à 14:16
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
18 janv. 2010 à 14:33
Lorsque vous faites un "test" qu'est ce qui s'inscrit en colonne D?
0
Nimsir Messages postés 53 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 11 juillet 2012 13
18 janv. 2010 à 14:46
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
18 janv. 2010 à 16:08
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
Nimsir Messages postés 53 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 11 juillet 2012 13
19 janv. 2010 à 10:35
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
19 janv. 2010 à 10:53
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
Nimsir Messages postés 53 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 11 juillet 2012 13
19 janv. 2010 à 11:02
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
19 janv. 2010 à 12:05
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
Nimsir Messages postés 53 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 11 juillet 2012 13
19 janv. 2010 à 12:12
La première colonne. (donc à partir de A7 jusqu'à... )
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
19 janv. 2010 à 12:31
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
Nimsir Messages postés 53 Date d'inscription dimanche 5 octobre 2008 Statut Membre Dernière intervention 11 juillet 2012 13
20 janv. 2010 à 10:10
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
20 janv. 2010 à 10:45
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