
ARRAYFORMULA関数の中でAND / ORの条件分岐を設定する方法
勝手にARRAYFORMULA関数の中ではAND関数,OR関数は使えないものだと思っていたが、ふと気になって調べてみたら書き方を変えると設定できるらしい。
1. ARRAYFORMULA関数 + AND関数
=arrayformula(
if( and(A1:A = "" , B1:B <> "" ) , true , false )
)
なんの捻りもなくARRAYFOUMLA関数の中にAND関数を設定すると、意図したような値は返ってこない。この同じ関数式を以下に書き換えると意図したように動作する。
=arrayformula(
if( ( A1:A = "" ) * ( B1:B <> "" ) , true , false )
)
上記記事で説明されている理屈だとAND条件のどちらかがfalseになれば、1 × 0 = 0 となり、全体の条件式はfalseとして扱われる。どちらともtrueになれば、1 x 1 = 1 で全体の条件式はtrueとして扱われる。
※[意外と重要]false = 0, true = 1として扱われる。
2. ARRAYFORMULA関数 + OR関数
ORの条件式の場合にはどうなるかというと、ORはプラス記号でそれぞれの条件式をつなぐと意図した動作ができるらしい。
=arrayformula(
if( ( A1:A = "" ) + ( B1:B <> "" ) , true , false )
)
理屈としてはANDの場合と同じで、どれかひとつでも条件式がtrueとなれば条件式の総和が1以上になり、全体の条件式としてはtrueの扱いになる。すべての条件式でfalseとなれば条件式の総和は0だから、全体の条件式としてはfalseの扱いになる。
言われてみればたしかに、、、
3. 実例
ここまでだと最初に載せた参考記事の要約に過ぎないので、実際に自分で設定していた関数式を記載しておく。
「日付と曜日と各行の入力有無の条件を見て、条件が一致しているセルにだけ "_" または "休" を入力する。」という普通に書けば至ってシンプルなIF、AND、OR関数だけで済む処理。
ARRAYFORMULA化するにあたって、すべての条件分のIF関数を設定するのはあまりにも煩わしかったから、ちゃんと抜け道があって安心したのと、勉強になった。
=arrayformula(
arrayformula(
if( A4:A <> "",
if(
(D4:D <> "") * (E4:E <> "") * (G3:3 <> "土") * ( G3:3 <> "日"),
if( (G2:2 >= D4:D) * (G2:2 <= E4:E ),"_", ""),
if( (G3:3 = "土") + (G3:3 = "日"),"休","")
),
""
)
)
)