スポンサーリンク

エラー(#REF!)に強い式を作る

関数の応用

エクセルで、行削除や列削除、シート削除といった操作をしていると、そこを参照していた数式が、#REF!エラーになって壊れたなんてことありませんか?

今回は、INDIRECT関数を使うことで#REF!エラーになりにくい式を作ろう!というお話です。

 

そもそも#REF!とは?

#REF!に強い式を作ろう!・・・の前に、そもそもどういうエラーなのか、どういう時に発生するのかを確認しておきましょう。

エクセルヘルプで調べてみるとこのような結果が出てきました。

#REF! エラーは、数式が無効なセルを参照している場合に表示されます。 ほとんどの場合、このエラーは、数式から参照されているセルが削除または上に貼り付けられたときに発生します。

 

記事冒頭でも書いたとおり、やはり削除時に発生するものだそうですね。

念のため実験しておきましょう。

シンプルに、A1セルに=D1を入力し、D列を削除してみます。

 

このように、表示上だけ#REF!になるのではなく、数式内のD1が#REF!に置き換わり、そのうえで表示も#REF!になるという事がわかりました。

ちなみにですが、参照の仕方を=$D$1(絶対参照)にしてもダメです。

もう一つ言うと、=D1&E1の場合はD1が#REF!に置き換わり、E1は左にスライドしてD1に置き換わるので、=#REF!&D1という式になり、表示は#REF!となります。

なお、ここでいう削除というのは、DELETEキーなどによるセル内容の削除ではなく、右クリックなどによる列削除、行削除、セル削除のことです。

 

INDIRECT関数を使うと#REF!に強くなる

さて、行列セル削除をすると#REF!になる場合があるという事がわかりました。

しかし、参照先をINDIRECT関数を使って組むことにより、#REF!になりにくくする事ができます。

実際に、SUM関数の集計範囲にINDIRECT関数を使って試してみましょう。

 

SUM関数で実験

結果を比較するために、=SUM(E:E)と、=SUM(INDIRECT("E:E"))の2つの式を用意してみます。

 

式の内容はシンプルで、E列の数値を合計しています。

ここで、E列を削除するとどうなるでしょうか。

 

このように、普通のSUM関数の式は#REF!となってしまいましたが、INDIRECT関数を使っている方は崩れないで済みました。

 

メリットとデメリット

ここまでで紹介したように、INDIRECT関数を使うことで、#REF!になりにくいという利点があります。

反面、参照先が固定されてしまっているので、行列セル削除をしても、自動で範囲を変更してくれないというデメリットがあります。

どういう事か実験してみましょう。

下図のように、月間エサ代(H列)を集計していたとします。

 

ここで、性別の列要らないなって事に気づき、G列を削除するとどうなるでしょう。

 

普通のSUM関数の式は、集計範囲が自動で左にスライドしてG列を合計してくれました。

しかし、INDIRECT関数を使っている式は、集計範囲がH列で固定されたままになってしまいました。

 

このように、INDIRECT関数を使う事でたしかに#REF!になりにくい式は作れましたが、こういったデメリットがあるという事を理解したうえで活用しましょう。

 

参照先のシートを入れ替える事がある場合に便利

ここまでは列削除の場合でお話してきましたが、個人的に一番効果を感じるのは、別シートを参照している時です。

たとえばVLOOKUP関数で、検索先の表が別シートになっている場合。

 

この時、太郎リストは定期的に更新するものとします。

そして太郎リストは毎回大幅な更新があるとします。

こういう場合、太郎リストの内容を直接変更するのではなく、そもそも新しい太郎リストと、シートまるごと交換した方が作業的には楽ですよね。

ですが、普通のVLOOKUP関数の式では、太郎リストのシートを交換するために、一度シート削除すると、その時点で#REF!エラーとなってしまいます。

 

それではINDIRECT関数を使った式に変更してみましょう。

 

この式の状態で、太郎リストシートを一度削除してみます。

すると、表示上は#REF!になってしまいますが、数式は崩れずに残ったままになります。

 

つまり、新しい太郎リストのシートを持ってきてあげれば、無事に太郎リスト更新完了となるわけです。

 

このように、参照先のシートを差し替える事がある場合、INDIRECT関数を使って#REF!を回避するのは非常に便利なんです。

 

実例

実際にこの手法を使ってるエクセルファイルがあります。

当ブログで公開している、住所分割エクセルですね。

住所を都道府県、市区町村、それ以降に分割する
住所を都道府県、市区町村、それ以降に分割する仕組みを用意しました! よく問題にあがる市川市とか野々市市にも対応済のほか、郡山市など郡ありの市町村にも対応できたエクセルファイルができたので、すぐに使えるようにファイルを公開します。 特徴 ここ...

 

実在する市区町村かチェックするために、総務省が公開しているデータを使っているのですが、たまに更新が入るんですよね。

その時、部分的に手で直すと、変更が漏れてしまう事があるので、シートまるごと交換できる仕組みにしておいた方が都合が良かったのです。

 

つまりINDIRECT関数すごい

参照先が固定されてしまうというデメリットこそありますが、理解したうえで使うとめちゃくちゃ便利です。

このINDIRECT関数はぜひ広まってほしいので、今回の使い方以外にもINDIRECT関数が大活躍してる記事を紹介して終わります。

VLOOKUPの検索範囲を間接的に指定する(セル参照させる)
VLOOKUPを使う際、検索範囲は基本、直接指定するしかありません。 例:=VLOOKUP(F6,A:B,2,FALSE) 検索範囲というのはこれでいう、A:Bにあたる部分になります。 ですが、式に直接検索範囲を書き込むと、違う範囲を検索し...
VLOOKUPで複数の別シートを参照する時、式の作成楽をする方法
VLOOKUP関数で、他のシートを参照したい時ってありますよね。 1つ2つなら、まぁ手入力でいいかなってなりますが、これが10シート、20シートとなると、手入力なんてやってられません。 この作業、楽にしちゃいましょう。 その前にもし、VLO...

 

INDIRECT関数そのものの解説はコチラ。

INDIRECT関数 - 指定したセルを参照する関数
INDIRECT関数とは INDIRECT関数とは、指定したセルの内容を返す関数です。 エクセル上での説明もほぼ同じ書き方をされていて、下記のようになってます。 指定される文字列への参照を返します。 だって他に言い方が無いんだもの。 IND...

 

 

コメント

タイトルとURLをコピーしました