「Aであり、BまたはCである」のように、複雑な条件を組み合わせた条件式を指定する
には、AND関数にOR関数、又は、OR関数にAND関数を組み合わせた数式を作成する。



上図は、セルG3に、「=IF(AND(D3>=30,OR(F3=2006,F3=2007)),"●","")」と入力
したものである。G3をG7までコピーしてある。
これは、年齢が30歳以上で、入会年が2006年と2007年の会員を選択したものである。
条件式を組み合わせるときは、常に、「数式の外側にある関数が優先される」と言う点に
注意が必要である。「AでありBまたはCである」なら、OR関数にAND関数を組み合わせる
のではなく、AND関数にOR関数を組み合わせる数式にする。
75.IF関数とAND関数とOR関数で、複雑な条件を指定する。


上図のセルE40に、「{=IF(AND(C40:D40>=$C$47),"合格","不合格")}」と
入力すると、「合格」と表示された。
これは、C列もD列も合格点より大きい場合に「合格」と表示されるもので、
この場合、5月と6月が合格点より大きい場合に「合格」となるが、何か月もの
比較になると式の入力が長くなり面倒になる。
この場合に、波カッコで囲むと、列を範囲として指定できるようになる。



上図のように月列を追加しても、「C40:D40」を「C40:F40」と変更するだけで列範囲が
拡大する。
尚、波カッコの入力は、式を入力して「エンター」を押す前に、[Ctrl]と[Shift]を
押しながら[Enter]を押すと入力される。

74.IF関数とAND関数で、連続した範囲で同じ値の条件を指定する。


上図のセルE30に、「=IF(OR(C30>=$C$35,D30>=$D$35),"合格","不合格")」と
入力すると、「合格」と表示された。
これは、C30がC35より大きいか、D30がD35より大きければ「合格」と表示される。
5月か6月のどちらかの得点が、平均点より大きければ、合格とするものである。
OR関数は、複数の条件式を指定できる。引数の「論理式1」に1つ目の条件式、「論理式2」に
2つ目の条件式を指定すると、いずれかの条件を満たすと「TRUE」、満たさないと「FALSE]が
返されるため、文字列で返したい時はIF関数を使用する。

73.IF関数とOR関数で、どちらかを満たす条件を指定する。


上図のセルE20に、「=IF(AND(C20>=$C$27,D20>=$C$27),"合格","不合格")」と
入力すると「合格」と表示された。
これは、AND関数で、C20がC27より大きくて、D20もC27より大きい場合、「合格」と
表示するものである。どちらの条件も満たしていると「合格」になる。
尚、AND関数は「論理式」に「C20>=C27,D29>=D27」と条件式を入力する。

72.IF関数とAND関数で、両方を満たす条件を指定する。


上図のセルD20に「=IF(NOT(C20>=$C$25),"不合格","合格")」と入力すると、「不合格」と
表示された。これは、NOT関数で、C20がC25より大きくない場合、「不合格」と表示する
ものである。
尚、NOT関数の「論理式」に「C20>=25」と条件式を入力する。


71.IF関数とNOT関数で満たさない条件を指定する。


上図は、注文表のファイルで指定したデータが、別のファイル「注文控え.xlsx」のデータに
存在するのかを調べるものである。
まず、「注文控え.xlsx」にデータ部を書き込み、どこかに保存して、ファイルは開いておく。
次に、注文表のG4セルに
「=IF(ISNA(MATCH(B4,注文控え.xlsx!$B$3:$B$6,0)),"","注文済")」と入力する。



入力して[Enter]を押すと式が上図の様に、「[注文控え.xlsx]Sheet1!」と自動で書き換わる。
[注文控え]ファイルを閉じると下図のように変化する。



関数バーの式に、[注文控え]ファイルを保存したディレクトリーが自動で書き込まれる。
その式をG7までコピーする。



G5セルに「注文済」と表示された。
その式を見ると、
「=IF(ISNA(MATCH(B5,'C:\Users\user\Documents\[注文控え.xlsx]Sheet1'!$B$3:$B$6,0)),"",
"注文済")」となっている。



これは、[注文控え]ファイルを開いている時に、そのファイルの保存場所を記憶していたもので、
この場合では、ドキュメントに保存したので、そのルートディレクトリがここに書かれている。
だから、[注文控え]は開いている時に、式を入力するとルートディレクトリが自動で入力される。



セルC1に「ISNA」関数を入力すると、[テストの対象]セルの入力を促される。



セルB4を選択すると、[テスト対象]にB4が入り、「FALSE」と表示される。



式を書いたC1セルを見てみると、「FALSE」と表示されている。
これは、ISNA関数はセルがエラー値なら「TRUE」を、エラー値でなかったら
「FALSE」を返すものである。
だから、G4セルの式「=IF(ISNA(MATCH(B4,注文控え.xlsx!$B$3:$B$6,0)),"","注文済")」の
場合、MATCH関数で「注文控え」ファイルの中の「客先コード」B4を調べて、存在しないので
エラー値になり、「TRUE」を返すので空白になる。
G5セルの式の場合、「客先コード」B5は、「注文控え」に存在するので、「FALSE」が
返されて「注文済」と表示される。

70.IF関数とISNA関数とMATCH関数で、別のファイルにデータが有るのか
  どうかを調べる。


上記の表は、注文すると注文控えの表に記録されてゆくもので、注文する時に
すでに注文済かどうかを調べて、重複注文を避けるものである。
セルG4に、「=IF(COUNTIF($B$11:$B$14,B4),"注文済","")」と記入し、
G7までコピーする。



セルG5の式を見ると、「=IF(COUNTIF($B$11:$B$14,B5),"注文済","")」と記入
されている。結果セルに「注文済」と表示されている。
COUNTIF関数の引数は、「=COUNTIF(検索範囲,検索条件)」となるが、「検索範囲」
には「検索条件」の書いてある、下側の表範囲を指定し、「検索条件」には、上の表の
「値」を指定する。
結果B5の値が、B12にあるので、IF関数には、「真の場合」に「注文済」と表示する
ように指定しているので「注文済」と表示される。

69.IF関数とCOUNTIF関数を使って、別の表に同じデータが有るのかを判定
  する。


上図のように、会社名が同じで住所が複数あるような場合、重複する行を見つけるには、
COUNTIFS関数を使用すると複数列を対象に判別できる。
セルE3に、「=IF(COUNTIFS($C$3:C3,C3,$D$3:D3,D3)>1,"重複","")」と入力する。
それを、F8までコピーすると、E8に「重複」と表示された。



セルE8の式を見ると、「=IF(COUNTIFS($C$3:C8,C8,$D$3:D8,D8)>1,"重複","")」と
なっている。これは、C3からC8の範囲にC8が何個あるのかを数え、続けて、D3からD8まで
に、D8と同じものが何個あるのかを数える。
C列とD列に同じデータが複数あると「重複」と表示される。
COUNTIFS関数の引数は、
「=COUNTIFS(検索条件範囲1,検索条件1,検索条件範囲2,検索条件2)」である。
IF関数と組み合わせることにより、「=IF(条件>1,"重複","")」と条件が1以上の場合に
「重複」と表示することができる。

68.COUNTIFS関数とIF関数で複数列の重複を判定する。


セルE3に、「=IF(COUNTIF($C$3:C3,C3)>1,"重複","")」と入力し、E7までコピー
すると、E6に「重複」と表示された。
セルE6の式は、「=IF(COUNTIF($C$3:C6,C6)>1,"重複","")」となっている。
これは、COUNTIF関数でC3からC6の値を調べて、1以上あるものは、「重複」と表示し、
1以下なら「空白」を表示すると言うものである。どんな大容量のデータでもE3をコピー
するだけで重複を調べられる。

67.COUNTIF関数とIF関数で重複を判定する。


上図のように、セルD4に、「=IFERROR(VLOOKUP(C4,$B$11:$C$15,2,0),"")」と入力する。
IFERROR関数は、IF関数とISERROR関数の両方の機能を備えた関数である。
第一引数の「値」に、指定した値がエラー値であれば、第二引数の「エラーの場合」に指定した
値を返す関数である。だから、第一引数にVLOOKUPを指定して、エラーが返されても「""」で
空白となる。

66.IFERROR関数とVLOOKUP関数でエラーを表示させない方法。


上図は、注文コードを入力すれば単価が抽出され、注文コードが未入力なら、
何も表示されない様にした注文票である。



上図のセルD4に、「=IF(ISERROR(VLOOKUP( 」と入力し、[関数の挿入]ボタンを押すと、
VLOOKUP関数の引数が表示されるので、ダイアログに続けて入力する。
「=IF(ISERROR(VLOOKUP(C4,$B$11:$C$15,2,0)」まで入力する。
次に、下図のように式の最後に「))」カッコを二つ追加する。



次に、「値が真の場合」のテキストボックスに「""」を入力すると、式が変化する。





次に、上図のように関数バーの式の「VLOOKUP(C4,$B$11:$C$15,2,0)」までをコピーする。
そのままで、



関数バーの式の「IF」の後ろにカーソルを挿入すると、IF関数の引数画面に戻る。



関数の引数画面の「値が偽の場合」のテキストボックスに貼り付ける。[OK]を押す。
「=IF(ISERROR(VLOOKUP(C4,$B$11:$C$15,2,0)),"",VLOOKUP(C4,$B$11:$C$15,2,0))」
となる。


注文コードを入力してみると、単価が表示された。



VLOOKUP関数では、検索値が無いとエラーになるが、このやり方では、エラーが表示されない。

65.VLOOKUP関数とIF関数とISERROR関数でエラーを表示させない方法。


上図は、数式にエラーが表示された場合に、エラーの種類によって詳細欄にその説明を
表示させるものである。



D列には、VLOOKUP関数が書かれていて、商品単価表から単価を抽出している。
単価表に登録されていない商品や、オープン価格など文字列で単価が記入されて
いると、注文単価列ではエラーが表示される。
単価と数量を積算するF列では、そのエラーが表示される。


上図のG6セルに、
「=IFERROR(CHOOSE(ERROR.TYPE(F6),"","","価格確認","","","","商品登録なし"),"")と
入力されている。
これは、「#N/A」のエラーには「商品登録なし」、「#VALUE!」エラーには「価格確認」と表示する。
IFERROR関数の引数は、「=IFERROR([値]に指定した値がエラー値なら「エラーの場合に指定した
値を返す」であり、エラーかどうか調べて、処理が変えられる。
IFERROR関数の引数「[値]に指定した値が[エラー値]なら」の部分に、CHOOSE関数を使用する。
CHOOSE関数の引数は、「=CHOOSE(番号,値1,値2,)」の様に、指定した値の何番目を抽出すのか
を[番号]で指定した数値の[値番号]の値を返す。
ここでは、CHOOSE関数の引数、[番号]の部分に、ERROR.TYPE関数を使用する。
ERROR.TYPE関数は、「#NULL!」「#DIV/O!」「#VALUE!」「#REF!」「#NAME?」
「#NUM!」「#N/A」のエラー値が、それぞれ「1」〜「7」の数値で返されるから、
それぞれに該当する文字を、「値1」から「値7」に指定する。
だから、G6セルの式は、IFERROR関数の引数「値」にCHOOSE関数を使用し、
「インデックス」に「ERROR.TYPE(F6)」、「値1」と「値2」、「値4」から「値6」に「""」で空白、
「値3」に、「"価格確認"」、「値7」に「"商品登録なし"」と入力した。
「値3」は、エラー値が3で「#VALUE!」であり、この時に「"価格確認"」と表示され、
「値7」はエラー値が7で「#N/A」だから「"商品登録なし"」と表示されるのである。
IFERROR関数の入力方法は、「関数の挿入」をクリックして関数を選択し、「OK」を押す。





IFERRORが入力されて、関数の引数が表示され、数式バーにも表示される。
ここで、数式バーのIFERROR( )のカッコの中にカーソルを入れて「CHOOSE( 」と
入力すると、下図のように「インデックス」を含めたCHOOSE関数の引数が表示される。




「インデックス」の部分に、「ERROR.TYPE(F6)」と入力し、他の引数も入力すればよい。
尚、ERROR.TYPE関数は、「RとT」の間にコンマがあるので忘れないようにしよう。

64.IFERROR関数とCHOOSE関数とERROR.TYPE関数で、エラーに合わせて
  処理を変える。


上図のE3セルに、「=IF(COUNTIF(D3,"東京都*"),"●","")」と入力すると、「●」が
表示された。これは、D列の住所を検索するのに、東京都の後にワイルドカードの「*」を
使用したことによって、東京都以下にある文字列が無視されて、何でもよいと言うことに
なる。
ワイルドカードとは、特定の代わりを表す「*」や、1文字の代わりを表す「?」と言った
記号のことで、「Aで始まる文字」なら「A*」、「Aで終わる文字」なら「*A」の様に使
う。
しかし、IF関数の「論理式」ではワイルドカードを使った文字列を指定しても、条件として
認識されない。そこで、IF関数の「論理式」にCOUNTIF関数を使う。
COUNTIF関数の引数の第2引数「検索条件」では、ワイルドカードを使えるので、ここで
一部の文字条件に指定する。あとは、その条件を満たした時の処理、満たさない時の処理を
指定すればよい。

63.COUNTIF関数で、一部にワイルドカードを使用してデータを抽出する。
ISTEXT関数は、セルの値が文字か、文字でないのかを判定する関数である。



上図のE3セルに、「=IF(ISTEXT(C3),"",C3*D3)」と入力すると「合計値」が表示
された。これは、C列の値が文字なら「空白」を表示し、数値ならC列とD列の値を
積算するものである。
62.ISTEXT関数で数値か文字列かを判定する。
ISEVEN関数は、セルの値が偶数かどうかを調べる関数である。偶数なら「TRUE」、
偶数でないのなら「FALSE]が返される。



上図は、誕生月を偶数か奇数かによって分類する為のものである。
D3セルに、「IF(ISEVEN(MONTH(C3)),"●","")」と入力すると、「空白」が表示された。
これは、C3の日付入力からMONTH関数で月を取り出し、偶数月なら「●」、偶数でないな
ら「空白」にしたものである。7月なので偶数ではない。



上図は、E3セルに、「=IF(ISODD(MONTH(C3)),"●","")」と入力すると、「●」が表示
された。これは、C3の日付入力からMONTH関数で月を取り出し、奇数月なら「●」奇数で
ないなら、「空白」にしたものである。7月で奇数月なので「●」が表示された。
61.ISEVEN関数とISODD関数で、奇数か偶数か判定する。
MONTH関数は、入力された日付データから月を取り出す関数である。



上図のD3セルに、「=MONTH(C3)」と入力すると「7」と月が表示された。
又、「=DAY(C3)」と入力すると「10」と日付が表示される。
60.MONTH関数とDAY関数を使用して、日付から月、又は日を取り出す。


上図のD4セルに、「=IF(C4>=$C$9,"合格","不合格")」と入力すると、「不合格」と
表示された。IF関数の引数は、「=IF(論理式,真の場合,偽の場合)」となり、「論理式」
に条件式を入力し、その条件を満たした時に返す値を「真の場合」に、満たさない時に
返す値を「偽の場合」に入力する。
条件式で使える比較演算子には、「>=(〜以上)」「<=(〜以下)」「>(〜より大きい)」
「<(〜より小さい)」「<>(以外)」「=(等しい)」がある。
上記の場合は、平均点以下だと「不合格」、以上だと「合格」と表示される。
尚、文字列は、「"」ダブルクオーテイションで囲んで指定する。



上図の式は、2つの条件で3つの異なる結果を返すものである。
D12セルに、「=IF(C12>=$C$17,"合格",IF(C12<60,"追試","不合格"))」と
入力し、D16セルまでコピーするとD16セルに、「追試」と表示された。
これは、「合格」でない点数を「追試」か「不合格」か、さらに判定して3つの
結果を出しているものである。

59.IF関数を使用して、条件によって、2つの異なる結果を返す。
Y.条件判断
 この章では、さまざまの条件を満たしているのか、満たしていないのかを
 判断する関数を解説します。
 
関数の実用事例と引数の解説
 条件判断に使用する関数の解説


実際に使っているシステムの内容で解説
  EXCEL VBA 講座