目的別
#REF!エラーの直し方
#REF! は 「参照していた場所が、もう無い」という状態です。
他のエラーと決定的に違うのは、数式の中身が書き換わってしまっていることです。
=VLOOKUP(A2,#REF!,3,FALSE) のように、範囲そのものが #REF! という
文字に置き換わります。元がどこを指していたかは、数式からはもう読み取れません。
このページの中身(22項目)
- いちばん先にやること:取り消す
- 何をすると出るのか
- 取り消せないときの直し方
- 二度と起こさないための書き方
- #REF! は IFERROR で隠してはいけない
- 症状から原因を引く
- 関数別:#REF! が出る場面
- 実際に来そうな相談と、その読み解き
- 直す前のチェックリスト
- よくある質問
- 実際の表で追ってみる
- 壊れた場所をまとめて洗い出す
- 参照が消えても壊れない作りにする
- 共同編集での予防
- 直った後に確認すること
- IMPORTRANGE で起きる場合(スプレッドシート)
- ピボットテーブルやグラフが壊れる場合
- #REF! を出さずに列を消す手順
- 壊れたまま気づかない形に注意する
- 復旧できなかったときのために
- この3つのエラーは、どこが違うのか
- エラーを消す前に
いちばん先にやること:取り消す
直前の操作が原因なら、Ctrl+Z(取り消し)で戻せます。 まず手を止めて、これを試してください。
他の操作をいくつも重ねると、取り消しでは戻れなくなります。 共同編集のシートなら、ファイル → 版の履歴(Excelはバージョン履歴)から、 消す前の状態に戻せます。この2つを試す前に数式を書き直さないでください。 書き直してから履歴で戻すと、直した内容のほうが消えます。
何をすると出るのか
1. 参照していた行や列を削除した
もっとも多い形です。=SUM(C2:C10) と書いてあるところで C列 を削除すると、
数式は =SUM(#REF!) になります。
非表示にしただけなら起きません。削除したときだけです。
2. 参照していたシートを削除した、または名前を変えた
シートを消すと、そのシートを見ていた数式はすべて #REF! になります。
名前の変更は通常追随しますが、INDIRECT("'4月'!A1") のように
文字列で組み立てた参照は追随しません。名前を変えた瞬間に壊れます。
3. 別のブックを参照していて、そのブックが移動・削除された
Excelで外部ブックを参照している場合に起きます。 Googleスプレッドシートでは IMPORTRANGE の アクセス許可が外れた場合が同じ状況にあたります。
4. 貼り付け先が足りない
3列ぶんの数式を、右端から2列しかない場所に貼ると、はみ出した参照が #REF! になります。 表の右端・下端での貼り付けで起きます。
5. INDEXやOFFSETで、範囲の外を指した
=INDEX(A2:A10,15) のように、9行しかない範囲の15行目を求めると #REF! です。
行番号を数式で出しているときに、想定より大きい数が入ると起きます。
取り消せないときの直し方
数式から元の参照は読み取れないので、正しい参照を自分で書き直します。 1つずつ直す前に、まず全体で何か所あるかを把握してください。
まとめて見つける
検索(Ctrl+F)で #REF! を検索し、
検索対象を「数式」に切り替えます。値だけを見ていると、
数式の中に埋まっている分を見落とします。
まとめて直す
同じ形の壊れ方が並んでいるなら、置換が使えます。
#REF! を正しい範囲(例:$F$2:$H$100)に置換します。
置換は元に戻しにくいので、先にシートを複製してから行ってください。
二度と起こさないための書き方
名前付き範囲を使う
範囲に名前を付けておくと、行や列を消しても名前の定義が残ります。 数式側は名前を見ているので、参照が丸ごと消えることが減ります。
列の削除ではなく非表示にする
作業用の列は、消さずに非表示にしておけば #REF! は起きません。 どうしても消すなら、その列を参照している数式が無いか先に確かめます。
INDIRECTを乱用しない
INDIRECT は参照を文字列で組み立てるため、 シート名を変えても追随せず、参照先を消しても警告が出ません。 壊れたことに気づきにくいという意味では、#REF! より厄介です。
列番号ではなく見出しで引く
VLOOKUPの「3列目」は、間に列を1本足すだけでずれます。 XLOOKUP や MATCH で 見出しの名前から列を探す形にしておくと、列の増減に強くなります。
#REF! は IFERROR で隠してはいけない
#N/A は「無かった」という報告ですが、#REF! は数式が壊れた合図です。 IFERROR で空欄にしてしまうと、 壊れた集計が「空欄」として静かに通ります。
隠すのではなく、直してください。
どうしても表示だけ整えたい場合でも、別の場所に
=SUMPRODUCT(--ISERROR(範囲)) で件数を出し、
0以外なら気づけるようにしておきます。
症状から原因を引く
| 見えている症状 | 疑うところ |
|---|---|
| 行や列を消した直後に出た | 削除(原因1)— まず取り消す |
| シートを整理した直後に出た | シート削除・名前変更(原因2) |
| ファイルを開いた瞬間から出ている | 外部ブックの移動(原因3) |
| 表の右端・下端だけ出ている | 貼り付け先が足りない(原因4) |
| 行数が増えたときだけ出る | INDEXやOFFSETの範囲外(原因5) |
数式バーに #REF! という文字が見える | 参照が書き換わっている。復元が要る |
いちばん下の行が重要です。数式バーに #REF! という文字が入っていたら、 そのセルはもう元の参照を持っていません。 表示だけ直す方法はありません。参照を書き直すか、履歴から戻すかの二択です。
関数別:#REF! が出る場面
| 関数 | 出る場面 | 予防 |
|---|---|---|
| VLOOKUP | 列番号が、範囲の列数を超えた | 列を消したら列番号も見直す |
| INDEX | 範囲より大きい行番号・列番号を指した | 行数を ROWS で取って上限を作る |
| OFFSET | ずらした先がシートの外に出た | 基準セルと移動量を確かめる |
| INDIRECT | 文字列で作った参照が存在しない | シート名を変えない、名前付き範囲にする |
| IMPORTRANGE | 参照先のアクセス許可が外れた | 共有設定を確認する |
| TRANSPOSE | 結果を書き出す先が足りない | 行数と列数を入れ替えた分の余白を空ける |
VLOOKUP の列番号は要注意です。範囲を A:C にしていて列番号を4と書くと、
削除していなくても最初から #REF! になります。
実際に来そうな相談と、その読み解き
「不要な列を消したら、集計表が全部 #REF! になった」
典型例です。まず Ctrl+Z。もう他の操作をしてしまったなら、版の履歴から 削除前の版に戻します。数式を書き直す前に履歴を確認してください。 書き直してから戻すと、書き直した内容が消えます。
戻したあとは、消す前に「その列を参照している数式が無いか」を確かめる手順を挟みます。
Ctrl+F で列名(例:C:C や $C$)を数式検索すれば分かります。
「シート名を月ごとに付け替えたら壊れた」
通常の参照はシート名の変更に追随しますが、
INDIRECT で組み立てた参照は追随しません。
=INDIRECT("'"&A1&"'!B2") のような書き方をしている場合、
A1の値とシート名が一致しなくなった時点で壊れます。
月ごとにシートを増やす運用なら、シート名をセルから読む形にして、 シート名そのものは変えない設計にしておくと安定します。
「他の人が編集したら、自分の数式が #REF! になった」
共同編集では、誰かが行や列を消すと、その瞬間に全員の数式が壊れます。 版の履歴で「誰が・いつ・何をしたか」まで追えるので、 まず履歴を開いて、壊れた時刻の前の版に戻してください。
再発を防ぐなら、集計用のシートを保護して、 編集できる範囲を入力欄だけに限定します。
直す前のチェックリスト
- Ctrl+Z を試した(他の操作を重ねる前に)
- 版の履歴で、壊れる前の版を確認した
- 検索対象を「数式」にして
#REF!の件数を数えた - 置換で直す前に、シートを複製した
- 直したあと、元の参照が正しいかを1件ずつ確かめた
よくある質問
#REF! を IFERROR で消してもいいですか
やめてください。#REF! は数式が壊れた合図です。 消すと、壊れた集計が空欄として通ります。 IFERROR は「起きて当然のエラー」にだけ使うものです。
行を非表示にしただけでも出ますか
出ません。非表示は参照を壊しません。 SUBTOTAL や AGGREGATE を使えば、 非表示行を除いた集計もできます。
元の参照が何だったか、後から分かりますか
数式からは分かりません。#REF! という文字に置き換わっているためです。
版の履歴か、バックアップからしか復元できません。
フィルタで並べ替えても壊れますか
並べ替えでは #REF! は出ません。ただし、 行番号を直接指定している数式は、指す先が変わって結果がずれます。 エラーが出ないぶん気づきにくいので、並べ替える表では相対参照を避けてください。
スプレッドシートとExcelで違いはありますか
意味は同じです。復元の方法が違います。 スプレッドシートは「ファイル → 版の履歴」で自動保存された版に戻れます。 Excelは自動保存が有効な場合のみ「バージョン履歴」が使えます。 無効なら、保存前であれば閉じずに Ctrl+Z を続けるしかありません。
実際の表で追ってみる
次のような集計シートがあったとします。
| セル | 元の数式 | C列を削除した後 |
|---|---|---|
| E2 | =SUM(C2:C100) | =SUM(#REF!) |
| E3 | =AVERAGE(C2:C100) | =AVERAGE(#REF!) |
| E4 | =VLOOKUP(A2,A2:D100,3,FALSE) | =VLOOKUP(A2,A2:C100,3,FALSE) |
| E5 | =B2+C2 | =B2+#REF! |
注目してほしいのは E4 です。#REF! になっていません。 範囲が1列縮んだだけで、3列目という指定はそのまま残りました。 つまりエラーは出ないのに、別の列の値を返しています。
#REF! が出たときは、出ていないセルも疑ってください。 列を消すと、列番号で引いている数式は静かにずれます。
壊れた場所をまとめて洗い出す
Googleスプレッドシートの場合
- Ctrl+F を押し、検索窓の右の「…」を開く
- 「検索」を数式内も検索に切り替える
#REF!で検索し、件数を見る- 「ファイル → 版の履歴 → 版の履歴を表示」で、壊れる前の版を探す
Excelの場合
- Ctrl+F → オプション → 検索対象を「数式」にする
#REF!で「すべて検索」- 一覧をクリックすると該当セルへ移動する
- 自動保存が有効なら、ファイル → 情報 → バージョン履歴
件数を控えてから直し始めてください。 途中で分からなくなったとき、いくつ残っているかが分かります。
参照が消えても壊れない作りにする
名前付き範囲にする
スプレッドシートは「データ → 名前付き範囲」、Excelは「数式 → 名前の定義」。
単価表 のような名前を付け、数式では
=VLOOKUP(A2,単価表,2,FALSE) と書きます。
名前の定義が残るので、範囲がまるごと #REF! に化けることが減ります。
テーブルにする(Excel)
Ctrl+T で表をテーブルにすると、
=SUM(テーブル1[金額]) のように列名で参照できます。
列を挿入しても削除しても、名前で追随します。
見出しから列番号を出す
VLOOKUPを使い続けるなら、3列目という数字を書かずに、
=VLOOKUP(A2,$F$1:$J$100,MATCH("単価",$F$1:$J$1,0),FALSE)
のように MATCH で見出しから探します。
列が増えても減っても、見出しさえ変わらなければ動きます。
共同編集での予防
- 集計用のシートを保護し、編集できる範囲を入力欄だけにする
- 行や列の削除ではなく、非表示か、不要フラグの列で運用する
- 元データと集計を別シートに分け、元データ側だけを触る決まりにする
- 大きな整理をする前に、シートを複製しておく
「消していいですか」と聞ける相手がいない環境ほど、 消せない作りにしておく価値があります。
直った後に確認すること
- 数式検索で
#REF!の件数が0になっているか - エラーが出ていない数式も、正しい列を指しているか (列番号で引いている数式は静かにずれます)
- 合計や件数が、壊れる前の値と一致するか
- 同じ操作で再発しない作りに変えたか
IMPORTRANGE で起きる場合(スプレッドシート)
IMPORTRANGE は、別のスプレッドシートから範囲を持ってきます。
ここで出る #REF! は、セルを消したわけではないことが多く、
原因はほとんどがアクセス許可です。
よくある3つ
- 初回の許可をしていない:セルをクリックすると 「アクセスを許可」というボタンが出ます。押すまで #REF! のままです。
- 参照先の共有設定が変わった:相手が共有を外すと、 翌日から突然 #REF! になります。数式は正しいままです。
- 参照先のシート名が変わった:
IMPORTRANGE(URL,"4月!A1:D100")のシート名部分は文字列なので、 名前を変えると一致しなくなります。
切り分け方
参照先のURLを直接ブラウザで開いてください。
開けないなら権限、開けるならシート名か範囲の指定です。
URLはセルに置いて =IMPORTRANGE($A$1,"…") と参照する形にしておくと、
URLが変わったときに1か所直すだけで済みます。
ピボットテーブルやグラフが壊れる場合
元の表から列を消すと、その列を使っていたピボットテーブルは 項目を失い、グラフは系列が空になります。 セルには #REF! が出ないので、気づくのが遅れます。
確認の順番
- ピボットテーブルを右クリック → 更新。 消えた項目が「フィールドリスト」から無くなっていないか見る
- グラフを選び、データ範囲を確認する。
範囲に
#REF!が入っていれば、そこで壊れている - 元の表をテーブル(Excelは Ctrl+T)にしておくと、 行の増減にはピボットが自動で追随する
#REF! を出さずに列を消す手順
消す前に、その列が使われていないことを確かめます。
- 消したい列の文字(例:C)を控える
- Ctrl+F を開き、検索対象を「数式」にする
C:C、$C$、C2の3通りで検索する- ヒットが0なら消してよい。ヒットしたら、その数式を先に書き換える
- 不安なら、消す前にシートを複製しておく
VLOOKUPの列番号は検索に引っかかりません。
範囲に消したい列が含まれている数式は、列番号も見直してください。
=VLOOKUP(A2,A:D,3,FALSE) でC列を消すと、
エラーは出ないまま4列目だったものが3列目になります。
壊れたまま気づかない形に注意する
#REF! は目立つので、まだ気づけます。 本当に怖いのは、列がずれてもエラーにならない数式です。
| 書き方 | 列を消したとき |
|---|---|
| =VLOOKUP(A2,A:D,3,FALSE) | エラーは出ず、別の列の値を返す |
| =VLOOKUP(A2,A:D,MATCH(“単価”,A1:D1,0),FALSE) | 見出しを探すので、正しい列を返し続ける |
| =INDEX(D:D,MATCH(A2,A:A,0)) | D列を消せば #REF!。気づける |
| =XLOOKUP(A2,A:A,D:D) | D列を消せば #REF!。気づける |
「エラーが出る書き方」のほうが安全なことがあります。 列番号を数字で書く形は、静かに間違えるという点で分が悪いです。
復旧できなかったときのために
- 月に一度、シートを複製して日付を付けて残す
- 重要な集計は、値だけのスナップショットを別シートに保存する
- スプレッドシートの版の履歴は「名前を付けて保存」でき、 名前を付けた版は自動削除されない
- Excelはブックを閉じると取り消し履歴が消える。 大きな整理の前に別名で保存する
この3つのエラーは、どこが違うのか
見た目は同じ「エラー」でも、原因の層が違います。ここを取り違えると、 直らない場所をいくら触っても直りません。
| エラー | 壊れている場所 | まず見るところ |
|---|---|---|
| #N/A | 探した値が、探した範囲に無い | 検索値の表記ゆれ、範囲の指定 |
| #REF! | 参照先そのものが消えた | 直前に消した行・列・シート |
| #VALUE! | 渡した値の種類が合わない | 数値のはずのセルに入っている文字 |
7種類すべての一覧は スプレッドシートのエラー一覧 にまとめています。
エラーを消す前に
IFERROR で包めば表示は消えます。ただし 原因は残ったままです。 金額や件数の集計で使うと、本来あるはずの数字が静かに欠けます。
消してよいのは「エラーが出るのが正常な場合」だけです。 たとえば、まだ入力していない行が空欄でエラーになる、といった場面です。 それ以外は、消す前に原因を潰してください。