【Excel】IF文の条件判定について詳解

結構な人がよく分からない思い込みの元「何となく」使ってしまっているIF関数について詳解。

#IF関数の基本の動作

ExcelのIF文は第1引数の論理式の解が`TRUE`（＝真）となれば、第2引数の文を実行、
`FALSE`（＝偽）となれば第3引数の文を実行。第3引数がなければ論理値`FALSE`が出力される関数。

```
=IF([[第1引数]], [[第2引数]], [[第3引数]])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/0ba37f09-cfcf-fd53-b2f4-3d83bc112a1a.png)
また、`TRUE`、`FALSE`の2つをまとめて「真偽値」と呼ぶ。

セルに直接「TRUE」や「FALSE」と打ち込んだ場合、あるいは「`=A1<B1`」「=A1=B1」のような数式をセルに入力した場合、その結果が真偽値になり、ただの文字列とは異なる性質を持つ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/c7b88469-ee46-0c44-3b03-6f10191709ef.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/c981d6f5-6d71-51fb-21bf-299f421387de.png)

## IF関数の実行例
### 第1引数に真偽値が直接入っている場合
まずこんな使い方はしないものの、IF関数の動作を最もシンプルに理解するための一番単純な例として説明。

第1引数が`TRUE`のとき、第2引数の文が実行される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/f456a5a0-bfca-cd33-3cc8-7b9d8036d6b8.png)

第1引数が`FALSE`であり、かつ第3引数があるとき、第3引数の文が実行される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/265f103f-bec3-cf5c-6f27-d2c2e06525e4.png)

第1引数が`FALSE`であり、第3引数が存在しないとき、`FALSE`が出力される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/cd8d9b32-1ca2-f95c-c6c8-e9198f24f590.png)

### 第1引数の論理式の解が真偽値となる場合
実際に使う数式に少し近づけた例として説明。

前提として、

- 「1は5未満である」という命題は正しいので「真（TRUE）」である。
- 「5は1未満である」という命題は誤っているので「偽（FALSE）」である。

以下のIF文では、第1引数に入力されている数式`1<5`という論理式の解が`TRUE`であるため、第2引数の文が実行されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/eb4260f1-da21-a8e5-1cb4-138dc53c9413.png)

数式`1<5`という論理式の解が`TRUE`であることは以下の数式で確かめることができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/9d31f4f8-5847-c7c0-6a33-e736c487a2f0.png)


第1引数に入力されている数式`5<1`という論理式の解は`FALSE`であるため、第3引数の文が実行される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/7b5a6b6e-4d4c-64cb-48d5-e9799a16854f.png)

第1引数の計算に使う値を他のセルから参照しても勿論同じように動作する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/cab9bcff-4283-5e20-3590-9b589983c647.png)

また、第2引数、第3引数に数式を入れた場合、その結果が出力される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/a12d34c5-83c3-8b06-7bc0-fd726369cb5c.png)
※ [LEN関数](https://support.office.com/ja-jp/article/len-%E9%96%A2%E6%95%B0%E3%80%81lenb-%E9%96%A2%E6%95%B0-29236f94-cedc-429d-affd-b5e33d2c67cb)は対象の文字列の文字数を出力する関数。セルA2には29文字の文字列が入力されているので、`LEN(A2)`の計算結果は29。そこから10を引いて19が出力されている。

#IF文の第1引数の論理式の解が真偽値とならない場合

IF文の第1引数の計算結果がTRUEかFALSEと解釈できない場合、IF関数の計算結果はエラーとなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/1f257d70-8953-4372-9bbf-d1234b9256ce.png)

しかし、、第1引数の計算結果が実際には真偽値でなくても、真偽値と解釈できる場合、その解釈に従ってIF関数が動作する。

数値`1`はTRUEと解釈される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/ea0f9358-3755-7711-f723-094290a1892f.png)

数値`0`はFALSEと解釈される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/81193297-4181-dc3f-d610-fd5fd3bb499e.png)

ちなみに、TRUEと解釈できる値のことを**Truthy**。FALSEと解釈できる値のことを**Falsy**と呼ぶ。

ExcelのIF文でTRUEとみなされる値とFALSEとみなされる値について、
[公式](https://support.office.com/ja-jp/article/IF-%E9%96%A2%E6%95%B0-69aed7c9-4e8a-4755-a9bc-aa8bbff73be2?omkt=ja-JP&ui=ja-JP&rs=ja-JP&ad=JP)にもちゃんと書かれていなかったので自分で検証してみた。

## ExcelにおけるTruthy、Falsyの検証結果 
- 数値は0以外が`TRUE`。0のみが`FALSE` （負の数も`TRUE`）
- [日付の実体は数値](http://qiita.com/AQRiL_1132/items/4e1d8eb980b952275c09)なので、実体が数値0である1990/1/0を除いて日付はすべて`TRUE`
- 未入力は`FALSE`
- 文字列の"TRUE"と"FALSE"はそのまま論理値として処理される。このとき、大文字小文字の区別はなし
- それ以外の文字列は＃VALUEエラー（空文字や半角空白もエラー）

![image](https://qiita-image-store.s3.amazonaws.com/0/103957/0326c07c-a3dc-b962-87fa-6815834a85bf.png)
右に`=NOT(NOT(値))`の計算結果も示している。
この数式は値がTRUEと解釈できる値であるなら論理値`TRUE`を出力し、`FALSE`と解釈する値であるなら論理値`FALSE`を出力する。

<details><summary>`=NOT(NOT(値))`の数式について詳解</summary><div>
NOT関数は引数の値がTRUEと解釈できる値なら論理値`FALSE`を出力し、逆に`FALSE`と解釈できる値なら論理値`TRUE`を出力する関数。
NOT関数の計算結果を更にNOT関数で処理することにより、「反対の反対」となる結果を求めることになるので、
即ち、「TRUEと解釈される値」を「論理値`TRUE`」に変換することができる。FALSEも同様。

[NOT 関数 - Office のサポート](https://support.office.com/ja-jp/article/NOT-%E9%96%A2%E6%95%B0-9cfc6011-a054-40c7-a140-cd4ba2d87d77)
</div></details>

### TruthyとFalsyの理解により書けるようになる数式
Truthy、Falsyの概念を理解することで、IF文の第1引数の条件式を短くシンプルに書くことができるようになる。
ただし、Excelが得意じゃない人と一緒に触るシートで無闇にやってしまうと却ってトラブルの元になるので注意。

以下のような数式のIF文中の0との比較する処理は不要であるため、省略できる。

####**COUNT関数による存在確認**
指定したセル範囲に数値が入っているセルがあれば「●」を出力する数式
#####普通の書き方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/cf1adb46-3a33-2db7-80f9-56b9674e160b.png)

```:ふつう
=IF(COUNT($A$1:$A$10)>0, "●", "-")
=IF(3>0, "●", "-")
=IF(TRUE, "●", "-")
="●"
```

↓　↓　↓　↓

#####シンプルな書き方
`COUNT($A$1:$A$10)`の結果は必ず0以上の整数になる。
1以上のときに「●」。0のときだけ「-」が出れば良いのであれば、1以上の数値はTruthyで0はFalsyなので、第1引数の数式中の`>0`の部分はあってもなくても結果に影響しない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/30522d3e-80df-73ae-d8e6-cb4381a8cb7b.png)

```:Simple!
=IF(COUNT($A$1:$A$10), "●", "-")
=IF(3, "●", "-")
=IF(TRUE, "●", "-")
="●"
```


####**[COUNTIF関数とワイルドカード文字によるLIKE検索](http://qiita.com/AQRiL_1132/items/9bf905bbda718372b36a)**
A1セルの中身が`c`で始まり、何らかの1文字を挟んで`t`で終わることを検証する数式
#####普通の書き方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/047f62a9-6eb4-d2fd-3c3e-c32d1d514bc3.png)

```:ふつう
=IF(COUNTIF($A$1,"c?t")>0, "●", "-")
=IF(1>0, "●", "-")
=IF(TRUE, "●", "-")
="●"
```

↓　↓　↓　↓

####シンプルな書き方
`COUNTIF($A$1,"c?t")`の結果は、条件に合えば1。合わなければ0が出力される。
先ほどと同様の理由で第1引数の数式中の`>0`の部分はあってもなくても結果に影響しない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/795de3fa-7a60-50ca-cd4e-01d5c1a87dbf.png)

```:Simple!
=IF(COUNTIF($A$1,"c?t"), "●", "-")
=IF(1, "●", "-")
=IF(TRUE, "●", "-")
="●"
```

# 参考リンク
[論理関数 (リファレンス) - Office のサポート](https://support.office.com/ja-jp/article/%E8%AB%96%E7%90%86%E9%96%A2%E6%95%B0-%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-e093c192-278b-43f6-8c3a-b6ce299931f5?ui=ja-JP&rs=ja-JP&ad=JP)