---topics:and関数、or関数、if関数---

其ノ7 論理的であること

今回から2回にわたって、and関数、or関数、そしてif関数を扱います。 これらは「論理関数」と呼ばれ、実は、論理学と密接に関わっています。 論理学…、…あ、今渋い顔しました? 「なんかむずかしそうだな…」って。 …うーん、もしかしたら難しいのかもしれません、が、Excelの基礎にあたる部分の話なので、一回聞いておいて損はないかな、と思いまして。 お付き合いください。

さて、「論理的」ってあまり日常使うことばじゃないと思います。 むしろ、「論理的な人」って毛嫌いされてるかも。 「カタイなあ~」とか、「正しいかもしれないけど、ヒトの気持ちってモンがわかってないわ」とか言われちゃってるかもしれません。 そんな決して好かれていない「論理的」の代表といえば、「三段論法」です。 三段論法ってこういう↓ヤツね。

 <○論理的の例>
 人間は必ず死ぬ。
 ソクラテスは人間である。
 (したがって)ソクラテスは必ず死ぬ。

ぶっそうな文ですが、こういう時「論理的」って言うんですね。
似たような文ですが、次のは論理的ではありません。

 <×論理的ではない例>
 ソクラテスは必ず死ぬ。
 ソクラテスは人間である。
 (したがって)人間は必ず死ぬ。

残念ながら、これは論理的ではありません。 たしかに、実際人間は必ず死にます。 けれども、この2つの前提から「人間は必ず死ぬ」という文は論理的には導かれません。 論理性と事実性は別モノなんです。
上の<○論理的の例>の方を見てください。 まず最初の文で、人間という集合全体について規定している。 そして第2の文で、ソクラテスが人間(という集合)のひとつであることが語られる。 だから、第3の文が必然的に導かれる、というワケです。
でも、<×論理的ではない例>の方は、第1の文も第2の文も、ソクラテスというひとりの人間の事例についてしか語っていません。 個別事例からは、人間一般についての規定は出てこないんです。

…なんか、コむずかしくなっちゃいましたね(笑) いいんですよ、「こんな話してたなー」くらいの認識で。 人の話なんて100%聴けるわけではないし、僕も100%理解してもらえるとは思っていないし。 僕は、僕の話のどこに読者のみなさんがフックを感じてもらえるか手さぐりなので、右に左に蛇行しながらお話してるんですが、みなさんの方はみなさんの方で、興味もったところだけかいつまんでいただけたら。 でね、僕は論理学を習ってたおかげで、Excelをスムーズに理解することができたんですよ。 なので、この話をしている、というワケです。

さて、and関数とor関数のお話です。

and関数、or関数

Excelに登場するand関数とor関数。 この2つはきょうだいみたいな関係で、下記↓※1のようなつくりになっています。

and関数とor関数の解説
※1 and関数とor関数の解説

式が2つあるとき、式1がTrue、かつ式2もTrueのとき、and式もTrueになります。 「and」って、英語では「かつ」って意味ですね、「繊細かつ華麗」みたいな。 こういうとき、対象物は「繊細」って属性と「華麗」って属性の両方をもちますもんね。

また、or式は、式1か式2のどちらかがTrueのとき、Trueになります。 「or」は英語で「または」って意味ですもんね。

じゃあ、ちょっと具体例を。
以下のような4人の男女がいるとしましょう。

 1.41歳 男
 2.39歳 男
 3.41歳 女
 4.39歳 女

妙齢の男女が揃いましたが(笑)、このグループにおいて、<40歳以上、かつ男性>という条件を満たすのは誰でしょうか? この「かつ」、Excelでは「and」になるのですが、<40歳以上、and男性>というというのはどなたになるのでしょうか?

 <40歳以上 and 男性>
 1.41歳 男 … ○TRUE
 2.39歳 男 … ×FALSE
 3.41歳 女 … ×FALSE
 4.39歳 女 … ×FALSE

当然、1. の人だけですね。 <40歳以上>という条件と<男性>という条件を両方満たす人、1. の人だけですもんね。
では、<40歳以上、または男性>の場合は? <40歳以上、or男性>ですよ。

 <40歳以上 or 男性>
 1.41歳 男 … ○TRUE
 2.39歳 男 … ○TRUE
 3.41歳 女 … ○TRUE
 4.39歳 女 … ×FALSE

こうですよね。<男性>なら何歳でもOKだから2. も含まれるし、<40歳以上>なら性別を問うてないので3. も合致する。

or」についてちょっと注目なのが、<40歳以上>と<男性>という2つの条件を両方とも満たす1. も「TRUE」なことです。 例えば飛行機の中で「コーヒー or 紅茶?」と聞かれて「両方!」と答えたら、たぶんサービスの良い日本なら両方もらえるとは思うけど、怪訝な顔されますよね(←実際やったりしないように)。 でも、論理学的にはor」は両方でもOKなんです。

これをふまえて。
上記のことを、ちょいとExcelでやってみましょうか。 下↓からダウンロードお願いします。

開くとこんな↓です※2

and関数とor関数の練習
※2 and関数とor関数の練習

さっきのデータをExcelに起こしただけですが(笑)、これを使ってみましょう。
さて、<40歳以上かどうか>は、Excelだと、

式1:B2 >= 40

で調べることができます。 「~以上」は「>=」と、>=を組み合わせて使います。 というのも、Excelには不等号(>=と<=)を一発で表示する手段がないからです。
「~以上」ではなく、「より大きい」「より小さい」でしたら、イコールを使わず「>」「<」単独でOKですよ。
…ちょっとまとめておきましょう※3

以上と以下、より大きいと未満
※3 以上と以下、より大きいと未満

「以上」と「より大きい」、「以下」と「未満」のちがいはおわかりですよね? 「40以上」や「40以下」は「40を含む」、「40未満」は「40を含まない」ですよ。
あと、なぜ式1がB2セルを参照しているかというと、B列に年齢が入力されているからです。

さて今度は、<男かどうか>です。 <男かどうか>は、

式2:C2 = "男"

で、調べられますね。
なので、コイツらを組み合わせて、and式を作ってみましょう。

式1:B2 >= 40
式2:C2 = "男"

and式:=and(B2>=40 , C2="男")

ということで、こう↓なります※4 ※5

40歳以上 かつ 男性
※4 40歳以上 かつ 男性
1. の人だけ
※5 1. の人だけ

…ん? むずかしくなってしまいましたか?
じゃあ、一気にやらないで、式1と式2を分けてやってみましょう。 下↓のように、<40歳以上かどうか>と<男かどうか>を調べる列を作成し、ひとつひとつやっつけていきます。
まずは<40歳以上かどうか>※6 ※7

式1:40歳以上かどうか
※6 式1:40歳以上かどうか
1. と3. がそれ
※7 1. と3. がそれ

<40歳以上かどうか>という条件だけなら、それに合致するのは1. の人と3. の人ですね。
では今度、<男かどうか>※8 ※9

式2:男かどうか
※8 式2:男かどうか
1. と2. がそう
※9 1. と2. がそう

男なのは1. と2. ですね。
でね、<40歳以上、かつ男性>を割り出すには、フィルタで両方「True」のところを探せばいいんですよ、こんなふうに※10~※16

フィルタをかけ、まず<40歳以上かどうか>についてTrueを抽出
※10 フィルタをかけ、まず<40歳以上かどうか>についてTrueを抽出
こんな感じ 2件が抽出される
※11 こんな感じ 2件が抽出される
続きまして、<男かどうか>でTrue
※12 続きまして、<男かどうか>でTrue
こうなる これが<40歳以上、かつ男> とりあえずマル入れておく
※13 こうなる これが<40歳以上、かつ男> とりあえずマル入れておく
いったんフィルタを解除して、今度はマルが入ってないところを抽出
※14 いったんフィルタを解除して、今度はマルが入ってないところを抽出
F列の空白にバツ入れた
※15 F列の空白にバツ入れた
これで全件見渡すと、<40歳以上、かつ男>の調査結果が出る
※16 これで全件見渡すと、<40歳以上、かつ男>の調査結果が出る

けっこう手数を踏みましたが(笑)、これで<40歳以上>と<男性>の両方を満たす人を割り出すことができました。
でね、これと同じことを一気にやるのが、and関数なんです※17 ※18

再びand関数
※17 再びand関数 =and(B2>=40,C2="男")
1. だけがTrue
※18 1. だけがTrue

どうでしょうか。 ガッテンしていただけましたでしょうか。

では次、<40歳以上、または男性>についてもやっていきましょう。
といっても、さっきのand式の「and」を「or」に変えれば、できちゃうんですが※19 ※20

or関数を入れる
※19 or関数を入れる
1. /2. /3. がTrue
※20 1. /2. /3. がTrue

これもためしにフィルタでやってみましょうか。
…ただし! <40歳以上または男性>ということは、<40歳以上>と<男性>のどちらかが満たせてればOKなんです※21

どちらかがTrueならTrue
※21 どちらかがTrueならTrue

それはつまり、どちらもFalseのところが×、ってことなんですよ、逆に言えば※22

すなわち、両方FalseのところがFalse
※22 すなわち、両方FalseのところがFalse

なので、<40歳以上かどうか>も<男かどうか>も両方Falseのところを割り出してやります※23~25。 すなわち、40歳以上じゃないし、男でもない、ですよ。

フィルタで両方Falseのところを抽出
※23 フィルタで両方Falseのところを抽出
割り出したレコードを「×」とする
※24 割り出したレコードを「×」とする
で、残ったところが○
※25 で、残ったところが○

こんなふうに、andもorもフィルタでなんとかできたりするんですね。 ただ、関数を使うと一発でできますよ、ということ※26 ※27

再びor関数
※26 再びor関数 =or(B2>=40,C2="男")
で、残ったところが○
※27 4. を除きTrue

ということで、and関数とor関数、覚えてみてください。
あ! そうそう、上記では式2つまででしたが、andもorも、式を3つ、4つと使うこともできますよ。 すなわち、「3つの式、全部がTrue」か、「3つの式のうち、どれか1コでもTrue」という使い方になります。 頭の片隅にでも置いておいてください。

ifのお話

論理関数の代表としてもう1コ、「if関数」ってのがあります。 ifはむずかしいんですよ。 if関数については改めて(其ノ8で)語るつもりなんですが、ここではifの論理性について。
if関数について、次のようなケースがよく例として引き合いに出されます※28

if関数
※28 if関数

60点以上なら「合格」そうでない場合は「不合格」と表示される、ってヤツです。
if関数のつくりって、

=if(条件となる式 , 式を満たすとき , 満たさないとき)

となっていて、今回の場合で言うと「条件となる式」ってのは<60点以上かどうか>ということ。 すなわちB2 >= 60ってのがそれで、この式がTrueのとき式が満たされるので「合格」Falseのときは「不合格」と表示されます。
だから、条件を変えたいときは、例えば合否の基準を<70点以上>にしたいならば、

=if(B2 >= 70 , "合格" , "不合格")

とすればいいし、また「合格」「不合格」じゃなくて、「○」「×」で表現したいときは、

=if(B2 >= 60 , "○" , "×")

とすれば、「○」「×」で表示されるようになります。

 ・
 ・
さて。
上記のように、if関数は「条件を満たさないとき」を必ず入力するようになっています。 コレ、なぜなんでしょうか。
ちょっと上のif関数から一旦離れて、<60点以上ならば合格>という条件だけだったとしましょう。 <60点以上ならば合格>ですよ。 それ以外の条件はナシです。 論理的にはどうなるでしょうか?

1.65点で合格した

これは当然「TRUE」です。 そりゃそうですよね、条件どおりですもの。

2.65点で不合格だった

もちろん「FALSE」です。 条件と合致しないので、あり得ません。
問題はここからです。

3.55点で不合格だった

しょうがないか…。 点数が基準に満たなかったんだもんね…。
厳しい結果ですが、全然あり得る話です。

4.55点で合格した

 ・
 ・
コレ、「TRUE」なんですよ。
<60点以上ならば合格>という条件だけだったら、コレ、論理的には「TRUE」なんです。
こういうことが起こる理由、考えてみてください。 理由はいろいろありますよね。 例えば、「内申書が良かった」とか、「面接のウケが良かった」とか、「すごい美人だった」とか。
と言うか、ね、<60点以上ならば合格>とは言ったけど、<60点に満たないならば不合格>とは誰も言ってないじゃないですか。 いや、とんちじゃないですよ。 論理学的にはこうなるんです。

でも、安心してください。 Excelのif関数は、この辺りがわかりやすく作られていて、「条件を満たさないとき」を明確に規定するように出来ているんです。 ※28をもう一度見てください。 60点以上「じゃない時」を指示するようになっているでしょ? つまり、「60点以上のときどうするか」だけでなく、「60点未満のときどうするか」についても命令してますよね、3つ目の引数で。

けど、このif関数の第3引数「60点未満のときは「不合格」と表示せよ」という命令の部分は、論理学から見れば一種のサービスです。 論理学的には、「60点未満のときどうするか」はあらためて命令してあげなくてはなりません。
このちがいが明確に現れるのは、vbaのif構文です。
vbaっていうのは、Excelのプログラム言語のことです。 書いておくとExcelが自動で仕事してくれるというスグレものです。 ただ、書き方にコツがある、というか、練習が必要なので、現在わからなくても全然問題ないのですが、そのvbaで、例えば、

If Cells(1,1).Value >= 60 Then
Cells(1,2).Value = "合格"
End If

と書く。 「1行目1列目のセルの値が60以上なら、隣のセルに「合格」と表示してね」という意味です(繰り返しますが、わからなくても問題ないですよ)。
しかし、こう書いても、59点以下のときに「不合格」と表示されたりはしません。 上の命令は「60点以上のときどうするか」の命令であって、「60点未満のときどうするか」は命令していないからです。 60点未満のとき、何かして欲しいのであれば、あらためて指示してあげなくてはなりません。 不親切と言えば不親切ですが、論理学的にはこちらの方が標準仕様だったり…。

それに対して、Excelワークシートのif関数の方は、この「60点未満のときどうするか」の命令もセットで指示するようになっているんです。

論理学の話はこの辺にしておきましょう。 Excel仕事に直接役立つかというと、そうでないかもしれません。 ただ、Excelの基礎にあるものではあるので、知っておいて損はないと思います。
if式については、次回其ノ8で、あらためて語りたいと思います。

Copyright(C)森田表計算