J'ai des nombres dans la plage D7: D et il y a des moments où certaines cellules sont vides. Je veux la moyenne des 7 derniers chiffres, mais ignorer les blancs. Donc, si dans les derniers 7, il n'y en a que 3 qui sont pleins, je veux que cela aille plus loin et trouve le total et la moyenne.
Voici une approche:
=average(indirect("D" & iferror(large(filter(row(D7:D), len(D7:D)), 7), row(D7)) & ":D"))
Explication:
filter(row(D7:D), len(D7:D))
renvoie un tableau composé des numéros de ligne des entrées non vides de la plage donnée.large(..., 7)
sélectionne le 7ème plus grand nombre de ce tableau: il s'agit du numéro de la ligne où vous souhaitez commencer la moyenne.iferror(..., row(D7))
est une sauvegarde si votre plage comporte moins de 7 entrées non vides: dans ce cas, la moyenne commencera par D7. J'aurais pu simplement mettre "7" au lieu de row(D7)
, mais row(D7)
rend la formule plus portable si vous décidez de la copier ailleurs.indirect("D" & ... & ":D")
forme la plage de calcul de la moyenne, par exemple D9:D
si le résultat du calcul précédent est 9.average
fait la moyenne. Vous pouvez également mettre d'autres fonctions d'agrégat ici.=AVERAGE(OFFSET(A:A;COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1;0))
=COUNT(A:A)
. Les cellules contenant du texte ne seront pas comptées. Notre exemple nous donnerait 9
=COUNT(A:A)-7
. Cela nous donnera un 2
.Maintenant, nous utilisons la fonction offset pour obtenir une plage d'une colonne complète, mais avec un décalage de 2 cellules, ce qui signifie effectivement qu'il ne reste qu'une partie d'une colonne avec exactement 7 valeurs restantes.
Imaginez une colonne sans cellules vides avant la première cellule avec des valeurs. Ensuite, un exemple simplifié pourrait ressembler à =OFFSET(A:A; COUNT(A:A)-7 ;0)
. Mais cela ne fonctionnera pas dès que la colonne commence par des cellules vides, comme indiqué dans l'image ci-dessus.
Nous devons maintenant augmenter notre décalage par le nombre de cellules vides. Cela ne signifie pas que nous comptons toutes les valeurs vides dans une ligne. Juste ceux avant la première cellule non vide.
Vous pouvez les compter avec =MATCH(TRUE;INDEX(A:A<>0);0)-1
et obtenir 6
comme résultat ou notre exemple.
Maintenant, nous modifions notre fonction offset et ajoutons ce nombre pour obtenir la plage correcte contenant seulement 7 valeursOFFSET(A:A; COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1 ;0)
En dernière étape, nous calculons la moyenne de cette plage. Notre exemple nous donnerait 4 comme résultat puisque la moyenne de 1,2,3,4,5,6,7 est 4.=AVERAGE(OFFSET(A:A;COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1;0))
Encore une autre manière:
=AVERAGE(ARRAY_CONSTRAIN(SORT(FILTER(A:A, ISNUMBER(A:A)), 1, 1), 7, 1))
Explantion:
EDIT: Désolé pour le malentendu. La moyenne ci-dessus fait la moyenne des 7 valeurs les plus grandes, et non des 7 dernières valeurs d'une colonne. Pour faire la moyenne des 7 dernières valeurs, la solution de Normal Human est excellente. Une autre manière avec moins de fonctions serait d'utiliser QUERY ()
En supposant que les données numériques dans la colonne A, essayez:
=AVERAGE(QUERY(ARRAYFORMULA({ROW(A:A),A:A}),"select Col2 where Col2 is not null order by Col1 desc limit 7", 0))