web-dev-qa-db-fra.com

Excel: rechercher une liste de chaînes dans une chaîne particulière à l'aide de formules de tableau?

Je souhaite rechercher une liste de mots dans une cellule ..__ Je pensais que cela fonctionnerait comme une formule matricielle:

{=FIND(<list of words I want to search for>,<cell I want to search>)}

Mais il ne trouve de correspondance que lorsqu'un mot qui se trouve dans la cellule que je cherche se trouve dans la première ligne de la liste de mots que je cherche. Est-il possible d'écrire une formule qui parcoure toute la liste? Et je préférerais que cela ne retourne pas simplement VRAI/FAUX. Je sais comment rechercher dans une cellule une liste de mots et renvoyer VRAI/FAUX en fonction de l'existence ou non d'un mot dans la liste. Je veux réellement savoir quel mot a été trouvé, ou sa position.

Cela renverra le mot correspondant ou une erreur si aucune correspondance n'est trouvée. Pour cet exemple, j'ai utilisé ce qui suit.

Liste des mots à rechercher: G1:G7
Cellule à rechercher dans: A1

=INDEX(G1:G7,MAX(IF(ISERROR(FIND(G1:G7,A1)),-1,1)*(ROW(G1:G7)-ROW(G1)+1)))

Entrez comme formule matricielle en appuyant sur Ctrl+Shift+Enter.

Cette formule fonctionne d'abord en parcourant la liste de mots pour trouver des correspondances, puis en enregistrant la position du mot dans la liste en tant que valeur positive si elle est trouvée ou en tant que valeur négative si elle n'est pas trouvée. La plus grande valeur de ce tableau est la position du mot trouvé dans la liste. Si aucun mot n'est trouvé, une valeur négative est transmise à la fonction INDEX(), générant une erreur.

Pour renvoyer le numéro de ligne d'un mot correspondant, vous pouvez utiliser les éléments suivants:

=MAX(IF(ISERROR(FIND(G1:G7,A1)),-1,1)*ROW(G1:G7))

Ceci doit également être entré comme une formule matricielle en appuyant sur Ctrl+Shift+Enter. Il retournera -1 si aucune correspondance n'est trouvée.

27
Excellll

Ajouter cette réponse aux personnes comme moi pour qui une réponse VRAI/FAUX est parfaitement acceptable

OR(IF(ISNUMBER(SEARCH($G$1:$G$7,A1)),TRUE,FALSE))

ou sensible à la casse

OR(IF(ISNUMBER(FIND($G$1:$G$7,A1)),TRUE,FALSE))

Où l'intervalle pour les termes de recherche est G1:G7

N'oubliez pas d'appuyer sur CTRL + MAJ + ENTRÉE

2
Some_Guy
  1. Organisez votre liste de mots avec un délimiteur qui ne figure jamais dans les mots, par ex. |
  2. swap arguments in find call - nous voulons rechercher si la valeur de la cellule correspond à l'un des mots de la chaîne de modèle {=FIND("cell I want to search","list of words I want to search for")}
  3. si les motifs sont similaires, il y a un risque d'obtenir plus de résultats que souhaité, nous limitons simplement les résultats corrects en ajoutant & "|" à la valeur de cellule testée (fonctionne bien avec les formules de tableau) La cellule G3 peut contenir: {=SUM(FIND($A$1:$A$100&"|";A3))} Cela garantit que la feuille de calcul comparera les chaînes telles que "cellvlaue |" againts "pattern1 |", "pattern2 |" etc. qui résout les conflits tels que pattern1 = "nouvellement ajouté", pattern2 = "ajouté" (la somme de toutes les cellules correspondantes "ajoutées" serait trop élevée, y compris les valeurs cibles des cellules correspondant à "nouvellement ajoutées", ce qui serait logique Erreur)
0
RRTrash