1
votes

Rechercher une valeur et renvoyer toutes les colonnes dans lesquelles la valeur apparaît

J'ai l'ensemble suivant de listes de noms dans une feuille Google:

╔═══╦════════════╦══════════╦══════════╗
â•‘   â•‘     A      â•‘     B    â•‘     C    â•‘
╠═══╬════════════╬══════════╬══════════╣
â•‘ 1 â•‘ Barry      â•‘ Rich     â•‘ David    â•‘
╠═══╬════════════╬══════════╬══════════╣
â•‘ 2 â•‘ Rich       â•‘ Jeff     â•‘ Michael  â•‘
╠═══╬════════════╬══════════╬══════════╣
â•‘ 3 â•‘ Bruce      â•‘ Bruce    â•‘ Jeff     â•‘
╠═══╬════════════╬══════════╬══════════╣
â•‘ 4 â•‘ Rober      â•‘ Barry    â•‘ Joel     â•‘
╠═══╬════════════╬══════════╬══════════╣
â•‘ 5 â•‘ David      â•‘ Joel     â•‘ Howard   â•‘
╠═══╬════════════╬══════════╬══════════╣
â•‘ 6 â•‘ Michael    â•‘ Howard   â•‘ Rich     â•‘
╚═══╩════════════╩══════════╩══════════╝

J'essaie de trouver une formule à utiliser qui recherche un nom et renvoie tous les noms qui apparaissent dans chaque colonne dans laquelle le nom apparaît. Par exemple, si je recherche Joel, je veux obtenir tout le contenu des colonnes B et C.


1 commentaires

Veuillez également vérifier la dernière réponse .


5 Réponses :


0
votes

essayez comme ceci:

=ARRAYFORMULA(IFNA(VLOOKUP(A1:A, {Sheet1!B:B, Sheet1!A:C}, {2, 4}, 0)))

niveau suivant:

=ARRAYFORMULA(IFNA(VLOOKUP(A1:A, Sheet1:A:C, COLUMN(B:K), 0)))

niveau suivant:

=ARRAYFORMULA(IFNA(VLOOKUP(A1:A, Sheet1:A:C, {2, 3}, 0)))

si plus de colonnes:

=IFNA(VLOOKUP(A1, Sheet1:A:C, {2, 3}, 0))

si Joel est dans la colonne B et que vous voulez retourner la colonne A et C:

=VLOOKUP("Joel", A:C, {2, 3}, 0)


6 commentaires

Ceux-ci ne renvoient qu'un seul nom chacun pour moi. J'ai besoin d'obtenir la colonne entière dans laquelle "Joel" apparaît.


@Dave pouvez-vous partager une copie de votre feuille?


C'est propriétaire, donc je ne peux pas le partager mais c'est exactement le même que mon exemple ci-dessus mais avec beaucoup plus de lignes et de colonnes.


ce n'est pas très clair quelle est votre entrée ... votre joel est dans une cellule ou à travers la plage? si c'est dans une cellule, vous vous attendez à ce que la sortie soit plusieurs lignes? ligne 4 et ligne 5 de votre exemple?


"Joel" est en B5 et C4. Je voudrais donc une liste de tous les noms dans les colonnes B et C. En utilisant les mêmes exemples de données, si je cherchais sur "Michael" (qui est dans A6 et C2), je voudrais une liste de noms dans les colonnes A et C.


@Dave je vois. dans ce cas, utilisez cette réponse: stackoverflow.com/a/64865489/5632629



0
votes

ou peut-être:

=ARRAYFORMULA(FLATTEN(SPLIT(TRIM(REGEXREPLACE(FILTER(A:A&" "&B:B&" "&C:C, 
 REGEXMATCH(A:A&" "&B:B&" "&C:C, D10)), D10, )), " ")))

entrez la description de l'image ici


0 commentaires

1
votes

Vous pouvez essayer la formule suivante:

=IFERROR(INDEX($A:$C,0,SMALL(FILTER(FLATTEN(COLUMN($A:$C)*("Jeff"=$A:$C)),FLATTEN(COLUMN($A:$C)*("Jeff"=$A:$C))>0),COLUMN(A1))),"")

Cette formule remplit automatiquement les lignes, mais pas les colonnes, alors copiez-la à droite.

entrez la description de l'image ici


0 commentaires

0
votes

Cherchez-vous une sortie comme celle-ci: entrez la description de l'image ici

Faites-nous savoir si cela aide ou non.

La formule principale est un peu la force brute, mais assez simple. Mais cela peut avoir des problèmes en fonction du nombre de lignes ou de colonnes que vous pourriez avoir dans vos données.

={query({TRANSPOSE(QUERY({TRANSPOSE(A1:C6)},"
             where Col1 = '" & F1 & "' 
                or Col2 = '" & F1 & "' 
                or Col3 = '" & F1 & "' 
                or Col4 = '" & F1 & "' 
                or Col5 = '" & F1 & "' 
                or Col6 = '" & F1 & "' ",0))},"select Col1 ",0); 
 if(columns(TRANSPOSE(QUERY({TRANSPOSE(A1:C6)},"
             where Col1 = '" & F1 & "' 
                or Col2 = '" & F1 & "' 
                or Col3 = '" & F1 & "' 
                or Col4 = '" & F1 & "' 
                or Col5 = '" & F1 & "' 
                or Col6 = '" & F1 & "' ",0)))>1,
     query({TRANSPOSE(QUERY({TRANSPOSE(A1:C6)},"
             where Col1 = '" & F1 & "' 
                or Col2 = '" & F1 & "' 
                or Col3 = '" & F1 & "' 
                or Col4 = '" & F1 & "' 
                or Col5 = '" & F1 & "' 
                or Col6 = '" & F1 & "' ",0))},"select Col2 ",0),
     "");
  if(columns(TRANSPOSE(QUERY({TRANSPOSE(A1:C6)},"
             where Col1 = '" & F1 & "' 
                or Col2 = '" & F1 & "' 
                or Col3 = '" & F1 & "' 
                or Col4 = '" & F1 & "' 
                or Col5 = '" & F1 & "' 
                or Col6 = '" & F1 & "' ",0)))>2,
     query({TRANSPOSE(QUERY({TRANSPOSE(A1:C6)},"
             where Col1 = '" & F1 & "' 
                or Col2 = '" & F1 & "' 
                or Col3 = '" & F1 & "' 
                or Col4 = '" & F1 & "' 
                or Col5 = '" & F1 & "' 
                or Col6 = '" & F1 & "' ",0))},"select Col3 ",0),
     "")}

MISE À JOUR:

Pour mettre tous les résultats dans une seule colonne, il existe plusieurs options. Vous n'avez pas dit si vous voulez des valeurs uniques ou des noms triés, je vais donc ignorer ces aspects et empiler les résultats verticalement.

Un moyen simple consiste à utiliser une fonction non documentée, FLATTEN , qui peut être ou non supprimée de Sheets à un moment donné.

Ajouté à ma formule originale, cela donne:

=FLATTEN(TRANSPOSE(QUERY({TRANSPOSE(A1:C6)},"
             where Col1 = '" & F1 & "' 
                or Col2 = '" & F1 & "' 
                or Col3 = '" & F1 & "' 
                or Col4 = '" & F1 & "' 
                or Col5 = '" & F1 & "' 
                or Col6 = '" & F1 & "' ",0)))

Mais vous voudrez peut-être une colonne empilée sur une autre, pas une fusion. Dans ce cas, vous pouvez essayer cette formule laide, qui nécessite de répéter la requête plusieurs fois, pour vérifier le nombre de colonnes dans la sortie. Si vous devez suivre cette voie, je vous recommande soit d'enregistrer les résultats de la requête dans une plage d'aide, soit de soumettre une nouvelle question plus spécifique:

=TRANSPOSE(QUERY({TRANSPOSE(A1:C6)},"
             where Col1 = '" & F1 & "' 
                or Col2 = '" & F1 & "' 
                or Col3 = '" & F1 & "' 
                or Col4 = '" & F1 & "' 
                or Col5 = '" & F1 & "' 
                or Col6 = '" & F1 & "' ",0))

entrez la description de l'image ici


4 commentaires

Cela fonctionne bien pour moi, mais que faire si je voulais que toutes les données s'affichent dans une colonne?


Veuillez ajouter vos commentaires à votre question, afin de clarifier la situation pour les autres à l'avenir, lorsqu'ils liront les questions pour voir si elles correspondent à leur situation. Il existe plusieurs façons de mettre les résultats dans une colonne. Voir ma réponse modifiée ci-dessus.


En fonction de vos données, je réalise maintenant que ma formule pourrait nécessiter des améliorations, pour compter le nombre de lignes de données d'entrée et modifier la requête en conséquence. J'attendrai de savoir si c'est un problème pour vous, avant de continuer.


Je veux UNIQUE et TRIER. En utilisant la solution FLATTEN, je peux très facilement emballer le tout en UNIQUE et TRIER (formules que j'utilise souvent). À votre avis, est-ce le meilleur moyen?



1
votes

Vous avez demandé une formule qui

... recherche un nom et renvoie tous les noms qui apparaissent dans chaque colonne dans laquelle le nom apparaît

Veuillez utiliser la formule suivante

=query(ArrayFormula(regexextract( 
                query(flatten(TRANSPOSE(ArrayFormula(column(A2:C)&"-"&A2:C))), 
                   "where Col1 matches '"&textjoin("|",1,(ArrayFormula(if(A2:C=A1,column(A2:C)&"-.*",""))))&"' ") 
                                ,"-(.*)")),  
    "where Col1 is not null ")

Renvoie chaque colonne en entier où A1 est présent


4 commentaires

N'oubliez pas que, conformément aux directives du site, lorsqu'une réponse répond à votre question, acceptez -la et même votez pour que d'autres puissent également en bénéficier.


C'est bien. Il fait la même chose que la solution proposée par @ kirkg13 mais avec moins de code.


"Il fait la même chose que ..." . En quelque sorte. Le grand avantage de la formule ci-dessus est qu'elle reste la même quelle que soit la longueur de la liste de noms , tandis que dans l'autre formule, vous devez la mettre à jour et étendre la «boucle» pour chaque ligne ajoutée. Pouvez-vous imaginer sa longueur si vous avez par exemple 20 ou 50 lignes? Je dirais que la formule la plus proche est celle de @basic


Ouais. Au fur et à mesure que la feuille de calcul grandit, plus de colonnes seront ajoutées. J'ai une fonction personnalisée qui utilise getLastColumn () pour définir cela dans cette formule (je l'ai substituée à tous les endroits où votre échantillon fait référence à la colonne C et cela fonctionne bien). De cette façon, je n'ai pas à faire des ajustements constants à mesure qu'il grandit.