[Excel] IF関数などの論理関数と仲良くなりたい人向けの話

2019年9月16日

今回は、Excelの論理関数の話です。IF関数の存在意義が分からなかったり、使い方がよく分からないけど、論理関数と仲良くなりたいという人はご一読下さい。

論理関数とは何か?

IF関数に代表される論理関数は、Excelで様々な条件分岐を実現するための関数群です(論理関数の一覧はこちら)。条件分岐とは、条件により処理を変えることです。場合分けとも言います。熟語にすると難しい気もしますが、考え方は身近なもので、人間で言うところの状況判断と同じです。例えば、朝7時に起きる予定だったのに、それより前に目が覚めたらどうしますか?私は二度寝します。二度寝のせいで遅刻ギリギリの時間に起きたら、朝ごはんはどうしましょうか?選択肢としては、急いで食べる、食べない、または携帯食(カロリーメイトやソイジョイなど)を持っていく、などがありますね。Excelにとっての状況判断が条件分岐になります。目が覚めた瞬間の状況判断を数式風に書くと「=IF(現在時刻は7時前か? , (7時前なら)寝る, (それ以外なら)起きる)」となります。

Excelは人間の仕事の一部を肩代わりしてくれます。そして、人生は判断の連続です。従って、Excelに任せる仕事が増えれば増えるほど、条件分岐を使用する機会も増加します。論理関数を習得すると、Excelに任せられる仕事の幅は大幅に広がります。

論理値と論理式

ところで、Excelは日本語を理解できません。将来的には理解できる日が来る気もしますが、少なくとも現時点(西暦2019年)においては日本語は通じないようです。そんなExcelは、どうやって状況判断をするのでしょうか?答えは、論理値を使います。論理値とはTRUEFALSEの2つの値のことです。論理値を日本語で言うと、TRUEは真、FALSEは偽と訳されます。真・偽というと、何だか真のほうが印象が良いがありますが、この2つに良い悪いの概念は含んでおりません。真・偽とは、命題が正しいか、正しくないかという意味です。命題とは、正しいか正しくないかを判断することができる言葉や式のことです。言葉の命題の例は、「人間は動物である」や「2018年04月01日の天気は雪である」などです。Excelは命題を式で表現します。例えば、「=1<2」や「=1=2」などです。1は2より小さいので「=1<2」は真、1と2は同じではないので「=1=2」は偽ですね。この数式をExcelに入力すると、「=1<2」は「TRUE」、「=1=2」は「FALSE」と表示されます。このように、論理値を返す数式を論理式と言います。単純な論理式は比較演算子で記述します。Excelで使用可能な比較演算子を下記に示します。

比較演算子 説明
= (等号) 左辺と右辺が等しい A1=B1
> (より大記号) 左辺が右辺よりも大きい A1>B1
< (より小記号) 左辺が右辺よりも小さい A1<B1
>= (より大か等しい記号) 左辺が右辺以上である A1>=B1
<= (より小か等しい記号) 左辺が右辺以下である A1<=B1
<> (不等号) 左辺と右辺が等しくない A1<>B1

IF関数

ここまで理解できたら、Excelを起動して適当なセルに「=IF」と入力してみましょう。IF関数の簡単な説明が出てきます。

Excel2016では”論理式の結果(真または偽)に応じて、指定された値を返します”と表示されます。IF関数が論理式の結果、すなわち論理値を使う関数であることが分かりますね。先ほどのセルに「=IF(」と入力すると、今度はIF関数の引数が表示されます。

引数は”論理式”、”[値が真の場合]”及び”[値が偽の場合]”の3つですね。余談ですが、引数”論理式”には論理値を入力するので、名前が不適切な気もしますが、多くの場合は論理式を指定するので、分かり易さ重視の命名なのかもしれません。今回は、IF関数の動きを理解するため、論理値を指定してみましょう。任意のセルに、下記の数式を入力して下さい。

=IF( TRUE , “真の場合の結果" , “偽の場合の結果" )

=IF( FALSE , “真の場合の結果" , “偽の場合の結果" )

2つの数式の違いは、第一引数のみです。この数式の結果は下記の通りです。

IF関数は、第1引数”論理式”がTRUEなら第2引数”[値が真の場合]”を返し、第3引数”[値が偽の場合]”を無視します。逆に、第1引数”論理式”がFALSEなら第3引数”[値が偽の場合]”を返し、第2引数”[値が真の場合]”を無視します。

IF関数の第1引数に直接TRUEを指定すると、常に第2引数しか返しません。逆にFALSEを指定すると第3引数しか返さないため、IF関数を使う意味がありませんね。そのため、通常は論理式やセル参照を指定します。本記事の冒頭で例に出した、目が覚めた瞬間の状況判断をIF関数を使って書くと、下記のようになります。

=IF( NOW() < (TODAY() + TIME(7,0,0)) , “寝る" , “起きる")

”NOW()”は現在時刻、”TODAY()”は今日の日付、”TIME()”は時刻を返す関数で、特に”TIME(7,0,0)”は時刻としての”7時00分00秒”を返します。この数式を任意のセルに貼り付けて朝7時前に実行すると、そのセルには「寝る」と表示され、朝7時丁度かそれ以降なら「起きる」と表示されます。

高度な条件分岐

IF関数のネスト

IF関数と論理式を使うことで、単純な条件分岐を実現することができました。しかし、実務的な問題の場合、複雑な条件分岐が必要になることがあります。例えば、テストの点数から成績を付ける場合を考えてみましょう。80点以上なら”優”、60点以上80点未満なら”良”、30点以上60点未満なら”可”、30点以下なら”不可”と表示する場合、どのように書けば良いでしょうか?この場合、”IF関数のネスト”と呼ばれる手法を使います。IF関数のネストは、IF関数の引数にIF関数を指定する方法です。成績を付ける例では、A1セルに点数が入力されている場合、下記の2通りの書き方があります。

=IF( 80 <= A1 , “優" , IF( 60 <= A1 , “良" , IF( 30 <= A1 , “可" , “不可" )))

=IF( A1 < 30 , “不可" , IF( A1 < 60 , “可" , IF( A1 < 80 , “良" , “優" )))

A1セルが50点だった場合、この数式は下記のように計算されます。

(1) =IF( 80 <= 50 , “優" , IF( 60 <= 50 , “良" , IF( 30 <= 50 , “可" , “不可" )))

(2) =IF( FALSE , “優" ,  IF( 60 <= 50 , “良" , IF( 30 <= 50 , “可" , “不可" )))

(3)=IF( 60 <= 50 , “良" , IF( 30 <= 50 , “可" , “不可" ))

(4)=IF( FALSE , “良" , IF( 30 <= 50 , “可" , “不可" ))

(5)=IF( 30 <= 50 , “可" , “不可" )

(6)=IF( TRUE “可" , “不可" )

(7)="可"

IF関数のネストは、複雑な条件分岐に柔軟に対応できるため、実務では多用される傾向にあります。反面、数式が分かり難くなるという欠点もあります。対策としては、論理式をIF関数の中に直接書かず、別のセルに書いておくなどの方法があります。Excelのバージョンが2016以降であれば、IFS関数というものがあるので、こちらを使用しても良いかもしれません。ただし、学校や職場で古いExcelが混在している場合は、まだIF関数のネストで対応したほうが良いと思います。

論理演算

AND演算とOR演算

IF関数のネストを使えば、Excelで可能な全ての条件分岐を記述できますが、ネストだけでは書きにくい条件分岐もあります。例えば、勤続年数が3年から5年の営業部と企画部の社員にキャリアアップ研修を受けさせたいとしましょう。これをIF関数のネストで記述すると、以下のようになります。

=IF( 3 <= 勤続年数 , IF( 勤続年数 <= 5 , IF( 所属 = “営業部" , “対象" , IF( 所属 = “企画部" , “対象" , “対象外" ) ) , “対象外" ) , “対象外" )

イマイチ何が書いてあるかよく分かりませんね。ここで、更に開発部も対象にしようとした場合、どのように数式を編集したら良いか、すぐには分かりませんね。このように、条件を2つ以上組み合わせる場合は、論理演算という論理値(TRUE・FALSE)の計算を用いると便利です。基本的な論理演算はAND演算とOR演算で、ExcelにおいてはAND関数OR関数を使用して実現します。AND関数もOR関数も、引数に任意の数(好きな数)の論理値を指定できます。AND関数は、全ての引数がTRUEならTRUEを返し、それ以外ならFALSEを返します。OR関数は、全ての引数がFALSEならFALSEを返し、それ以外ならTRUEを返します。別の言い方をすると、AND関数は引数に1つでもFALSEを指定するとFALSEを返します。OR関数は、引数に1つでもTRUEを指定するとTRUEを返します。AND関数とOR関数を使って上記の数式を書き直すと、下記のようになります。

=IF( AND(3 <= 勤続年数 , 勤続年数 <= 5 , OR( 所属 = “営業部" , 所属 = “企画部" ) ) ,"対象" , “対象外" )

ずいぶん見やすくなりましたね。この数式の結果である"対象"、"対象外"が1つずつになっただけでも、大きな成果です。

この数式の計算過程を、勤続年数4年の企画部の社員で見てみましょう。

(1)=IF( AND(3 <= 4 , 4 <= 5 , OR( “企画部" = “営業部" , “企画部" = “企画部" ) ) ,"対象" , “対象外" )

(2)=IF( AND(TRUE , 4 <= 5 , OR( “企画部" = “営業部" , “企画部" = “企画部" ) ) ,"対象" , “対象外" )

(3)=IF( AND(TRUE , 4 <= 5 , OR( “企画部" = “営業部" , “企画部" = “企画部" ) ) ,"対象" , “対象外" )

(4)=IF( AND(TRUE , TRUE , OR( “企画部" = “営業部" , “企画部" = “企画部" ) ) ,"対象" , “対象外" )

(5)=IF( AND(TRUE , TRUE , OR( “企画部" = “営業部" , “企画部" = “企画部" ) ) ,"対象" , “対象外" )

(6)=IF( AND(TRUE , TRUE , OR( FALSE , “企画部" = “企画部" ) ) ,"対象" , “対象外" )

(7)=IF( AND(TRUE , TRUE , OR( FALSE , “企画部" = “企画部" ) ) ,"対象" , “対象外" )

(8)=IF( AND(TRUE , TRUE , OR( FALSE , TRUE ) ) ,"対象" , “対象外" )

(9)=IF( AND(TRUE , TRUE , OR( FALSE , TRUE ) ) ,"対象" , “対象外" )

(10)=IF( AND(TRUE , TRUE , TRUE  ) ,"対象" , “対象外" )

(11)=IF( AND(TRUE , TRUE ,TRUE  ) ,"対象" , “対象外" )

(12)=IF( TRUE “対象" , “対象外" )

(13)="対象"

AND関数とOR関数の使い方を理解していただけたでしょうか?

その他の論理演算

その他の論理演算として、NOT演算というものがあります。ExcelではNOT関数を使います。NOT関数は、引数に論理値を1つだけ指定できる関数で、指定した引数を反転させて返します。言い換えると、引数にTRUEを指定するとFALSEを返し、FALSEを指定するとTRUEを返します。NOT関数を使うと条件分岐を簡潔に書ける場合もありますが、通常はANDとORだけで十分です。また、この関数はIS関数と呼ばれる関数群と一緒に使うこともあります。Excel2003以前であれば、セルのエラー値(#VALUE!、#DIV/0!、#NAなど)を論理値に変換するISERROR関数と組み合わせて多用されましたが、Excel2007以降であればIFERROR関数があるため、すっかり出番が減りました。

論理演算にはもうひとつ、XOR演算というものもあります。こちらはExcel2013から追加されたXOR関数を使います。この関数は、引数に任意の数(好きな数)の論理値を指定できます。指定した論理値が全て同じ(全てTRUEか全てFALSEの)場合はFALSEを返し、TRUEとFALSEが混在している場合はTRUEを返します。非常に使い所を選ぶ関数ですので、知らなくても困ることは殆ど無いでしょう。

ここに書いてあることは理解できなくても構いません。こんな関数があることを、頭の片隅に入れておけば、いつか役に立つ日が来るかもしれません。

最後に

いかがでしたでしょうか?論理関数は、Excel初心者に立ちはだかる大きな壁の1つだと思います。しかし、理解できない人が多いのは、決して難しいからではありません。ただ単に、論理演算というものに触れる機会が無かったため、聞きなれない単語と、(算数と比較して)少し変わった計算方法に戸惑ってしまっているだけだと思います。本記事が、その戸惑いを少しでも軽減できれば幸いです。

ところで、論理演算の考え方というのは、コンピューターの動作原理の核心部分になります。論理演算が理解できると、コンピューターの動作原理が少し理解できるようになります。コンピューターの動作原理がわかると、コンピューターに出来ることと、その実現方法が推測できるようになります。これが出来るようになると、Excelに限らず、様々なソフトウェアが使いやすくなります。例えば、”このソフトウェアにはこんな機能がある気がする”とか、”このデータファイルは、こうやって処理するソフトウェアがある気がする”といった勘が働くようになり、結構当たったりします。そうすると、ますます自分の仕事が楽になったり、スキルに深みが出たりします。是非とも、論理演算と仲良くなってください。

おまけ

TRUEとFALSEって、パッと見た感じ文字列ですが、実は数値です。Excel2016におけるTRUEは「1」、FALSEは「0」です。その証拠に、TRUEとFALSEは普通に計算できます。例えば、「=TRUE + TRUE」や「=SUM( TRUE , TRUE )」の結果はいずれも「2」となり、「=100 + TRUE」の結果は「101」となります。また、「=FALSE + FALSE」、「=SUM(FALSE , FALSE)」及び「=100 * FALSE」の結果は、いずれも「0」となります。

コンピューターは、というか機械は全般的に、ある回路の電圧が高いか低いか、ということしか認識できません。そして、電圧が高い回路を「1」、低い回路を「0」として処理します。これが、一部の界隈で言われている「コンピューターは0と1しか分からない」と言われる所以です。なので、コンピューターは0と1を組み合わせて(2進数という形で)大きな数やマイナスを表現したり、論理演算によって四則演算を実現したりしています。そんな背景もあり、論理値の処理は、電圧が高い場合はTRUE、低い場合はFALSEとしています。この考えを拡張し、多くのプログラミング言語では、数値が0の場合はFALSE、それ以外の場合はTRUEとして処理しており、Excelもこの考えを引き継いでいます。その証拠に、「=IF( 100 , “真" , “偽" )」の結果は"真"となります。しかし、TRUEが「1」、FALSEが「0」というのは、あくまで現時点でのExcelの実装であって、何らかの理由により、将来的に変わる可能性もあります。なので、論理値を直接指定するときは、必ずTRUEとFALSEを使用するようにして下さい。