web-dev-qa-db-fra.com

Filtrer une plage par tableau

J'ai une feuille de calcul Google contenant les équipes de l'UEFA EURO 2012 et leurs scores:

Team     Points  Goals scored
------   ------  ------------
Germany    6          3
Croatia    3          3
Ireland    0          1
...       ...        ...

Maintenant, je veux filtrer cette liste, afin que le résultat ne contienne qu'un sous-ensemble des équipes impliquées. Plus précisément, je souhaite que la liste résultante ne contienne que les équipes Allemagne, Pays-Bas, Portugal, Italie, Angleterre, France, Espagne et Croatie .

Je sais que je peux utiliser la fonction FILTER pour extraire une seule valeur de la table. Ainsi, je pourrais probablement écrire une expression FILTER comme =FILTER(A2:C; A2:A = 'Germany' OR A2:A = 'Netherlands' OR A2:A = 'Portugal' OR ...) mais je voudrais éviter cela, car la liste des équipes est en quelque sorte dynamique.

La question est donc: comment puis-je filtrer le tableau par plage de valeurs - pas seulement une seule valeur?

18
Vidar S. Ramdal

Pour les chercheurs de réponses qui tombent sur ce fil comme moi, consultez cette page du forum des produits Google , où Yogi et ahab présentent des solutions à la question de savoir comment filtrer une plage de données par une autre plage de données .

Si A3:C contient la plage de données de l'UEFA EURO 2012 à filtrer, et D3:D contient la liste des équipes par lesquelles filtrer, puis E3 ...

=FILTER(A3:C, MATCH(A3:A, D3:D,0))

ou

=FILTER(A3:C, COUNTIF(D3:D, A3:A))

Positive filter results

Inversement, si vous souhaitez filtrer par équipes non répertoriées dans D3:D, puis E3...

=FILTER(A3:C, ISNA(MATCH(A3:A, D3:D,0)))

ou

=FILTER(A3:C, NOT(COUNTIF(D3:D, A3:A)))

Negative filter results

Voici un exemple de feuille de calcul que j'ai fait pour démontrer l'efficacité de ces fonctions.

43
Greg

pour ceux qui ont besoin d'utiliser les formules greg's et qui luttent contre l'inadéquation des plages de FILTER

=FILTER(A1:A, MATCH(A1:A, B1:B, 0))

=FILTER(A1:A, COUNTIF(B1:B, A1:A))

=FILTER(A1:A, ISNA(MATCH(A1:A, B1:B, 0)))

=FILTER(A1:A, NOT(COUNTIF(B1:B, A1:A)))

dans le cas où vous devez utiliser la formule FILTER pour renvoyer l'évaluation entre deux plages, et ces deux plages sont de taille différente (comme lorsqu'elles sont renvoyées à partir d'une requête) et ne peuvent pas être modifiées pour correspondre à la même taille et vous venez de recevoir une erreur FILTER has mismatched range sizes. Expected row count: etc., alors voici une solution:

pour rester simple, disons que vos plages pour le filtre sont A1: A10 et B1: B8 , vous pouvez utiliser des crochets de tableau {} pour ajouter deux lignes virtuelles sur la plage B1:B8 pour correspondre à la taille A1:A10 en utilisant REPToù le nombre nécessaire les répétitions doivent être calculées par un simple calcul entre les plages initiales.

puis à cette formule REPT, nous devons ajouter +1 comme correction/sécurité intégrée (dans le cas où la différence entre deux plages initiales est de 1), car REPT fonctionne avec un minimum de 2 répétitions . Donc, dans un sens, nous devrons créer une plage de B1:B11 (à partir de B1:B8) et, plus tard, nous allons simplement couper la dernière ligne d'une plage afin que ce soit B1:B10 contre A1:A10. nous utiliserons 2 symboles uniques pour REPT

l'étape suivante serait d'envelopper REPT dans SPLIT et de diviser par le 2e symbole unique. puis, (en fonction d'un besoin supplémentaire), ce SPLIT doit être enveloppé dans TRANSPOSE (parce que nous voulons faire correspondre la taille de la colonne à la taille de la colonne) et la dernière étape serait de l'envelopper dans QUERY et limit sortent de nouveau la sortie par des calculs simples de COUNTA(A1:A10) pour couper le dernier rept. ensemble, cela ressemblerait à ceci:

=FILTER(A1:A10, NOT(COUNTIF(QUERY({B1:B8; 
 TRANSPOSE(SPLIT(REPT("♂♀", COUNTA(A1:A10)-COUNTA(B1:B8)+1), "♀"))}, 
 "limit "&COUNTA(A1:A10), 0), A1:A10)))

2
player0