9

問題定義:

セルに任意の数値を入力しますA1。次の数式を最初の行の任意の場所で試してください。

=SUM(INDIRECT("A"&ROW()))

=SUMPRODUCT(INDIRECT("A"&ROW()))

最初の数式は評価され、2 番目の数式は #VALUE エラーを返します。これは、ROW()関数の内部での動作が異なることが原因SUMPRODUCT()です。

最初の式では、 をROW()返します1{1}2 番目の数式では、数式が CSE 数式として入力されていなくても、row は (1 つの長さの配列) を返します。

なぜこれが起こるのですか?

バックグラウンド

タイプの数式を評価する必要があります

=SUMPRODUCT(INDIRECT(*range formed by concatenation and using ROW()*)>1)

これはエラーになります。この問題の回避策として、ROW()別のセル (明らかに同じ行) で計算し、それを my 内で連結するようになりましたINDIRECT()。代わりに、 のような sum 関数内にカプセル化することも試みましたが、それも同様SUM(ROW())に機能します。

誰かがCSE を入力せずにROW()内部で配列を返す理由を説明 (または説明できるリソースを参照) していただければ幸いです。SUMPRODUCT()

4

3 に答える 3

7

興味深い質問です。ここには、文書化されていない微妙な問題があります。

INDIRECT("A"&ROW())そのセルの値ではなく、セルへの参照である1つの要素で構成される配列を返すようです。多くの関数はこのタイプのデータを正しく解決できませんが、N や T などのいくつかの関数は配列を「逆参照」して基になる値を返すことができます。

配列に 2 つの要素がある場合を考えてみましょう。

=SUM(N(INDIRECT("A"&ROW(1:2))))

これは、配列に入るとA1 + A2を返しますが、通常に入力するとA1のみを返します。ただし、この式で ROW(1:2) を {1;2} に変更すると、正常に入力すると正しい結果が返されます。同等の SUMPRODUCT 式は、配列が入力されているかどうかに関係なく、A1+A2 を返します。

これは、引数が関数に登録される方法に関連している可能性があります。http://msdn.microsoft.com/en-us/library/bb687900.aspxによると、関数の引数を登録して Excel のデータ型を処理するには、基本的に 2 つの方法があります。

R/U: 「値、配列、および範囲参照」と入力します。

タイプ P/Q: "Excel は、これらの引数を準備するときに、単一セルの参照を単純な値に変換し、複数セルの参照を配列に変換します。"

SUM 引数は R/U 型に準拠しているように見えますが、SUMPRODUCT 引数は P/Q 型のように動作します。上記の SUM 式を配列入力すると、ROW の範囲参照引数が配列として評価されますが、これは SUMPRODUCT では自動的に行われます。

アップデート

もう少し調査した結果、この理論を裏付けるさらなる証拠が見つかりました。コメントのリンクに基づいて、式 =SUM((A1,A2)) は次と同じ値を返します。

?executeexcel4macro("CALL(""Xlcall32"",""Excel4"",""2JRJR"",4,,1,(!R1C1,!R2C1))")

2JRJRに変更して最後の引数を型 P として登録する2JRJPと、この場合はエラーになりますが、 のような単一の領域範囲は許可されます!R1C1:!R2C1。一方、4 (xlfsum) を 228 (xlfsumproduct) に変更すると、SUMPRODUCT と同様に、どちらの方法でも単一の領域参照のみが許可されます。

于 2012-06-20T21:18:58.917 に答える
2

ROW()は配列を返すので、を使用INDEXして最初の要素を取得します。

次に、例は次のようになります。=SUMPRODUCT(INDIRECT("A"&INDEX(ROW(),1)))

于 2012-06-20T17:06:55.227 に答える
1

ここで ROW() の動作が異なるとは思いません。どちらの場合も配列を返します。SUM と SUMPRODUCT はその配列の扱いが異なると思いますが、理由はわかりません。

多くの関数またはそれらの組み合わせが配列を返します。これを実現するために CTRL+SHIFT+ENTER は必要ありません。多くの場合、作成された配列を処理するために必要なのは CSE だけです。

INDIRECT の代わりに INDEX を使用するだけです (これは揮発性関数を回避することにも役立ちます)、つまり

=SUMPRODUCT(INDEX(A:A,ROW()))

....それを範囲に拡張すると、この式は列 A の範囲内の値 > 1 の数をカウントします。ここで、x は開始行を定義し、y は終了行を定義します。

=COUNTIF(INDEX(A:A,x):INDEX(A:A,y),">1")

x と y は数式で計算できます

追加する条件が他にもある場合は、SUMPRODUCT または COUNTIFS を同様の方法で使用できます。

于 2012-06-20T17:39:16.773 に答える