'*****************************************************************************************************
'recherche multicriteres multicolonnes
'version 2.0
'auteur:patricktoulon(Exceldownload)
'on peut mettre autant de colonnes et d'argument que l'on veut (((à hauteur du len max d'une formule)))
'chaque argument(recherche) correspond a l'item de colonnes du meme index
'basé sur la formule de @mapomme(Exceldownload)
'la récupération des lignes ne concerne que les colonnes demandées
'*****************************************************************************************************
Option Explicit
Sub testx()
Dim Colonnes, Recherche, Feuille As Worksheet, meslignes
Colonnes = Array("a", 3, 5) ' les colonnes peuvent etre exprimées en numerique ou lettre(minuscule ou Majuscule)
'Recherche = Array(1, 1, 3) 'les arguments peuvent etre string ou numeriques
Recherche = Array(1, "TOTO", 3) 'les arguments peuvent etre string ou numeriques(Majuscule ou minuscule ne respecte pas la casse)
Set Feuille = Feuil1 ' feuille concernée
Set meslignes = GetRangeLine(Feuille, Colonnes, Recherche) 'get
MsgBox "les ligne trouvées de la plage sont " & vbCrLf & meslignes.Address 'exemple d'utilisation
End Sub
exemple en piece jointe
Function GetRangeLine(F, Colonnes, arg)
Dim a&, formule$, I&, Fml, Fr$, x, full As Range, res As Range, Derlig&
Derlig = F.Cells(Rows.Count, Colonnes(0)).End(xlUp).Row
ReDim Fml(UBound(Colonnes))
Set full = F.Range(F.Cells(1, Colonnes(0)), F.Cells(Rows.Count, Colonnes(UBound(Colonnes))))
For I = 0 To UBound(Colonnes)
Colonnes(I) = F.Name & "!" & F.Cells(1, Colonnes(I)).Resize(Derlig).Address(0, 0)
If Not IsNumeric(arg(I)) Then arg(I) = """" & arg(I) & """"
Fml(I) = "(" & Colonnes(I) & "=" & arg(I) & ")"
Next
formule = "=IFERROR(SMALL(IF(" & Join(Fml, "*") & " ,ROW(1:" & Derlig & ")),ind),0)"
For I = 1 To Derlig
a = a + 1
Fr = Replace(formule, "ind", a)
x = Evaluate(Fr)
If x > 0 Then
Debug.Print Fr: Debug.Print x
If res Is Nothing Then Set res = full.Rows(x) Else Set res = Union(res, full.Rows(x))
Else
Exit For
End If
Next
Set GetRangeLine = res
End Function