Excelで「~以上」や「~より大きい」といった条件を指定したときに、理解しがたい現象が発生するケースもある。たとえば「4以上」という条件を指定すると、「5」や「10」などの数値だけでなく、「ABC」や「日本語」などの文字列も「真の場合」として処理されてしまう。今回は、こういった不具合に対処する方法を紹介していこう。

「~以上」の条件を指定したときに生ずる不具合

今回は、「~以上」や「~より大きい」といった条件を指定したときに生じる不具合について解説していこう。これらの条件を厳密に正しく機能させるには、ISNUMBERなどの「データ型を調べる関数」を利用する必要がある。

  • データの種類(型)をTRUE/FALSEで返すIS系の関数

具体的な例を使って紹介していこう。以下の図は、レストランの予約フォームをExcelで作成した例だ。このレストランでは「4人以上であればコース料理を予約可能」というルールになっている。そこで人数(C5セル)が「4以上であるか?」をチェックする機能を関数IFで作成した。

  • 人数が「4以上」をチェックする関数IF

この結果について検証していこう。まずは、C5セルに「数値データ」が入力されていた場合だ。以下の図では、C5セルに「3」と入力されている。この数値は「4以上」の条件を満たしていないので「偽の場合」として処理される。これは予想通りの結果といえるだろう。

  • 人数が「数値」で入力されていた場合

続いては、C5セルに間違って「文字列データ」を入力してしまった場合の例だ。この場合は「4以上」の条件を満たしていないので「偽の場合」として処理されるはずである。しかし、実際には「真の場合」として処理され、「OK」の文字が表示されてしまう。

  • 人数が「文字」で入力されていた場合

このように「~以上」や「~より大きい」といった条件を指定すると、文字列データも「真の場合」として処理されてしまう。似たような例をもうひとつ紹介しておこう。

今度は、「真の場合」の処理に(人数)×(コース料金)の数式を指定した例だ。正しく処理されていれば、指定した人数分の料金が自動計算されるはずである。

  • 料金を計算する関数IF

まずは、普通に「数値データ」を入力したときの結果を紹介する。以下の図ではC5セルに「4以上」の数値が入力されているので「真の場合」として処理され、5×4,800の計算結果が表示される。これは予想通りの結果といえる。

  • 人数が「数値」で入力されていた場合

では、C5セルに「文字列データ」を入力したときはどうなるだろうか? この場合も関数IFは「真の場合」として処理され、(C5セル)×4,800の計算を実行しようとする。しかし、(文字列)×(数値)は計算できないため「#VALUE」のエラーになってしまう。

  • 人数が「文字」で入力されていた場合

文字列データは「4以上」の条件を満たしていないので、本来であれば「偽の場合」として処理されるはず・・・、と考えるのが普通かもしれない。しかし、実際にはそうなってくれない。

このような結果になるのは、Excelが「文字列データ」を「数値データ」より大きいものとして扱う仕様になっているからだ。つまり、「△以上」といった条件を指定すると、「△以上の数値データ」だけでなく、「文字列データ」も条件を満たすデータとして処理されてしまうのだ。

同様の不具合は「条件付き書式」でも発生する。たとえば「100以上」を条件にしてセルを強調表示した場合、「100以上の数値データ」だけでなく「文字列データ」も強調表示されてしまう。

こういった不具合を解消するには、「データ型を調べる関数」の使い方を覚えておく必要がある。

データが「数値」であるかを調べる関数ISNUMBER

セルに「数値データが入力されているか?」をチェックするときは、関数ISNUMBERを使用する。この関数は、カッコ内に指定したデータ(セル参照)が「数値データであるか?」を確認してくれるものだ。数値データであった場合はTRUE、そうでない場合はFALSEが返される。

簡単な例を紹介しておこう。たとえば、B2セルのデータが「数値データであるか?」を確認したいときは、「=ISNUMBER(B2)」と関数を記述すればよい。

  • 関数ISNUMBERの入力

B2セルが「数値データ」であった場合は、結果としてTRUEが返される。

  • 関数ISNUMBERの結果(数値データの場合)

一方、B2セルが「文字列データ」などの「数値でないデータ」であった場合は、結果としてFALSEが返される。

  • 関数ISNUMBERの結果(数値データでない場合)

このISNUMBERを関数IFの条件に追加すると、文字列データが「真の場合」として処理される不具合を解消できるようになる。

データが「数値」のときのみ「真の場合」として処理するには?

ということで、具体的な対処法を紹介していこう。「真の場合」として処理するデータを「4以上」の「数値データ」に限定したいときは、

 ・データ型が「数値」であるか?
 ・数値は「4以上」か?

といった2つの条件をANDで結んであげればよい。これを関数IFの条件に指定すると、以下の図に示したような記述になる。

  • IF、AND、ISNUMBERの関数を組み合わせた例

結果を確認していこう。C5セルに「4以上の数値」を入力したときは、2つの条件を両方とも満たしているので「真の場合」として処理される。よって、(人数)×4,800の計算結果が表示される。

  • 人数が「数値」で入力されていた場合

一方、C5セルに「文字列データ」を入力したときは、ISNUMBER(C5)の条件を満たしていないので「偽の場合」として処理される。その結果、「※人数に4以上の数値を入力」と表示される。

  • 人数が「文字」で入力されていた場合

念のため、「4未満の数値」を入力したときの結果も紹介しておこう。この場合、「4以上」の条件を満たしていないので「偽の場合」として処理される。

  • 人数が「4以上」でない場合

このように「データ型が数値であるか?」をチェックする条件を追加しておくと、「文字列データ」が「真の場合」として処理される不具合を回避できる。関数ISNUMBERをエラー対策(不具合対策)に活用する方法として覚えておくと役に立つだろう。

データ型を調べる関数

ISNUMBERのほかにも、Excelには「データ型を調べる関数」がいくつか用意されている。簡単に紹介しておこう。いずれの関数もカッコ内にデータ(セル参照)を指定するだけで使用することが可能だ。

◆ISNUMBER
 データが「数値」のときにTRUEを返す

◆ISEVEN
 データが「偶数」のときにTRUEを返す
 ※小数点以下を含む場合は「整数部分」で判断される
 ※空白は0(ゼロ)とみなされるためTRUEを返す
 ※文字列の場合は「#VALUE」のエラーになる

◆ISODD
 データが「奇数」のときにTRUEを返す
 ※小数点以下を含む場合は「整数部分」で判断される
 ※文字列の場合は「#VALUE」のエラーになる

◆ISTEXT
 データが「文字列」のときにTRUEを返す

◆ISNONTEXT
 データが「文字列以外」のときにTRUEを返す
 ※「空白セル」の場合もTRUEを返す

◆ISBLANK
 データが「空白セル」のときにTRUEを返す

◆ISLOGICAL
 データが「ブール値」(TRUEまたはFALSE)のときにTRUEを返す

  • データ型と関数の結果一覧

また、指定したセルで「エラーが発生しているか?」を調べる関数として、以下のような関数も用意されている。

◆ISERR
 「エラー値」のときにTRUEを返す(#N/Aのエラーは例外)

◆ISERROR
 「エラー値」のときにTRUEを返す
 (#N/A、#VALUE!、#REF!、#DIV/0!、#NUM!、#NAME?、#NULL!のいずれかでTRUE)

◆ISNA
 「#N/A」のエラー値のときにTRUEを返す

そのほか、指定したセルに「数式や関数が入力されているか?」を調べるISFORMULA、「セル参照として有効か?」を調べるISREFといった関数もある。

◆ISFORMULA
 「数式」や「関数」が入力されているときにTRUEを返す
 ※「=C2」などのセル参照も数式とみなされる

◆ISREF
 「セル参照」として有効なときにTRUEを返す
 ※セルやセル範囲に名前を定義している場合に活用する

関数ISREFだけ使い方が特殊になるので補足説明しておこう。この関数は、カッコ内に記述した文字が「セル参照として有効か?」を調べるものとなる。

たとえば、「=ISREF(C5)」のように「セル参照」を指定するとTRUEが返される。「=ISREF(C5:F10)」のように「セル範囲」を指定したときもTRUEが返される。これらは、C5やC5:F10がセル(セル範囲)の参照として「有効な記述」であることを示している。当然といえば当然の話だ。

関数ISREFを効果的に活用できるのは、セルやセル範囲に「名前」を定義している場合だ。たとえば、E3:E9のセル範囲に「金額」という名前を定義したとしよう。

  • セル範囲に名前を定義

この場合、「金額」の文字はセル範囲として「有効な記述」になるため、関数ISREFの結果はTRUEになる。

  • 名前が定義されている場合

一方、「数量」という名前はどこにも定義されていないので、セル参照やセル範囲として「無効な記述」になる。よって、関数ISREFの結果はFALSEになる。

  • 名前が定義されていない場合

滅多に使わない関数であるが、こういった関数があることを知っておくと、いつか役に立つかもしれない。「データ型を調べる関数」を覚えるついでに動作を確認しておくとよいだろう。