Googleスプレッドシートの最後の7つの空でない空白でないセルの平均


11

D7:Dの範囲の数値があり、一部のセルが空になる場合があります。最後の7つの数値の平均が必要ですが、空白はスキップします。したがって、最後の7つで満杯の数が3つしかない場合は、さらに戻って合計7つを見つけ、それらの平均を求めます。

回答:


6

ここに1つのアプローチがあります:

=average(indirect("D" & iferror(large(filter(row(D7:D), len(D7:D)), 7), row(D7)) & ":D"))

説明:

  • filter(row(D7:D), len(D7:D)) 指定された範囲内の空でないエントリの行番号で構成される配列を返します。
  • large(..., 7) この配列から7番目に大きい数値を選択します。これは、平均化を開始する行番号です。
  • iferror(..., row(D7))範囲に空白でないエントリが7つ未満の場合の安全策です。この場合、平均はD7から始まります。の代わりに "7"を指定することもできますがrow(D7)row(D7)他の場所にコピーする場合に備えて、式をより移植しやすくします。
  • indirect("D" & ... & ":D")たとえば、D9:D前の計算の出力が9の場合、平均化の範囲を形成します。
  • 最後にaverage、平均を行います。他の集約関数もここに置くことができます。

動作し、新しい変更を更新します!
スポンジボブスクエアパンツ2015年

ありがとう、でも今はJPVの答えは受け入れられるべきだと思います。それはよりシンプルで、より意味的に自然です。

正しく更新されなかったので、もっと簡単だと思いましたが、数値を追加すると機能しなくなりました。
Spongebob Squarepants

6

TL; DR

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

ここに画像の説明を入力してください

説明

  • 最初に、行Aの数をで数えます=COUNT(A:A)。テキストを含むセルはカウントされません。私たちの例は私たちに与えるでしょう9
  • 最後の7つの値の平均が必要なので、この数値から7を引きます=COUNT(A:A)-7。これは私たちに与え2ます。
  • 次に、オフセット関数を使用して完全な列の範囲を取得しますが、オフセットが2セルであるので、列の一部だけが残り、正確に7つの値が残っています。

    値のある最初のセルの前に空白のセルがない列を想像してください。その場合、簡略化した例は次のようになり=OFFSET(A:A; COUNT(A:A)-7 ;0)ます。しかし、これは上の図に示すように列が空白のセルで始まるとすぐには機能しません

  • 次に、空白セルの数だけオフセットを拡張する必要があります。これは、すべての空白値を続けてカウントすることを意味するものではありません。最初の空でないセルの前のものだけ。

    あなたはそれらを数え、結果または私たちの例として=MATCH(TRUE;INDEX(A:A<>0);0)-1得ることができます6

    次に、オフセット関数を変更し、このカウントを追加して、7つの値のみを含む正しい範囲を取得します
    OFFSET(A:A; COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1 ;0)

    ここに画像の説明を入力してください

  • 最後のステップとして、この範囲の平均を計算します。この例では、1、2、3、4、5、6、7の平均が4であるため、結果として4になります。
    =AVERAGE(OFFSET(A:A;COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1;0))


卓越した答え。
エール

正常に動作しましたが、別のセルを追加すると、正しく更新されませんでしたか?
スポンジボブスクエアパンツ2015年

2

さらに別の方法:

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

外植:

  1. すべての数値を除外する
  2. (最後の値が上になるように)sort()を使用して列を上下逆にします
  3. その列の出力を7行に制限する(ARRAY_CONSTRAINを使用)
  4. 平均を取る...

編集:誤解して申し訳ありません。上記は、列の最後の7つの値ではなく、最大の7つの値を平均します。直近の7つの値を平均化するには、Normal Humanのソリューションが最適です。関数の少ない別の方法は、QUERY()を使用することです。

列Aの数値データを想定して、次のことを試してください。

=AVERAGE(QUERY(ARRAYFORMULA({ROW(A:A),A:A}),"select Col2 where Col2 is not null order by Col1 desc limit 7", 0))

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.