Recherche multi critere en VBA ou formule
Bonjour,
j'avais déjà pose une question similaire il y a environ 1 an mais je souhaiterai "complexifier" la chose.
Comme un exemple est plus clair qu'un long paragraphe je vous joint ma feuille "exemple" en pièce jointe !
Merci d'avance à ceux qui prendront le temps de m'aider
Edit modo : voici la demande, toujours mieux de la mettre dans le post
Je souhaiterai (si possible) :
Dans la cellules JAUNES C1 s'affiche le resultat de la recherche suivante :
- Rechercher tous les "A" (valeur de B1) se trouvant dans la zone A2:N21 de la FEUIL2
- Chaque fois que la lettre "A" est trouvée dans la zone de recherche on recuperer le "chiffre indice" immediatement à GAUCHE et on recherche dans la même colonne mais à partir de la ligne 22 (Zone en vert) le ou les "chiffre indice" pour recuperer la valeur de la cellule immédiatement à DROITE.
- Cela est effectué pour chaque colonne ou A est trouvé et une liste est constituée avec tous les résultats trouvés
- On recupere une valeur ALEATOIRE dans cette liste de resultats et on l'affiche en C1 (Cellule JAUNE dans mon exemple)Dans mon exemple :
- Pour trouver C1 : je recherche la valeur donnée en "B" (ici A) dans la zone A2:A21 de la FEUIL2 (je le trouve 10 fois "en ORANGE")
- Je recupere les "chiffres indice" immédiatement à gauche de chaque valeur A trouvée et recupere les valeurs associées aux chiffres indice dans chaque colonne (zone en vert à partir de la ligne 22)
- Je choisi alors aleatoirement UNE SEULE valeur (ici en BLEU) dans la liste composée de toutes les valeurs (15 valeurs dans mon exemple) associées à "A" avec les même chiffre indice"
- Pour C1 j'obtient donc le resultat "J"
Bonsoir @ tous !
Une proposition :
Sub LouReeD()
Dim Trouve As Range, Adr As String, LaChaine As String, Valeur, Col, I, Temp, Tablo
' on cherche la première valeur
Set Trouve = Sheets("Feuil2").Range("B2:AC21").Find(Sheets("Feuil1").Range("B1"), lookat:=xlWhole)
' si on en trouve une
If Not Trouve Is Nothing Then
' on récupère l'adresse de la cellule
Adr = Trouve.Address
' on récupère le numéro de colonne des chiffres
Col = Trouve.Column - 1
' on lance une boucle indéfinie afin de cherche les autres occurences
Do
' on récupère le chiffre à gauche de l'occurence
Valeur = CDbl(Trouve.Offset(, -1))
' on boucle sur la colonne de chiffre à partir de la ligne 22
For I = 22 To 34
' si on trouve on ajoute la lettre à la chaine
If Sheets("Feuil2").Cells(I, Col) = valeur Then LaChaine = LaChaine & Sheets("Feuil2").Cells(I, Col).Offset(, 1) & ","
Next
' on lance la recherche suivante de l'occurence
Set Trouve = Sheets("Feuil2").Range("B2:AC21").FindNext(Trouve)
' on sort de la boucle si on tombe sur la première adresse trouvée
Loop While Trouve.Address <> Adr
' on réduit la chaine d'un caractère pour enlever la dernière virgule
' et on la split sur avec les virgules
Tablo = Split(Mid(LaChaine, 1, Len(LaChaine) - 1), ",")
' on choisi au hasard un index du tableau
Temp = Int(Rnd * UBound(Tablo))
' on affiche la lettre correspondante
Sheets("Feuil1").Range("C1") = Tablo(Temp)
Else
' on a pas trouver d'occurence
MsgBox ("La valeur : " & Sheets("Feuil1").Range("B1") & " n'a pas été trouvée...")
End If
End Sub@ bientôt
LouReeD
Merci à Tulipe et Loureed !
Désolé pas trop eu le temps de reprendre mes tests ces derniers jours...
Alors tulipe ta formule m’intéresse (car l’idéal était de ne pas utilisé de VBA) mais je n'arrive pas à rechercher toutes les lettres c'est assez bizarre...
Pour toi Loureed étant moins à l'aise avec VBA je t'avouerai que je n'ai pas réussi à transposer ton code dans mon fichier...