web-dev-qa-db-ja.com

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

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

11

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から始まります。 row(D7)の代わりに「7」と入力することもできますが、row(D7)を使用すると、他の場所にコピーする場合に備えて、式の移植性が向上します。
  • indirect("D" & ... & ":D")は平均化の範囲を形成します。たとえば、前の計算の出力が9だった場合はD9:Dです。
  • 最後に、averageが平均を行います。他の集計関数もここに配置できます。
6
user79865

TL; DR

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

enter image description here

説明

  • まず、=COUNT(A: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)

    enter image description here

  • 最後のステップとして、この範囲の平均を計算します。 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))

5
nixda

さらに別の方法:

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

外植:

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

編集:誤解して申し訳ありません。上記は、列の最後の7つの値ではなく、LARGEST 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))
2
JPV
=AVERAGE(IFERROR(QUERY(D7:D, 
 "where D is not null 
  offset "&COUNTA(QUERY(D7:D, "where D is not null", 0)) - 7, 0)))

0

0
user0