回答:
ここに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
、平均を行います。他の集約関数もここに置くことができます。=AVERAGE(OFFSET(A:A;COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1;0))
=COUNT(A:A)
。テキストを含むセルはカウントされません。私たちの例は私たちに与えるでしょう9
=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))
さらに別の方法:
=AVERAGE(ARRAY_CONSTRAIN(SORT(FILTER(A:A, ISNUMBER(A:A)), 1, 1), 7, 1))
外植:
編集:誤解して申し訳ありません。上記は、列の最後の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))