1

範囲数式内でExcelOFFSETまたはスプレッドシート関数を使用した経験がある人はいますか?INDIRECT

値の列の合計を使用したいのですが、オフセットのサイズが異なる列である各行に固有の水平オフセットを使用します。たとえば、範囲内のデータが次の場合A1:C3:

[1  2  3;
 1  2  3;
 1  2  3]

で指定されたオフセットD1:D3はです。6 を指定する[0; 1; 2]ような構文を使用したいと思います{=sum(offset(A1:A3, 0, D1:D3)}

別のオプションは、のような構文を使用して、INDIRECT 関数を使用すること{=SUM(INDIRECT("R"&ROW(A1:A3)&"C"&D1:D4,FALSE))}です。

これらは両方とも、行列とベクトルの最初の要素、つまり 1 であるかのように結果を返します。これはこれらの関数の制限ですか、それとも回避する方法はありますか? ありがとうございました。

4

1 に答える 1

1

(コメントでの議論の後、回答は完全に再編集されます)

OFFSET 関数は、個々のセルではなく範囲で動作するため、ここでは役に立ちません。

SUM 関数の場合、すべてが非常に簡単{=SUM(A1:C3*(COLUMN(A1:C3)=D1:D3))}です。または、 で配列を使用することを避けることもできます=SUMPRODUCT(A1:C3,(COLUMN(A1:C3)=D1:D3))。列 D は、最初の列からのオフセットではなく、特定の列番号を参照する必要があることに注意してください1;2;3

他の関数の場合、a) 行列からゼロ (偽の値) をカウントするため、より困難です。b) 通常、連続していない配列では機能しないためです (また、行列からゼロ値を除外しようとすると、#value エラーが発生します)。ただし、FREQUENCY と INDEX を組み合わせると次のようになります。

  • 検索平均:{=(SUM(A1:C3*(COLUMN(A1:C3)=D1:D3)))/INDEX(FREQUENCY((A1:C3*(COLUMN(A1:C3)=D1:D3)),0),2)}
  • 中央値を見つける:{=MEDIAN(LARGE((A1:C3*(COLUMN(A1:C3)=D1:D3)),ROW(INDIRECT("1:"&INDEX(FREQUENCY((A1:C3*(COLUMN(A1:C3)=D1:D3)),0),2)))))}

それが役に立てば幸い。

于 2013-11-01T12:21:08.493 に答える