いきなり答える備忘録

Google Workspace(旧G Suite)・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)AND/OR関数と*/+記号の違いと使い分け

 AND関数の代わりに「*」を、OR関数の代わりに「+」を用いて論理演算を行うことができます。しかし機能的に全く同じではなく、配列を対象としたときに結果に違いが出ます。
 ここでは特にAND関数と「*」演算子の比較例を見てみます。

  • AND関数やOR関数は引数で複数のセルを参照しても1つの結果しか返しません。つまりスピルしません。
  • *演算子や+演算子はスピルします。よってFILTER関数の条件式等に用いるのに適しています。

手順

AND関数と「*」演算子の例

 D3セルに

=AND(C3>=60,C3<80)

という式を入力しています。
 これにより「C3セルの値が60以上」かつ「C3セルの値が80未満」かどうかを判定しています。
 どちらも真(正しい)ですので結果はTRUEとなります。

 ここで2箇所の「C3」を「C3:C8」に置き換えるとどうなるでしょう。
 スピルの機能によりB3:B8の6つの数値それぞれについてTRUE/FALSEの判定を行ってくれるようにも見えますが……


 結果は「FALSE」が1つだけです。

 これはそもそもAND関数が、引数に含まれる条件のすべてが真ならTRUEを返すという関数だからです。
 要はこの

=AND(C3:C8>=60,C3:C8<80)

 という式は

1…C3セルの値が60以上
2…C3セルの値が80未満
3…C4セルの値が60以上
4…C4セルの値が80未満
 ・・・
12…C8セルの値が80未満

という合計12個の条件をすべて満たしているかどうかを判定しているのであって、戻り値は単一のTRUEまたはFALSEにしかなりません。
 理屈としてはSUM関数がいくつのセルや範囲を参照しても1つの結果しか返さないのと同じことです。


 実際にC列の数値を書き換えて(着色した部分)、すべて条件を満たすようにするとD3の値もTRUEになります。


 AND関数が1つの値しか返さない以上、例えばFILTER関数の条件として用いるのは適当ではありません。
 画像中のFILTER関数の式(下記参照)の意図は「点数が60点以上80点未満の者すべての氏名と点数を表示する」というものですが、抽出しようとする行が6つあるのに対し判定結果が1つしか得られないので抽出が成立しません。エラーになります。

 E3セル(エラー)

=FILTER(B3:C8,AND(C3:C8>=60,C3:C8<80))


 さて、一方でAND関数の代わりに「*」演算子を用いることができます。
 ここではD3セルに

=(C3>=60)*(C3<80)

と入力しています。「(C3>=60)」や「(C3<80)」はどちらもTRUEを返すのですが、「*」で連結されることでそれぞれ「1」とみなされ、「1*1」と同じ計算となり結果的に1という数値が得られます。FALSEは0とみなされるので、どちらか一方でもFALSEなら(「1*0」「0*1」「0*0」のいずれかとなるため)結果は0になります。
 つまりAND関数でTRUEが得られることと「*」演算子で1が得られることは同一視でき、FALSEが得られることと0が得られることも同一視できるわけです。


 そして「*」の計算はAND関数と異なりスピルします。
 つまりD3セルのこの式

=(C3:C8>=60)*(C3:C8<80)

により、6つのセルに対するAND判定を、それぞれのセルに対して行うことができています。


 さらに都合の良いことにIF関数やFILTER関数は、第1引数(論理値=条件)において0以外の数値をTRUEとみなし、0をFALSEとみなしてくれます。
 画像では、上記の例でうまくいかなかったFILTER関数のAND関数の部分を「*」を使った式に置き換えることで抽出に成功しています。

 E3セル

=FILTER(B3:C8,(C3:C8>=60)*(C3:C8<80))


 AND関数と「*」の比較については以上です。
 また、OR関数と「+」演算子についても考え方は同様です。「+」演算子は条件の数に応じて2,3…といった値を返すこともありますが、IF関数やFILTER関数は0以外であれば(1でも2でも100でも)TRUEとみなすので判定の上で問題は起こりません。
 実例については省略しますが、次の記事でFILTER関数と「*」「+」の両方を使った設定例を紹介しています。

www.officeisyours.com

備考

 以前は関数と演算子の使い分けはさほど気にする必要はなく、わかりやすさのためにもしっかり関数を使った方がいいかなといったぐらいでした。しかし配列関数の利用が増えるにつれ意識する機会が増えています。
 例として、次の記事の最初の例でもAND関数ではうまくいきません。ちょっと難解ですがこういう長い式を立式している最中にうっかり忘れるとドハマりします。

www.officeisyours.com


 最後になりますが、現在ではLAMBDA関数とヘルパー関数を用いてAND関数などの関数もスピルさせることができるようになっています。
 例えば2番目の画像の例では

=BYROW(C3:C8,LAMBDA(x,AND(x>=60,x<80)))

 とすれば、意図するように6つのTRUE/FALSEを得ることができます。とはいえ式がかなり複雑になりますので、真っ先に検討すべき選択肢ともいえません。