うっかりの記録――OR関数とAND関数


はじめに

この記事は、下記の記事内容を踏まえています。

条件判定の総合

FILTER関数の挙動の解説

上記の記事における話の流れは、次のようです。

  1. FILTER関数は、ある範囲を行方向または列方向でフィルターする関数である

  2. FILTER関数の第2引数は、条件と説明される事が多いが、その実態は、行または列の可視状態を定義する配列引数である

  3. 第2引数には直接OR関数やAND関数は入れられないので、配列を返すような比較演算数式を入れる

  4. 複数条件になれば、上記比較演算数式の和や積を取る必要がある

  5. 条件が複数になると途端に複雑になるので、表に作業列を追加して、1セルに1条件の判定を入れる

  6. 各条件を総合させるために、条件判定のセルをSUM関数やPRODUCT関数で加算もしくは乗算する

SUMやPRODUCTでの条件の総合

流れはこうなのですが、ついうっかりしていました。と言うのは、上で強調した、
各条件を総合させるために、条件判定のセルをSUM関数やPRODUCT関数で加算もしくは乗算する
この部分について、
そもそもSUM関数やPRODUCT関数を条件の総合に使う必要は無い
所に気付かずに説明してしまったからです。

流れを振り返ってみると、FILTER関数の引数としてOR関数やAND関数を直接入れられないので、そこでは

=sushi_tabeta[ネタ]="サーモン"

このような数式にして、配列を返すようにしたのでした。なぜそうするかと言うと、
OR関数やAND関数は配列を返さない
からです。それらが配列を返さないので当然、可視状態を定義する配列を作れません。だから、範囲と何らかの値を比較演算して配列を返すようにしたわけです。

で、その流れで私は、数式が複雑になるので、条件判定を作業列にまかせて、FILTER関数では条件を総合した作業列を参照させるようにする、という手法を紹介したのですが、その際、
FILTER関数では通常、引数にOR関数やAND関数を入れない
事を引きずって、作業列での条件判定の総合をも、OR関数とAND関数を使わないようにし、代わりにSUM関数やPRODUCT関数を使ったのでした。
しかるによく考えてみれば、条件判定を作業列に出してあって、複数の条件を総合してセルに入れるのですから、そこで返るのは
1つの値
で構わないのです。0かFALSEなら非可視ですし、0以外の数値かTRUEなら可視です。そして、FILTER関数では、その
条件を総合したセルを複数参照させる
のでした。であれば、です。
各行での条件の総合は、OR関数やAND関数が使える
のです。ここが、私がうっかりしていた所です。先述したように、FILTER関数にORやANDを入れないのを引きずったのですね。だから、わざわざSUMやPRODUCTを使ったという次第。

OR関数やAND関数での条件の総合

SUM関数やPRODUCT関数を使った数式はこうです。

SUM関数による総合
PRODUCT関数による総合

いっぽう、OR関数とAND関数を使った総合はこうです。

OR関数による総合
AND関数による総合

FILTER関数の結果は同じです。違うのは、SUMやPRODUCTは数値を返すのに対し、ORやANDは、TRUEもしくはFALSEを返す所です。FILTER関数の第2引数は、数値の配列でも真偽値の配列でも良いので、結果は同じとなります。そして、ORとANDは

  • OR関数:引数で与えられた1つ以上の論理式の内、1つでもTRUEならTRUEを返す

  • AND関数:引数で与えられた1つ以上の論理式の内、すべてTRUEならTRUEを返す

このような機能を持っており、0と1(0以外の値)はそのままFALSEとTRUEとして評価される便利な性質があるので、COUNTIF関数で返される0か1をそのまま、OR関数やAND関数に投入しても上手く動くという寸法です。

OR関数とAND関数の挙動

動きと名前

SUMやPRODUCTを使った数式でも、ORやANDを使った数式でも、同じように動きます。そのように作ったので当然ではありますが、機能的には差はありません。しかるに、

  • 返ってくる値が、ただの数値では無く真偽値

  • ORとANDがどのような機能を担っているか明瞭

これらを考慮すれば、やはりOR関数とAND関数を使用するほうが適切であり、SUM関数とPRODUCT関数を使用するのはスマートさに欠ける、と言えるでしょう。

教訓

思い込んだまま物事を進めると、より好ましいやりかたを見過ごす場合がある。

参考資料


この記事が気に入ったらサポートをしてみませんか?