Menu

Excelの#REF!エラーはなぜ出る?原因と直し方

#REF!は、数式がもう存在しないセルを参照しているという意味で、たいていは使っていた行、列、シートが削除されたのが原因です。=B2*C2は=B2*#REF!になります。VLOOKUPやINDEXが範囲の外の列や行を求めたときにも表示されます。

このページのシートはすべて実際に動きます。数値や数式を変えると再計算されます。

#REF!は、数式がそこにないセルを参照しているという意味です。よくある原因は行、列、シートの削除です。C列を削除すると、Excelは=B2*C2を=B2*#REF!に書き換え、それ以降の結果は#REF!になります。削除した直後にCtrl+Z(MacではCmd+Z)を押すと、列と数式が元に戻ります。

列を削除した後
D2
ABCD
1ProductPriceQtyTotal
2Apple1.210#REF!
3Pear1.520#REF!
4Plum0.815#REF!
5Bread2.45#REF!
#REF! 存在しないセルを参照しています。

数量の列は削除された後に入力し直されていますが、数式はまだ#REF!のままです。一度失われた参照をExcelが直すことはありません。D2をクリックして#REF!をC2に置き換え、Enterを押します。列全体がそれに合わせて変わり、D2は12を表示します。

#REF!が数式に入る仕組み

数式が使っていたセルがなくなると、Excelはいつでも数式に#REF!を書き込みます:

したことD2の=B2*C2は次のようになる
C列を削除した=B2*#REF!
2行目を削除した数式はその行と一緒に削除される。2行目を指していたほかの行の数式は#REF!になる
数式が参照しているシートを削除した=#REF!B2*2(=Prices!B2*2のような数式の場合)
セルを切り取って、数式が使っているセルの上に貼り付けた上書きされた参照の場所が#REF!になる

範囲の中のセルを削除するのは安全です。C列を削除すると、=SUM(B2:D2)は=SUM(B2:C2)になります。範囲の最初や最後のセルを削除しても、範囲が縮むだけです。そのため、=B2+#REF!+C2になってしまう=B2+C2+D2より、=SUM(B2:D2)のほうが安全です。

VLOOKUPが#REF!を返す理由

VLOOKUPの3つ目の引数は、表の範囲の中の列を数えます。それが範囲の列数より大きいと、結果は#REF!になります。

範囲の外の列番号
F2
ABCDEF
1ProductPriceStockLook forStock
2Apple1.240Pear#REF!
3Pear1.525
4Plum0.860
5Bread2.412
6Milk1.130
#REF! 存在しないセルを参照しています。

A2:C6は3列なので、4列目は存在しません。4を3に変えると、F2は25を表示します。これは検索する表から列を削除した後によく起こります。範囲は縮みますが、直接書いた列番号は変わらないからです。XLOOKUPやINDEXとMATCHの組み合わせは、=XLOOKUP(E2,A2:A6,C2:C6)のように返す列を直接指定するので、この問題を避けられます。そのほかの引数についてはVLOOKUPを参照してください。

INDEXやOFFSETでの#REF!

INDEXは行番号や列番号が範囲の外にあると、OFFSETは1行目より上やA列より左に移動すると#REF!を返します。

範囲の外の位置
B2
ABC
1ScoreResultWhat it asks for
288#REF!6th value of 5
372953rd value of 5
495#REF!2 rows above A2
564814 rows below A2
681
#REF! 存在しないセルを参照しています。

A2:A6には5つの点数があるので、INDEX(A2:A6,6)は#REF!ですが、INDEX(A2:A6,3)は95を返します。0行目は存在しないのでOFFSET(A2,-2,0)は#REF!になり、OFFSET(A2,4,0)はA6に行き着いて81になります。位置がほかの数式(MATCHやCOUNT)から来ているときは、先にその数式を確かめてください。詳しくはINDEXのページを参照してください。

INDIRECTも、文字列が有効な番地でないとき(最後の列はXFDなので=INDIRECT("ZZZ1"))や、閉じているブックを指しているときに#REF!になります。

数式をコピーしたときの#REF!

相対参照は数式と一緒に動きます。十分に上や横にコピーすると、参照がシートからはみ出します:

C3:  =B2*2        (one row up, one column back)
copy C3 to B2:  =A1*2
copy C3 to A2:  =#REF!*2    (there is no column before A)

別のシートやブックにコピーした数式が、そこにないセルを指しているときも同じことが起こります。動いてはいけないセルは$で固定する(=$B$2*2)か、セルではなく数式バーから数式の文字列をコピーします。$については絶対参照で説明しています。

ブックの中の#REF!をすべて探して取り除く

  1. Ctrl+F(MacではCmd+F)を押して#REF!と入力し、オプションを開いて検索対象を数式にし、すべて検索をクリックします。壊れた参照を含むすべての数式が一覧になります。
  2. 多くを一度に直すにはCtrl+H(MacではControl+H)を使います。#REF!を検索して正しい参照に置き換えます。ただし、見つかったものすべてに同じセルを入れるべきときだけです。
  3. 数式 > 名前の管理を確認します。参照範囲の列に#REF!と表示される名前は、それを使うすべての数式を壊します。
  4. 削除したデータがもう戻らず、数式も要らないなら、セルを選択して数式をその値に置き換えます(コピーしてからホーム > 貼り付け > 値)。エラー値はエラーのまま残るので、その後でそれらのセルを削除します。

#REF!を返す検索を直す

在庫の検索を直す
F2
ABCDEF
1ProductPriceStockLook forStock
2Apple1.240Plum
3Pear1.525
4Plum0.860
5Bread2.412
6Milk1.130
セルをクリックすると数式が見えます。数値や数式を変えると、シートが再計算されます。

やってみよう: =VLOOKUP(E2,A2:C6,4,FALSE)は#REF!を返しました。F2に、E2の商品の在庫を返す動く検索の数式を書いてください。

ここで60を返し、データに合わせて変わる検索ならどれでも合格です。列番号3のVLOOKUP、=XLOOKUP(E2,A2:A6,C2:C6)、=INDEX(C2:C6,MATCH(E2,A2:A6,0))のどれでも構いません。

よくある質問

Excelの#REF!はどういう意味ですか?

数式が存在しないセルを指しているという意味です。多くの場合、数式が使っていた行、列、シートが削除され、Excelがその参照を#REF!に置き換えたので、=B2*C2が=B2*#REF!になっています。VLOOKUPやINDEXも、列番号や行番号が範囲より大きいと#REF!を返します。

列を削除した後の#REF!を直すには?

すぐにCtrl+Z(MacではCmd+Z)を押して削除を元に戻します。もう遅いなら、数式をクリックして#REF!を本来使うべきセルに置き換え、もう一度数式を下にコピーします。

VLOOKUPが#REF!を返すのはなぜですか?

列番号が表の範囲の列数より大きいからです。=VLOOKUP(E2,A2:C6,4,FALSE)は3列の範囲の4列目を求めています。3を使うか、範囲をA2:D6に広げます。

ブックの中の#REF!エラーをすべて探すには?

Ctrl+F(MacではCmd+F)を押して#REF!を検索し、検索対象を数式にしてすべて検索をクリックします。Excelが壊れた参照を含む数式をすべて一覧にします。数式 > 名前の管理も確認してください。削除の後、名前が#REF!を指していることがあります。

行や列を削除するときに#REF!を避けるには?

1つずつのセルではなく範囲を参照します。=SUM(B2:D2)はC列やD列を削除すると=SUM(B2:C2)に縮みますが、=B2+C2+D2は=B2+#REF!+C2になります。=XLOOKUP(E2,A2:A6,C2:C6)のように返す列を指定する検索は、列の挿入や、使っていない列の削除にも耐えます。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める