web-dev-qa-db-fra.com

Comparaison ligne par ligne avec l'erreur de renvoi FILTER

J'essaie de faire une comparaison ligne par ligne de deux feuilles distinctes et d'afficher les lignes inégales sur une troisième feuille. Par exemple, les lignes trois et cinq sur Sheet1 sont différentes de Sheet2 et je souhaite les afficher uniquement sur Sheet3.

      SHEET1                    SHEET2
   A    B    C               A    B    C
1  INT  STR  BOOL         1  INT  STR  BOOL
2  1    A    TRUE         2  1    A    TRUE
3  2    B    FALSE        3  2    B    TRUE
4  3    C    TRUE         4  3    C    TRUE
5  4    D    FALSE        5  C    3    FALSE

Donc, je voudrais que Sheet3 regarde:

      SHEET3
   A    B    C
1  INT  STR  BOOL
2  2    B    FALSE
3  4    D    TRUE

À l'heure actuelle, la formule que j'utilise est la suivante:

=ARRAYFORMULA(FILTER(IMPORTRANGE("URL1","A2:C5"), IMPORTRANGE("URL1","A2:C5")<>IMPORTRANGE("URL2","A2:C5")))

où les liens appropriés ont été substitués à "URL1" et "URL2" par souci de brièveté dans la formule ci-dessus. Cette formule donne une erreur #VALUE avec l'explication:

La plage de filtre doit être une seule ligne ou une seule colonne.

Est-ce que quelqu'un sait un moyen de résoudre ce problème?

1
Jon

La formule filter effectue un tri dans une seule direction; son deuxième argument doit être une gamme unidimensionnelle de booléens. Donc, vous auriez besoin de comparer les colonnes individuellement; cela devient vite moche avec tous les importranges:

(IMPORTRANGE("URL1","A2:A5")<>IMPORTRANGE("URL2","A2:A5")) + (IMPORTRANGE("URL1","B2:B5")<>IMPORTRANGE("URL2","B2:B5")) + (IMPORTRANGE("URL1","C2:C5")<>IMPORTRANGE("URL2","C2:C5"))

Je suggère donc d’utiliser plutôt query , ce qui permet des requêtes plus complexes. La limite la plus importante de query est que le contenu de chaque colonne doit être du même type (les autres types seront traités comme des valeurs Null). D'après vos informations, INT, STR, BOOL, je suppose que c'est le cas. Donc, voici à quoi ressemblerait la requête:

=query({IMPORTRANGE("URL1","A2:C5"), IMPORTRANGE("URL2","A2:C5")}, "select Col1, Col2, Col3 where Col1 <> Col4 or Col2 <> Col5 or Col3 <> Col6")

Ici, le premier argument est obtenu en tant que jointure de deux tableaux (ils doivent avoir le même nombre de lignes), donc il a 6 colonnes. Le deuxième argument est la chaîne de requête.

2
user79865

Réponse courte

 = ArrayFormula (
 {En-têtes; 
 FILTER (Sheet1, 
 ISNUMBER (
 MATCH (
 Transplay (.)) Données1) , 1E + 100)), 
 Transposer (QUERY (Transposer (Données2) , 1E + 100)), 
 0 
). 
) 
) 
} 
) 

Explication

Lorsqu'une formule ne fonctionne pas, il convient de la simplifier pour pouvoir localiser plus facilement l'erreur.

Dans le cas exposé par l'OP, les parties IMPORTRANGE pourraient être sorties de la formule, comme si vous passiez à une autre partie de la feuille de calcul.

Dans cette réponse, utilisez les noms suivants pour rendre les formules plus lisibles.

  • Les en-têtes sont une gamme de 1 X 3.
  • Data1 correspond aux données renvoyées par IMPORTRANGE("URL1","A2:C5"). Cela a trois colonnes et trois lignes.
  • Data2 correspond aux données renvoyées par IMPORTRANGE("URL2","A2:C5"). Cela a trois colonnes et trois lignes.

La version simplifiée de la formule exposée par le PO est

=FILTER(SHEET1,SHEET1<>SHEET2)

L'erreur signalée par l'OP survient parce que le deuxième argument de FILTER doit être un tableau d'une colonne (n X 1, où n est le nombre de lignes).

Une façon de résoudre le problème consiste à concaténer les colonnes. Pour cela, la proposition consiste à utiliser la structure suivante:

 Transpose(QUERY(Transpose(Data1),,1E+100))

La construction ci-dessus tire parti de la fonction QUERY qui concatène les lignes déclarées comme en-têtes. Le premier Transpose interne fait que les lignes deviennent des colonnes et sont donc traitées comme des en-têtes. Le deuxième argument est vide et le troisième argument est un nombre suffisamment grand pour empconpaser toutes les lignes, dans ce cas toutes les colonnes de Data1. Le Transpose extérieur fait que le résultat de QUERY devient un tableau d'une colonne.

L'utilisation d'un comparateur tel que <> dans une formule matricielle compare ligne par ligne, mais il pourrait être préférable d'utiliser MATCH à la place, si SHEET1 et SHEET2 peuvent avoir un nombre différent de lignes.

ISNUMBER retournera TRUE lorsqu'un calcul a été trouvé et FALSE sinon. Comme il retournera un seul résultat pour chaque cellule lorsqu'un tableau est utilisé comme argument, il retournera dans ce cas un tableau 3 X 1.

La formule proposée dans la section réponse courte s'adapte facilement aux tableaux de sources de n'importe quel nombre de colonnes et de lignes. La condition est que SHEET1 et SHEET2 aient le même nombre de colonnes.

0
Rubén