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,
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
Re,
A tester avec une formule matricielle, car tu voulais en formule, mais si la BDD est importante cela va ramer.
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
A+
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
A+
Bonjour Curulis et M12,
C'est encore mieux que ce que j'espérais !
Merci beaucoup à vous 2 , chers Maîtres
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