- ベストアンサー
エクセル関数「IFERROR」と「IF(ISERROR」の違いは?
- エクセルの関数「IFERROR」は、指定した式の結果がエラーの場合に指定した値を返します。一方、「IF(ISERROR」は、指定した式がエラーの場合に指定した値を返し、正常の場合は指定した式の結果を返します。
- 例えば、「IFERROR(VLOOKUP(A1,Sheet2!A$1:H$100,3,0),"")」という式は、A1を検索し、Sheet2の範囲内で一致する値を取得します。もし一致する値がない場合、エラーが発生するため、IFERRORを使って空白を返します。
- 一方、「IF(A1="","",VLOOKUP(A1,Sheet2!A$1:H$100,3,FALSE))」という式は、A1が空白でない場合にVLOOKUP関数を実行し、一致する値を取得します。もしA1が空白の場合、空白を返します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
3と4について説明するのがわかりやすいでしょうかね。 そうなっている理由とは、単に、『IFERROR関数が、Excel2007以降で実装された新しい関数だから』なんです。(つまり歴史的経緯) 2007の前のバージョン、Excel2003までは、 =IF(ISERROR(セル等),"エラー時の値","セル値を元にした計算など") と書くしか、ありませんでした。 またそこで、セルの値そのもののエラーで判定するのではなく、計算値のエラー表示をさせたくない、と思った時には、条件文と、セルに表示する値、それぞれに式が必要になります。それで、 =IF(ISERROR(エラーになるかもしれない計算式),"エラーです",(エラーになるかもしれない計算式)) と、ダブって記述せざるを得ませんでした。 Excel2003までの解説書では、ずっとこういう方法で書かれてきていました。 ですがこの使用方法がとても多かったため、2007でようやく IFERROR 関数が新設されて、 =IFERROR(エラーになるかもしれない計算式, エラーの場合の値) というすっきりした書き方ができるようになったんです。 ですが昔書かれた =IF(ISERROR(~ という式も間違っているわけではなく、これを使えなくしたら、古いExcelファイルが使えなくなってしまうなど、トラブルになります。 なので、古い書き方でもそのまま使えます。 昔はそう書かなきゃいけなかったんだ、という訳ですので、自分で関数使うならわかりやすいIFERRORだけ使うんで、全然かまいません。
その他の回答 (5)
- bunjii
- ベストアンサー率43% (3589/8249)
回答No.4に誤りがありました。 AVERAGRE関数の範囲に数値が全くないとき0除算エラーが発生します。 これを回避するには回答No.3に提示されている次の数式がシンプルで良いかと思います。(Excel 2003以前のとき) =IF(ISERROR(AVERAGE(B2:K2)),"",AVERAGE(B2:K2)) ↓ =IF(COUNT(B2:K2),AVERAGE(B2:K2),"")
お礼
わざわざ、ありがとうございました。
- tsubu-yuki
- ベストアンサー率46% (179/386)
ご質問の大義 > 何をしたくてこういう式になっているのか について申し上げるなら 「2は1と、4は3と(ほぼ)同じことをしたい式ですよ。」 が直接の回答です。 重要な部分だけ手短に。 質問文中の「1と2」「3と4」は(ほぼ)同義です。 2の式は「検索値が空白だったら」しか想定していないので、 VLOOKUPの返り値がその他のエラーである可能性を考慮しません。 なので、厳密には異義ですが、VLOOKUP関数で想定されやすいエラー 「検索値が空白だから#N/Aエラー」には対応しているので、 広義では同義と言えなくもありません。 さらに補足を入れるなら、 2003Ver.以前はIFERROR関数が無かったので 「IF関数とISERROR関数を併用」 「あるいは、対象が空白だったら空白を返す」 などという回りくどいやり方(質問文中の2・4)をしていましたが、 2007Ver.でIFERROR関数が登場して状況が変わったのです。 この2007以降からエクセルを使い始め、 初めからIFERROR関数式を使えた方々には関係の無い話ですが、 2003以前からのユーザーで頭のお堅い(私のような)ユーザーにとっては IFERROR関数の方が「何をしたくて??」だったわけです。 ※私はようやく慣れてきましたよ、さすがに。 質問文中の > 他人の作成したエクセル内の関数で疑問が については、(私のような)古くからのユーザーで 「未だにIFERROR関数を知らない/使いこなせない」 あるいは 「IFERROR関数登場(2007)以前のファイルを使用している」 のであろうと思われます。 ※もしかしたら「IFERRORより解りやすかろう」という 無用な優しさなのかもしれません。推察ですが。 未だにエクセルの虎の巻サイトや必勝本なんかでも「併用」が見られるのは 新バージョン対応に更新されていないか、頭のお堅い講師によるものでしょう。 2007以降の比較的新しいバージョンに慣れたユーザーには無用の長物、 「あー、昔は大変だったんだなぁ」くらいで考えてください。 以上、回答でした。 以下、さらに無駄な情報かもしれませんので(そこそこ長くなりましたし) 読み飛ばしてくださってかまいません。 「関数の挿入」ウィザードを起動し、VLOOKUP関数を選択すると VLOOKUP(検索値,範囲,列番号,検索方法) という説明を確認できます。 面倒ですが、ここで「この関数のヘルプ」をクリックしてみましょう。 エクセルのヘルプが起動し、VLOOKUP関数の若干詳しい説明を見れます。 ヘルプの一番下、関連トピックに VLOOKUP 関数の #N/A エラーを修正する方法 というトピックが見えますので、クリックしましょう。 その「問題」の冒頭にもある通り、VLOOKUP関数は 「参照値が配列の最初の列にない場合、#N/A エラーが表示」 されます。 ※検索される列が左端にあっても、配列(リスト)に検索値が無い場合は #N/Aエラーが返ります。 検索値が空白の場合も空白文字列の場合も 「配列に検索値が無い」と判断され、#N/Aエラーが表示されます。 この「検索値(A1セル)が空白だからエラー」を回避するために 質問文中の2:=IF(A1="","",VLOOKUP(A1,Sheet2!A$1:H$100,3,FALSE)) として、「A1が空白だったら空白を返しなさい」としています。 ただし、上記(2)だと「検索すべき配列に検索値が含まれない」時は これだけでは対応しきれません。 で登場するのがISERROR関数です。 関数の挿入ウィザードでISERROR関数を選択すると、 ISERROR(テストの対象) との解説があり、引数「テストの対象」がエラーならTRUEを返す、 という説明があります。 コレをIFに渡し、TRUEなら""空白文字列を、 FALSEならVLOOKUPの返り値を表示しなさい、の意味で 質問文中の4の使い方: =IF(ISERROR(VLOOKUP(A1,Sheet2!A$1:H$100,3,FALSE)),"",VLOOKUP(A1,Sheet2!A$1:H$100,3,FALSE)) を採用し、エラー処理をしています。 なお、AVERAGE関数にエラー処理を加えたいときは 式:=IF(COUNT(B2:K2)=0,"",AVERAGE(B2:K2)) として、範囲に数値が0個(全部数値以外)をIFで評価することもできます。 しかし時代が変わり、2007Ver.になり、 IFERROR関数が登場すると、話がガラリと変わりました。 関数の挿入ウィザードでIFERROR関数を選択すると、 IFERROR(値,エラーの場合の値) との説明を見ることができます。 つまり、ISERROR関数で評価していた「テストの対象」を IFERROR関数の第1引数「値」として渡すことにより、 「エラー評価とエラー処理」を一気にできるようになったのです。 よって、 質問文中の1の使い方: =IFERROR(VLOOKUP(A1,Sheet2!A$1:H$100,3,0),"") として、VLOOKUP関数式がエラーだったら空白を返しなさい。 というエラー処理込みのスッキリした関数で済むようになったのです。 IFERROR関数は#DIV/0!エラー(0で除しようとした)にも対応するので 質問文中の3の使い方にも堪える、ということですね。 ※質問文中の1については、IFNA関数でも対応可能です。 #N/Aエラーに特化した関数ですので、 場面によって使い分けるとさらに使い勝手が良いです。 一部の2007について悪評を垂れる人々にとっても IFERROR/IFNA関数の登場は 数少ない大きな改善の一つであると言えるかもしれません。 ところで、関数の挿入ウィザードも便利ですが、 迷ったらヘルプも参照することをオススメします。 時々ですが、ちょっと良い情報が手に入ったりします。
お礼
マクロはよく使いますが 関数は苦手で、あまり使いません。 セルに式が入っているのも好きではなく そのセルに式が入っているか入っていないかが瞬時にわからないですし 1部分だけ式が消されて、判断をあやまったり.... わかりやすいIFERRORを使用します。 ありがとうございました。
- bunjii
- ベストアンサー率43% (3589/8249)
>他人の作成したエクセル内の関数で疑問が有ります。 ------- ここから例示の数式 -------- 1. =IFERROR(VLOOKUP(A1,Sheet2!A$1:H$100,3,0),"") と 2. =IF(A1="","",VLOOKUP(A1,Sheet2!A$1:H$100,3,FALSE)) ------- ここまで例示の数式 -------- >では何が相違するのでしょうか? 1.はExcel 2007以降に追加されたIFERROR関数でVLOOKUP関数でエラーが発生したとき””が代入されエラー表示を回避できます。 2.はExcel 2003以前の検索値(A1)が入力のときに発生するエラーを回避するためにIF関数を使っていますが、A1の値が検索範囲に含まれていないときのエラーは回避できません。 従って、2.の数式は不完全なので1.の数式と等価になりません。 >同じく ------- ここから例示の数式 -------- 3. =IFERROR(AVERAGE(B2:K2),"") と 4. =IF(ISERROR(AVERAGE(B2:K2)),"",AVERAGE(B2:K2)) ------- ここまで例示の数式 -------- >では何が相違するのでしょうか? 3.と4.は使っているエラーチェック用の関数が異なるだけで結果は同じです。 但し、AVERAGRE関数では範囲の中に文字列や未入力のセルを無視しますのでエラーが起りません。 従って、エラーチェックの必要が無いので双方とも無駄な手間を掛けています。
お礼
ありがとうございます。 AVERAGE これでERRが出たので使ったと言われました。 本当に出たのかは不明です。
- Chiquilin
- ベストアンサー率30% (94/306)
IFERRORは Excel2007以降で追加された関数ですから その 2つの差は古いバージョンに対応するかしないかの問題です。 もっというと最初の式は Excel2013なら IFNA関数でもいい でしょう。 > =IF(ISERROR(AVERAGE(B2:K2)),"",AVERAGE(B2:K2)) エラー対策をよく考えない人はこういう式を書きます。 =IF(COUNT(B2:K2),AVERAGE(B2:K2),"") エラーは原因に対してピンポイントで対応した方がいいと 個人的には思います。他のエラーまで消してしまうと 原因 が分からなくなることもありますので。
お礼
ありがとうございます。 エラーが出る事を承知しているシートで使用しています。 それ以外はやはりERR表示させないと 困る場合もあるので、そのままERR表示させます。
- FEX2053
- ベストアンサー率37% (7991/21371)
あと、1と2だと大きな違いがあります。 この式のVlookUpで、A1セルの値がブランクでなく、かつ参照する 相手が見つからないとき、1.だとブランクが返ってくるが、2.だと #N/Aとなって結果が評価されない・・・です。 Vlookupは、参照する相手が無いと#N/Aというエラーが出ます。 このエラーは、一旦出たら最後、関係する演算式が全部エラーに なるという、結構めんどくさい関数だという事を、頭の片隅に 置いておくと幸せになれます。
お礼
ありがとうございます。 あと0が表示されてしまうのも あまり好きではないです。
お礼
ありがとうございます。 IFERRORを使う事にします。