10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Googleスプレッドシートの配列数式でAND,OR関数がバグる件の対処

Last updated at Posted at 2021-04-06

概要

GoogleスプレッドシートのARRAYFORMULA関数内でAND,ORなどの条件判定関数を使うと意図したとおりの結果になりません。
これは、ORは足し算、ANDは掛け算に変えることで解決できます。

=ARRAYFORMULA(IF(OR(ISBLANK(A2:A),ISBLANK(B2:B)),"",A2A*B2B))
  :arrow_down:  :arrow_down: :arrow_down:
=ARRAYFORMULA(IF(ISBLANK(A2:A)+ISBLANK(B2:B),"",A2A*B2B))

=ARRAYFORMULA(IF(AND(ISBLANK(A2:A),ISBLANK(B2:B)),"",A2A*B2B))
  :arrow_down: :arrow_down: :arrow_down:
=ARRAYFORMULA(IF(ISBLANK(A2:A)*ISBLANK(B2:B),"",A2A*B2B))

説明

簡単な実例で説明しましょう。

ORの例

下記のようなスプレッドシートがあり、D2~D6セルにはそれぞれ合計を計算する数式が入っています。
(D2:=B2*C2, D3:=B3*C3, D4:=B4*C4, D5:=B5*C5, D6:=B6*C6
table0.jpg
ARRAYFORMULAを使えば、下記の様に書き換えた数式をD2セルにのみ入れるだけで、D2~D6に結果が入ります。
=ARRAYFORMULA(B2:B6*C2:C6)

もちろんB6とかC6の部分を書き換えてもっと広い範囲に適用することも出来ます。
例えば以下の様に書けば、シートの一番下まで範囲を拡張できます。
=ARRAYFORMULA(B2:B*C2:C)
table0b.jpg
でもテーブルをはみ出して下まで0が続くのはみっともないですね・・・

こういう時(ARRAYFORMULA抜きで考えるなら)
IF関数を使ったこんな式を思いつきますよね。
=IF(OR(ISBLANK(B2),ISBLANK(C2)),"-",B2*C2)
table1.jpg
なのでこれを同様にARRAYFORMULA関数を使って以下の様に書き換えてみると
=ARRAYFORMULA(IF(OR(ISBLANK(B2:B6),ISBLANK(C2:C6)),"-",B2:B6*C2:C6))
table2.jpg
・・・おかしな結果になってしまいました。

そこで冒頭に書いたようにOR関数を足し算に書き替えてみます。
=ARRAYFORMULA(IF(ISBLANK(B2:B6)+ISBLANK(C2:C6),"-",B2:B6*C2:C6))
ご覧の通り!!
table3.jpg
意図通りの結果が表示されました。

ANDの例

同じような表でD2~D6セルにはそれぞれ合計を計算する数式が入っています。
(D2:=IF(AND(ISBLANK(B2),ISBLANK(C2),"-",B2+C2,
...,D6:=IF(AND(ISBLANK(B6),ISBLANK(C6),)"-",B6+C6
table4.jpg
これを単純にARRAYFORMULAで以下の様に置き換えてみると
=ARRAYFORMULA(IF(AND(ISBLANK(B2:B6),ISBLANK(C2:C6)),"-",B2:B6+C2:C6))
table4b.jpg
'-' 表示になって欲しいD6セルが0になってしまっています。

そこで冒頭に書いたようにAND関数を掛け算に書き替えてみます。
=ARRAYFORMULA(IF(ISBLANK(B2:B6)*ISBLANK(C2:C6),"-",B2:B6+C2:C6))
ご覧の通り!!
table5.jpg
意図通りの結果が表示されました。

解説

なぜAND,ORが使えない?

なぜARRAYFORMULA関数の中でAND,OR関数を使うとうまく行かないのかは、**正直私にもよくわかりません。**ごめんなさい。
ARRAYFORMULA関数はなかなか気難しいやつで、他にも中で使うと意図通りにならない関数がいっぱいあるようです。推測するに、もともと配列(=セル範囲)を引数として受け取れる関数が中にあると、先に中の関数でセル範囲が解釈されてしまって、ARRAYFORMULAの展開対象にならないってところかなと思いますが。

※AND,ORはセルに真偽値が入っているなら、例えばOR(A1,B1,A2,B2)の代わりにOR(A1:B2)と書いても同じ結果になる

なぜ掛け算、足し算で代用できる?

プログラミング齧ったことある人なら、「内部ではTRUE=1,FALSE=0で表現されてる」って聞けば(いや聞く前から)ピンとくるでしょう。
ここでは、そうじゃない人のために少しだけかみ砕いて説明してみます。

まず大前提として、繰り返すとスプレッドシートの内部ではTRUE=1,FALSE=0として扱われています。
それに加えて、0以外の数値はTRUEの一種であると見做されるという法則があります。

さてANDはA,B,C...の条件のどれか一つでもFALSEだったらFALSEになる関数ですね。
これを1/0で置き換えると「A,B,C...どれか一つでも0だったら0に」なればいいんです。
だから A*B*C*... 掛け算で置き換えることが出来ます。

一方ORはA,B,C...の条件のどれか一つでもTRUEだったらFALSEじゃない関数ですね
これを1/0で置き換えると「A,B,C...どれか一つでも1だったら0以外に」なればいいんです。
だから A+B+C+... 足し算で置き換えることが出来ます。

こういう性質があるので、ANDは論理積、ORは論理和とそれぞれ呼ばれています。

参考

ARRAYFORMULA (公式)
https://support.google.com/docs/answer/3093275

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?