Moyenne des 7 dernières cellules non vides non vides dans Google Sheets

11

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 sauter les blancs. Donc, si dans les 7 derniers il n'y en a que 3 qui sont pleins, je veux qu'il aille plus loin et trouve 7 au total et les moyenne.

Bob l'éponge Carré
la source

Réponses:

6

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 dans la plage donnée.
  • large(..., 7) choisit le 7e plus grand nombre de ce tableau: c'est le numéro de ligne où vous souhaitez commencer la moyenne.
  • iferror(..., row(D7))est une sauvegarde dans le cas où votre gamme contient moins de 7 entrées non vides: dans ce cas, la moyenne commencera par D7. J'aurais pu simplement mettre "7" à la place de row(D7), mais row(D7)rend la formule plus portable au cas où vous décideriez de la copier ailleurs.
  • indirect("D" & ... & ":D")forme la plage de moyenne, par exemple, D9:Dsi la sortie du calcul précédent était de 9.
  • Enfin, averagefait la moyenne. Vous pouvez également placer d'autres fonctions d'agrégation ici.

la source
fonctionne et met à jour de nouveaux changements!
Spongebob Squarepants du
Merci, mais maintenant je pense que la réponse de JPV devrait être la réponse acceptée: c'est plus simple et plus sémantiquement naturel.
il ne s'est pas mis à jour correctement pour moi, j'ai pensé que c'était aussi plus facile mais une fois que j'ai ajouté plus de chiffres, cela n'a pas fonctionné.
Spongebob Squarepants
6

TL; DR

=AVERAGE(OFFSET(A:A;COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1;0))

Exemple

entrez la description de l'image ici

Explication

  • D'abord, nous comptons le nombre de numéros dans la ligne A avec =COUNT(A:A). Les cellules contenant du texte ne seront pas comptées. Notre exemple nous donnerait9
  • De ce nombre , nous soustrayons 7 puisque vous voulez la moyenne des 7 dernières valeurs: =COUNT(A:A)-7. Cela nous donnera un 2.
  • Maintenant, nous utilisons la fonction de décalage 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. Un exemple simplifié pourrait alors ressembler =OFFSET(A:A; COUNT(A:A)-7 ;0). Mais cela ne fonctionnera pas dès que la colonne commencera avec des cellules vides comme indiqué dans l'image ci-dessus

  • Nous devons maintenant étendre notre décalage par le nombre de cellules vides. Cela ne signifie pas que nous comptons toutes les valeurs vides d'affilée. Juste ceux avant la première cellule non vide.

    Vous pouvez les compter avec =MATCH(TRUE;INDEX(A:A<>0);0)-1et obtenir 6comme résultat ou notre exemple

    Maintenant, nous modifions notre fonction de décalage et ajoutons ce nombre pour obtenir la plage correcte contenant seulement 7 valeurs
    OFFSET(A:A; COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1 ;0)

    entrez la description de l'image ici

  • Comme 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 de 4.
    =AVERAGE(OFFSET(A:A;COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1;0))

nixda
la source
Réponse exceptionnelle.
ale
cela a bien fonctionné, mais une fois que j'ai ajouté une autre cellule, elle ne s'est pas mise à jour correctement?
Spongebob Squarepants
2

Encore une autre façon:

=AVERAGE(ARRAY_CONSTRAIN(SORT(FILTER(A:A, ISNUMBER(A:A)), 1, 1), 7, 1))

Explantion:

  1. filtrer toutes les valeurs numériques
  2. retourner la colonne (pour que les dernières valeurs soient au-dessus) en utilisant sort ()
  3. limiter la sortie de cette colonne à 7 lignes (en utilisant ARRAY_CONSTRAIN)
  4. Prenez la moyenne ...

EDIT: Désolé pour un malentendu. Ce qui précède fait la moyenne des 7 PLUS GRANDES valeurs, et non les 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 les données numériques de 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))
JPV
la source
0

=AVERAGE(IFERROR(QUERY(D7:D, 
 "where D is not null 
  offset "&COUNTA(QUERY(D7:D, "where D is not null", 0)) - 7, 0)))

0

user0
la source