Double recherche

NicoLaRochelle

XLDnaute Nouveau
Bonjour à tous !

J'ai une base de données qui contient tous les ingrédients de recettes.
Celles-ci sont classées par n°
L'important pour moi est d'identifier quel type de viande est à sortir seulement cet ingrédient n'est jamais à la même place car celle-ci dépend de sa proportion dans la recette.

J'aimerais donc qu'en tapant le n° de la recette, on retrouve quelle viande est présente dans la liste d'ingrédient à partir d'une liste de type de viande définie.

J'ai tenté les RechercheV mais je n'arrive pas à lui faire comparer toute la liste de viande avec la liste d'ingrédients...

cf. fichier joint.

Je n'ai pas réussi à trouver mon bonheur dans les archives (peut être que mes mots clés ne sont pas pertinents).



Merci d'avance à tous !
 

Pièces jointes

  • SOSNico.zip
    9.8 KB · Affichages: 36
Dernière édition:

ODVJ

XLDnaute Impliqué
Re : Double recherche

Bonjour,

voilà une proposition de solution en pièce jointe

cordialement
 

Pièces jointes

  • xld_SOSNico.zip
    13 KB · Affichages: 41
  • xld_SOSNico.zip
    13 KB · Affichages: 42
  • xld_SOSNico.zip
    13 KB · Affichages: 41

Tibo

XLDnaute Barbatruc
Re : Double recherche

Salut Nico,

Regarde le fichier joint.

J'ai ajouté une formule en face de chaque ingrédient + une formule en B4.

Je reste persuadé qu'il y a moyen de faire ça en une seule formule (matricielle certainement), mais je n'ai pas trouvé.

Peut-être que d'autres forumeurs passeront pour te donner une solution en une seule formule, ce qui m'intéresserait également).

@+

Edit : salut ODVJ : pas rafraîchi à temps et donc pas vu ta réponse. C'est bien ce qu'il me semblait, on peut le faire en une seule formule. Merci pour cette petite démonstration.

@+
 

Pièces jointes

  • SOSNico_LaRochelle.zip
    10.1 KB · Affichages: 31

Tibo

XLDnaute Barbatruc
Re : Double recherche

re,

Une "petite" explication :

Formule en B13 :

EQUIV($B$3;BDD!$A:$A;0) : me donne le numéro de ligne de la recette dans BDD

INDIRECT("BDD!L"&EQUIV($B$3;BDD!$A:$A;0);0) : la fonction INDIRECT me permet de « construire » une formule à) partir du numéro de ligne déterminé ci-dessus

ESTNUM(EQUIV("*"&$A12&"*";INDIRECT("BDD!L"&EQUIV($B$3;BDD!$A:$A;0);0));0) : me répond VRAI ou FAUX si la ligne contient le libellé (POULET, …).


=(ESTNUM(EQUIV("*"&$A13&"*";INDIRECT("BDD!L"&EQUIV($B$3;BDD!$A:$A;0);0);0)))*LIGNE()

Pour Excel, VRAI=1, FAUX=0, donc je multiplie 0 ou 1 par le numéro de la ligne, ce qui me donne le numéro de la ligne correspondant à l’ingrédient.


Formule en B4 :

SI(ESTERREUR(DECALER($A$11;SOMME($B$12:$B$20)-11;0));"pas de viande";DECALER($A$11;SOMME($B$12:$B$20)-11;0))

Ensuite, avec la fonction DECALER, je vais rechercher l’info dans BDD. Si il n’y a pas de viande, il me renvoie un message d’erreur, d’où le test SI(ESTERREUR(….

Explication peut-être un peu longue. L’essentiel est de bien décomposer la formule en sous-formules pour en comprendre la logique.

Bon app

@+
 

ODVJ

XLDnaute Impliqué
Re : Double recherche

Bonjour,

un peu de retard pour les explications :

EQUIV(Réponse!$B$3;BDD!$A$2:$A$109;0) :
n° de l'indice ligne du tableau des recettes où se trouve la recette dont le n° est saisi en B3

INDEX(BDD!$B$2:$R$109;EQUIV(Réponse!$B$3;BDD!$A$2:$A$109;0);0) :
matrice Bi:Ri (grace au 0 à la fin) des ingrédients de la recette saisie en B3

CHERCHE("*"&$A$12:$A$20&"*";INDEX(BDD!$B$2:$R$109;EQUIV(Réponse!$B$3;BDD!$A$2:$A$109;0);0)) :
matrice des retours de la fonction cherche pour chaque cellule de la matrice Bi:Ri.
Soit #valeur si pas trouvé, soit position de la chaîne cherchée dans la cellule de Bi:Ri

SI(ESTERREUR(CHERCHE("*"&$A$12:$A$20&"*";INDEX(BDD!$B$2:$R$109;EQUIV(Réponse!$B$3;BDD!$A$2:$A$109;0);0)));10;LIGNE($A$12:$A$20)-1) :
Remplacement des #valeur par le n° de la ligne où est indiqué "pas de viande" ou, lorsqu'un ingrédient de la liste est trouvé, ligne de cet ingrédient (moins 1 pour préparer le futur décaler)

MAX(SI(ESTERREUR(CHERCHE("*"&$A$12:$A$20&"*";INDEX(BDD!$B$2:$R$109;EQUIV(Réponse!$B$3;BDD!$A$2:$A$109;0);0)));10;LIGNE($A$12:$A$20)-1)) :
de la matrice précédente qui contient des nombres 11 ("pas de viande") à 20 ("crevette" trouvé), il faut extraire une valeur. D'où le MAX.

DECALER(A1;MAX(SI(ESTERREUR(CHERCHE("*"&$A$12:$A$20&"*";INDEX(BDD!$B$2:$R$109;EQUIV(Réponse!$B$3;BDD!$A$2:$A$109;0);0)));10;LIGNE($A$12:$A$20)-1));0) :
ne reste plus qu'à décaler A1 de ce MAX en ligne et de 0 en colonne pour rester colonne A

Pour ce qui est des turbines sous casques, je ne suis qu'apprenti.
La turbine en chef s'appelle Monique.

cordialement

PS : avec une pièce jointe, ce sera plus clair
 

Pièces jointes

  • xld_SOSNico.zip
    14.6 KB · Affichages: 23
  • xld_SOSNico.zip
    14.6 KB · Affichages: 26
  • xld_SOSNico.zip
    14.6 KB · Affichages: 27
Dernière édition:

Monique

Nous a quitté
Repose en paix
Re : Double recherche

Bonjour,

Me voilà chef, maintenant ! Et turbine en plus !

La même chose en plus court.

Min(Si(Condition;Ligne(plage))) ou Max(Si(Condition;Ligne(plage)))
renvoient 0 quand il n'y a pas de correspondance
On n'a donc pas besoin de Max(Si(Esterr())

Index(A:A;0) validé par ctrl, maj et entrée, renvoie le contenu de A1
Et A1 contient "Pas de viande"

J'ai mis un format conditionnel dans la Bdd parce que que j'ai failli me perdre.
 

Pièces jointes

  • RechercheNicoLaRochelle.zip
    11 KB · Affichages: 48

Discussions similaires

Réponses
3
Affichages
606

Statistiques des forums

Discussions
312 793
Messages
2 092 155
Membres
105 241
dernier inscrit
Mixlsm