Excel 関数のメモ

SumProduct を Sum で実現する方法。

→配列の計算を利用する。
SumProduct のヘルプから。=SUMPRODUCT(A2:B4, C2:D4)」という例について。

SUM(A2:B4*C2:D4) という数式が配列として入力されていれば、この使用例と同じ計算結果を得ることができます。配列を使用することによって、より一般的な方法で SUMPRODUCT 関数と類似の計算を実行できます。たとえば、セル範囲 A2:B4 に入力されている要素の 2 乗の和を計算するには、SUM(A2:B4^2) という数式を入力し、Ctrl キーと Shift キーを押しながら Enter キーを押します。
配列の計算を使うと、関数が内部的に配列データを持って計算するのだろうか。上手くやれば、SumIfなどの条件付き関数の代用をできるかもしれない。

条件付きの分散を計算する方法。

→DVar を使う

条件付きの SumSq を SumProduct で実現する方法。

→配列に条件分岐を入れる。方法:SumProduct(range,range,--(range>0))
出典:Excel help: calculating variance of conditionally selected cells - Penny Arcade

たとえば
=SUMPRODUCT(D2:D47,D2:D47,--(D2:D47>0))
という感じ。(はてなダイアリーの表示が上手くないのか、「--」でマイナス記号がくっついてしまって一つに見える。実際は二つある。)
こうすると、range のなかで、正の値を持つものだけで、SumSq を実現できる。
この「--(range>0)」の意味が分からない……。これを上手く使えれば、群内分散や群別の偏差平方和などが簡単に実現できるんじゃないかと思うのだが…。

というわけで、「--(range>0)」について考えてみた。

●「=A1:A10」という式について。

セル一つにこれを指定すると、#VALUE エラーになる。おそらく、セルに配列を代入するという意味で型が違うのだと思う。
配列数式として入力してみる。
B1:B5の範囲に、「=A1:A10」を入力すると、A1からA5が順に入り、エラーは出ない。
B1:B15の範囲に、「=A1:A10」を入力すると、B11からB15に #N/A エラーが出る。これは、仮に A11 などに何か値が入っていても同じ。このことから、「=A1:A10」が、10個のセル参照を持った配列を生成して、それをB1からB15へ順に当てはめていくという動作をしているのだと思う。そして11個目からは参照先がなくて、それが #N/A と処理されているのではないか。

●「=A1=0」、「=A1>0」、「=A1<0」等の条件式について。

セルにこの数式を入力すると、初めのイコールの次からを式と認識するようだ。つまり、
「=A1=0」は、「=(A1=0)」と同じ動作をするようだ。従ってこの式の意味は、
A1=0という条件を判定して、A1セルの値が、0の値を持つ数、文字列(「""」や「'」を含む)、未入力の場合に TRUE を返す。真偽値の場合はTRUEでもFALSEでもFALSEを返す。

●「=A1:A10>0」という条件式について。

普通にセル数式としてB1に入力すると、#VALUEエラーになる。
B1:B10に配列数式として入力すると、B1にはA1>0の判定結果が、という風に順に入力される。
この動作は、「=(A1:A10>0)」としても同じである。

●「+」と「-」の連続について

セルに、+3, ++3, +++3, …と入力してみると、それぞれ、3, =+3, =++3, …というふうに補正される。
セルに、-3, --3, ---3, …と入力してみると(マイナスを一つずつ増やしている)、それぞれ、-3, =--3, =---3, …というふうに補正される。
プラス記号とマイナス記号で残る演算子の数が異なる。初めの「+」は数式を示すメタ文字のような扱いなのかもしれない。
乗算を示す*と除算を示すスラッシュ「/」にはこのような機能はない。
セルに、*3と入力すると、文字列として扱われる。「=*3」とするとエラー判定される。
セルに、スラッシュを入力しようとすると、Altキーと同じようにメニューへのアクセスキーとして認識される。「=/3」とするとエラー判定される。

●「-5」, 「=-5」, 「=--5」, 「=---5」, 「=----5」, ……について。

それぞれ、返す値は、-5, 5, -5, 5, -5, ……となる。同様に、
「-(5)」, 「=-(5)」, 「=-(-5)」, 「=--(-5)」, 「=--(--5)」, ……等々も同じ結果になる。

●「=-(条件式)」:真偽値を数に変換する式

「=1>0」:TRUEを返す。
「=(1>0)」:TRUEを返す。上の式と基本的に同じ。
「=+(1>0)」:TRUEを返す。イコール記号の直後のプラス記号はエクセルの入力自動補正によって削除される。
「=-(1>0)」:-1を返す。「1>0」を評価した値 TRUE を数式として自動的に型変換して、TRUEに対応する数値「1」に「-1」を掛けた結果「-1」を返す。
「=--(1>0)」:1を返す。上記の結果にさらに「-1」を掛けた結果を返す。この演算は、「= (-1)*(-1)*TRUE」というイメージになる。
従って、TRUE, FALSEをそれぞれ 1, 0 にしたい場合、-1 を掛けることでプラス記号の自動削除を回避しなければならないために、「--」という処理が必要になる。
(型が気になる。Variant型というのは内部的に自動認識で型変換(キャスト?)するようなものだと思っているのだけれども。)

●「=SUMPRODUCT(D2:D47,D2:D47,--(D2:D47>0))」を解釈する。

以上のことから以下のように解釈できる。すなわち、三つ目の引数の、「--(D2:D47>0)」が、結局、D2:D47の各値について、正ならば1、負ならば0となる配列になっている。
この SumProduct 関数が、配列(Rangeオブジェクト)を引数に取ることが鍵になっているのだと思う。
この方法を使えば、SumIfs 関数のように複数の条件式を引数に追加して論理積を作ることができるし、三つ目の引数を配列の和の形にすれば論理和で場合分けすることもできる。

例:「=SUMPRODUCT(D2:D47,D2:D47,--(D2:D47<0)+--(D2:D47<0))」
三つ目の引数の解釈:D2:D47の各セルについて正数or文字列なら1、それ以外なら0とする配列を足したもの。即ち、0と2だけで構成された配列になっている。