Formule extraction multicritères

Bonjour à toutes et à tous et meilleurs vœux,

Je bute sur un pb qui va peut-être vous sembler simple...

J'ai modifié une formule matricielle pour obtenir un résultat adapté à mon cas.

Voici le contexte :

J'ai une feuille Excel avec une liste de données (BDD).

Sur une autre feuille du même classeur, j'ai modifié la formule.

Celle-ci va cherhcer le N° de ligne dans la feuille "BDD" en fonction d'un critère sur la feuille par défaut (feuil2, cellule J2)

J'obtiens bien le N° de ligne de la 1ère valeur trouvée et si je fais un copie vers le bas, j'ai les suivantes, tout va bien.

Voici la formule en question :

{=SIERREUR(PETITE.VALEUR(SI(NON(ESTERREUR(CHERCHE($J$2;BDD!$B$2:$B$7000)));LIGNE(BDD!$A$2:$A$7000)-LIGNE(BDD!$A$1);10000000);LIGNE()-LIGNE($D$1));"")}

J'aimerais que le critère de recherche ne soit plus une seule cellule, mais plusieurs (une liste de critères).

Je ne vois pas comment y arriver en modifiant cette formule et si c'est possible. Je souhaite rester en mode formule, si possible aussi...

Pouvez-vous m'éclairer, svp ?

Merci d'avance pour vos réponses.

Merlinois

Bonjour,

Quelqu'un peut m'aider sur ce pb ?

Même en changeant complètement de méthode... ?

Merci d'avance.

Merlinois.

Bonjour,

Bonjour,

Oui, désolé, ce sera plus explicite avec un ficher exemple.

Je donne à nouveau une explication par la même occasion, sans utiliser la formule du dessus.

Je souhaite extraire les données de la Feuil1 en fonction de critères différents qui sont dans la Feuil2, colonne A(Critères) dans la colonne D(Résultats).

Par exemple, tous les aliments qui font partie de la famille 1, 2 et 3 de la Feuil1, doivent apparaître dans la Feuil2 colonne D.

J'espère avoir été clair...

Merci de vos réponses.

Merlinois

13test.xlsx (12.06 Ko)

Re,

A tester avec une formule matricielle, car tu voulais en formule, mais si la BDD est importante cela va ramer.

25test-1.xlsx (18.10 Ko)

Merci M12 !

C'est bien ce que je voulais.

Mais comme tu le dis, j'ai une base de données volumineuse... Ca risque de ramer.

Et en plus, il peut y avoir des dizaines de critères différents. et non pas seulement 3.

N'étant pas un expert, je pensais qu'une formule pouvait suffire.

Si c'est plus facile avec du VBA, pas de souci pour moi, je ferais un bouton pour exécuter le code.

Merci d'avance.

Merlinois

Salut Merlinois,
Salut M12,

La macro démarre au moindre changement dans 'Extract' [A:A] - Critères.
Si la vitesse n'est pas suffisante, on passera par des tableaux.

Private Sub Worksheet_Change(ByVal Target As Range)
'
Dim lgRow1&, lgRow2&
'
Application.ScreenUpdating = False
'
If Not Intersect(Target, Columns(1)) Is Nothing Then
    Columns(4).Value = ""
    [D1] = "Résultats"
    With Worksheets("BDD")
        .Range("A1").CurrentRegion.Sort key1:=.[C2], order1:=xlAscending, Orientation:=xlTopToBottom, Header:=xlYes
        For x = 2 To Range("A" & Rows.Count).End(xlUp).Row + 1
            If Range("A" & x).Value <> "" Then _
                iRow1 = .Columns(3).Find(what:=Range("A" & x).Value, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Row: _
                iRow2 = .Columns(3).Find(what:=Range("A" & x).Value, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlPrevious).Row: _
                Range("D" & Range("D" & Rows.Count).End(xlUp).Row + 1).Resize(iRow2 - iRow1 + 1, 1).Value = _
                    .Range("A" & iRow1 & ":A" & iRow2).Value
        Next
        .Range("A1").CurrentRegion.Sort key1:=.[A2], order1:=xlAscending, Orientation:=xlTopToBottom, Header:=xlYes
    End With
End If
'
Application.ScreenUpdating = True
'
End Sub
18merlinois.xlsm (20.25 Ko)


A+

Salut Curulis

Ma participation

14test-1.xlsm (24.18 Ko)

Salut M12, on ne se rencontre pas souvent, mes respects, cher maître !

autre version car il est logique que des changements puissent intervenir autant dans les critères que dans la BDD des aliments.
Cette fois-ci, le code (placé dans 'ThisWorkbook'), réagit à un changement autant en 'BDD' [C:C] qu'en 'Extract' [A:A] pour actualiser live les résultats.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'
Dim sWkBDD As Worksheet, sWkEXT As Worksheet, lgRow1&, lgRow2&
'
Set sWkBDD = Worksheets("BDD")
Set sWkEXT = Worksheets("Extract")
Application.EnableEvents = False
Application.ScreenUpdating = False
'
If (Sh.Name = "BDD" And Target.Column = 3) Or (Sh.Name = "Extract" And Target.Column = 1) Then
    sWkEXT.Columns(4).Value = ""
    sWkEXT.[D1] = "Résultats"
    With sWkBDD
        .Range("A1").CurrentRegion.Sort key1:=.[C2], order1:=xlAscending, Orientation:=xlTopToBottom, Header:=xlYes
        For x = 2 To sWkEXT.Range("A" & Rows.Count).End(xlUp).Row + 1
            If sWkEXT.Range("A" & x).Value <> "" Then _
                iRow1 = .Columns(3).Find(what:=sWkEXT.Range("A" & x).Value, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Row: _
                iRow2 = .Columns(3).Find(what:=sWkEXT.Range("A" & x).Value, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlPrevious).Row: _
                sWkEXT.Range("D" & sWkEXT.Range("D" & Rows.Count).End(xlUp).Row + 1).Resize(iRow2 - iRow1 + 1, 1).Value = _
                    .Range("A" & iRow1 & ":A" & iRow2).Value
        Next
        .Range("A1").CurrentRegion.Sort key1:=.[A2], order1:=xlAscending, Orientation:=xlTopToBottom, Header:=xlYes
    End With
End If
'
Application.ScreenUpdating = True
Application.EnableEvents = True
'
End Sub
32merlinois.xlsm (22.94 Ko)


A+

Bonjour Curulis et M12,

C'est encore mieux que ce que j'espérais !

Merci beaucoup à vous 2 , chers Maîtres , pour ces exemples de programmation en VBA ! J'espère qu'un jour je pourrai aussi en faire autant, mais il y a encore du travail !!

J'étais mal parti avec ma formule...

En tout cas, vous m'avez évité des heures de recherches.

Merci encore.

Au plaisir et bonne continuation sur ce forum très utile et sympathique !

Merlinois

Rechercher des sujets similaires à "formule extraction multicriteres"