Google スプレッドシートでセルに #REF! が出て、カーソルを合わせると「循環依存関係が検出されました」と表示される。これは、数式が自分自身の計算結果を、直接または別のセル経由で参照していることを知らせるエラーです。
結論から言うと、ほとんどのケースは参照範囲に数式を置いたセル自身が含まれているのが原因で、範囲を1行・1列ずらすだけで直ります。「反復計算」をオンにするとエラー表示は消えますが、それは直したのではなく循環を許可しただけなので、意図して循環させる場合以外はおすすめしません。
この記事では、Sheets でどのセルが循環しているかを探す手順、原因パターン別の直し方、反復計算をあえて使う場合の注意点を順に説明します。Excel をお使いの方は、操作がまったく違うのでエクセルで循環参照の警告が消えないときの探し方をご覧ください。
「循環依存関係が検出されました」とは何のエラーか
循環依存関係(循環参照)とは、たとえばセル A10 に =SUM(A1:A10) と書いたような状態です。A10 の答えを出すには A10 自身の値が必要になり、計算がいつまでも終わりません。Sheets はこれを検出すると、計算をやめてセルを #REF! にします。
Google のスプレッドシート API のリファレンスでは、反復計算の設定が無い場合について「循環参照は計算エラーになる」と説明されています(Google Sheets API リファレンス:SpreadsheetProperties)。つまり初期状態のシートでは、循環は必ずエラーとして表に出るということです。
エラー文言は公式ヘルプに逐語の記載がない
#REF! にカーソルを合わせたときに出る説明は、日本語の画面では「循環依存関係が検出されました。反復計算を有効にするには…」のように、設定画面へ誘導する文が続くのが一般的です。ただし、この文言そのものは Google の公式ヘルプに逐語では記載されておらず、表示はバージョンや言語設定で変わることがあります。本記事でも、文言は「一般的にこう表示される」という扱いにとどめています。
原因パターン別の比較表(よくある5つ)
実務で循環依存関係エラーに出会う場面は、ほぼ次の5パターンに収まります。まずは自分のシートがどれに近いかを当てはめてみてください。
パターン | よくある例 | 見つけやすさ | 直し方の方向 |
|---|---|---|---|
① 自分自身を含む範囲指定 | A10 に | 易しい(数式を見ればすぐ分かる) | 範囲の終わりを1つ手前(A1:A9)にする |
② 列全体の参照を同じ列に置く | A1 に | 中(「列全体」が自分を含むと気づきにくい) | A2:A のように開始行をずらすか、別の列・別シートで集計する |
③ ARRAYFORMULA・FILTER の出力先と参照範囲の重なり | C1 に | 中〜難(展開先が見えにくい) | 参照する列と出力する列を分ける |
④ 別のセル・別シートを経由した間接循環 | Sheet1!B2 → 集計!C5 → Sheet1!B2 | 難(1つの数式を見ても分からない) | 計算の流れを「入力→計算→集計」の一方向に揃える |
⑤ 意図的な循環(入力時刻の固定など) | C2 に | 易しい(作った本人は分かっている) | 反復計算をオンにするか、別の方法に置き換える(後述) |
①と②で全体の大半を占めます。「最近だれかが合計行を足した」「列ごと参照する数式を見出しに置いた」直後にエラーが出たなら、まずこの2つを疑うのが近道です。
どのセルが循環しているかを探す手順
Excel には[数式]タブから循環参照のセルを一覧で辿る機能がありますが、Google スプレッドシートには同じような循環セルの一覧機能が公式ヘルプに見当たりません。そのため、次の順番で人の目で絞り込むのが現実的です。
- #REF! のセルを1つ選び、数式バーを見る。数式をクリックすると、参照している範囲がシート上に色付きの枠で表示されます。その枠の中に、数式を書いたセル自身が入っていないかを確認します。
- Ctrl+~(Mac も Ctrl+~)で「すべての数式を表示」に切り替える。値ではなく数式がセルに並ぶので、合計行や見出しに紛れた数式を一覧で見渡せます(Google スプレッドシートのキーボード ショートカット)。
- 検索と置換(Ctrl+H)で「数式内も検索」にチェックを入れ、「A:A」のような列全体の参照を探す。パターン②の候補が一気に見つかります(スプレッドシートの検索と置換)。
- エラーの「出発点」を探す。循環に巻き込まれたセルを参照しているセルも連鎖して #REF! になるため、エラーが多数出ていても原因は1〜2セルということがよくあります。直近に編集したセル、合計行、ARRAYFORMULA を置いたセルから順に見ます。
- それでも見つからなければ、疑わしい数式を一時的に値に置き換えて切り分ける。コピーして「値のみ貼り付け」で数式を止め、エラーが消えればそのセルが循環の輪の一部です。確認後は Ctrl+Z で元に戻します。
手順4の「出発点探し」が一番時間を食う工程です。現場で多いのは、エラーが表全体に広がって見えて慌てたものの、原因は見出し行に置いた1つの COUNTA だった、というパターンです。
原因別の直し方
自分自身を含む範囲・列全体参照(①②)を直す
範囲の終わりを、数式を置いたセルの1つ手前で止めます。A10 の合計なら =SUM(A1:A9) です。列全体を集計したい場合は、数式を集計対象の外に出します。
- 見出しの1行目に集計を置きたい:
=SUM(A2:A)のように開始行を2行目にする - 同じ列の一番下に合計を置きたい:データ行が増えるたびに範囲がずれるので、合計は別の列か「集計」シートへ移す
ARRAYFORMULA・FILTER の重なり(③)を直す
ARRAYFORMULA や FILTER は、数式を書いたセルから下や右へ結果を展開します。その展開先が参照範囲と重なると、自分の出力を自分で読み込む形になり循環します。参照する列(入力)と出力する列を必ず分けるのが原則です。展開そのものがうまくいかない場合は、ARRAYFORMULA が1行しか展開されないときの原因もあわせて確認してください。
別シート経由の間接循環(④)を直す
シートが増えると、「入力シートが集計シートの値を参照し、集計シートが入力シートを集計する」という往復が生まれやすくなります。直し方は、シートの役割を入力 → 計算 → 集計の一方向に決め、上流のシートが下流のシートを参照しないようにすることです。
なお、別ファイルを IMPORTRANGE で取り込み合う構成がどう扱われるかは、公式ヘルプに明記がありません。公式に書かれているのは「ImportRange の再計算は30分ごと」という点だけです(スプレッドシートの地域と計算の設定を変更する)。ファイル同士で値を往復させる設計そのものを避けておくのが安全です。
私たちは、こうした数式の事故が起きにくいように、スプレッドシートを入力画面つきの社内アプリへ作り替えるお手伝いもしております。記事の途中で恐縮ですが、同じ壊れ方を何度も直している方は、よろしければ一度のぞいてみてください。
意図的な循環参照(反復計算)と事故の見分け方
循環参照は、いつも悪者というわけではありません。ローンの返済表のように前回の結果を使って計算を繰り返したい場合や、入力した時刻をその場で固定したい場合には、あえて循環させて「反復計算」で解く方法があります。
見分けるポイント | 意図的な循環 | 事故の循環 |
|---|---|---|
作った人が説明できるか | できる(目的と止まる条件がある) | できない・気づいていない |
循環しているセルの数 | 決まった1〜数セル | 連鎖して広範囲が #REF! |
出たタイミング | 作った最初から | 行追加・列追加・数式コピーの直後 |
対応 | 反復計算を設定する(または別の方法へ) | 範囲や構成を直す。反復計算はオンにしない |
反復計算をオンにする場所
計算に関する設定は、公式ヘルプのとおり[ファイル]→[設定]→[計算]タブにあります(スプレッドシートの地域と計算の設定を変更する)。反復計算の項目もこのタブの中にあり、オンにすると「最大反復回数」と「しきい値」を指定できます。
ただし、現在の日本語版ヘルプのこのページには計算モード(自動・手動)の説明しかなく、反復計算の項目名や選択肢の日本語表記は公式に逐語の記載がありません。反復計算の設定自体は2016年12月の Google 公式ブログで、最大回数と収束のしきい値を指定できる機能として告知されています(Google Workspace Updates:New iterative calculation settings)。画面の表記は版によって異なる可能性があります。
既定値は、Apps Script の公式リファレンスに「反復計算を有効にしたとき、最大回数と収束しきい値が未設定ならそれぞれ50と0.05になる」とあり、最大回数は1〜10,000の範囲で指定します(Apps Script リファレンス:Class Spreadsheet)。
入力時刻を固定する「循環参照テク」の仕組み
B列に何か入力したら、C列にその時刻を残したい。そんなときに使われるのが、C2 に次の数式を置く方法です。
=IF(B2="","",IF(C2="",NOW(),C2))
C2 が空のときだけ NOW() を入れ、いったん時刻が入ったあとは C2 自身の値を返し続けるので、NOW() が再計算されても時刻が動きません。C2 が自分を参照しているため、反復計算をオンにしないと #REF! になります。NOW などの揮発性関数は、シートに変更があるたびに再計算される関数です(公式ヘルプ)。
便利な一方で、数式を貼り直したり、列をコピーしたりすると時刻が付け直されることがあり、記録として信頼できるかは運用次第です。記録を確実に残したいなら、手入力のショートカット「日付と時刻を挿入」(Ctrl+Alt+Shift+;)を使うか、Apps Script で編集時に値として書き込むほうが壊れにくいと私たちは考えています。
反復計算をオンにするリスク(共有シートでの注意)
- ほかの事故の循環も黙って通る。エラーが表示されなくなるので、あとから誰かが作った誤った循環にも気づけなくなります。これが最大のリスクです。
- 設定はスプレッドシート単位。API では反復計算はスプレッドシートのプロパティ(ファイルごとの設定)として定義され、Apps Script でも「このスプレッドシートで有効にするか」を設定する形です。個人の環境設定ではなくファイル側の設定なので、共同編集者が開いても同じ設定で計算されると考えるのが自然です。逆に、そのファイルをコピーしたり、数式だけを別のファイルへ移したりした場合の扱いは公式に記載が見当たらないため、移した先で設定を確認してください。
- 結果が回数としきい値に左右される。収束しない計算では、最大回数で打ち切られた途中の値が表示されます。財務計算に使うなら、検算の手段を別に持っておきます。
実務の目安としては、反復計算をオンにするのは「意図的な循環が1か所だけあり、それを作った人がシートを管理している」場合に限るのが安全です。多くの人が触る共有シートでは、オフのままにしておくことをおすすめします。
何度も壊れる共有シートなら作り替えも選択肢
循環依存関係エラーは、1回直せば終わることがほとんどです。ただ、行を足すたび・誰かが数式をコピーするたびに同じエラーが出る共有シートは、入力する場所と計算する場所が同じシートに混ざっていることが根本の原因になっています。数式を消されたり上書きされたりする事故も同じ根から起きるので、共有シートで数式が上書きされるのを防ぐ方法で入力欄と計算欄を分けるだけでも、かなり落ち着きます。
それでも人数や行数が増えて手に負えなくなってきたら、スプレッドシートの延命より、入力画面を別に用意する作り替えのほうが早い段階に来ているかもしれません。どこが分かれ目になるかは、スプレッドシート管理の限界とアプリ化を考えるタイミングで、費用感も含めて整理しています。
よくある質問
スプレッドシートの「循環依存関係が検出されました」はどうすれば消えますか?
数式が自分自身の結果を参照している箇所を直せば消えます。多いのは、合計セル自身を含む範囲指定や、A1にSUM(A:A)のように列全体を同じ列で集計しているケースです。範囲の終わりを1つ手前にするか、集計を別の列・別シートへ移してください。
循環しているセルはどうやって探せばいいですか?
Google スプレッドシートには循環セルを一覧で辿る機能が公式ヘルプに見当たらないため、#REF!のセルの数式をクリックして参照範囲の色枠を確認し、Ctrl+~で全数式を表示、検索と置換で「数式内も検索」をオンにしてA:Aのような列全体参照を探す、の順で絞り込みます。
反復計算をオンにすればエラーは解決しますか?
エラー表示は消えますが、循環を許可しただけで原因は残ります。ほかの誤った循環にも気づけなくなるため、意図して循環させるセルがある場合以外はオフのままにすることをおすすめします。
反復計算の設定は共有相手にも効きますか?
Google の API や Apps Script では反復計算はスプレッドシートごとの設定として扱われているため、個人の環境設定ではなくファイル側の設定です。ファイルのコピーや別ファイルへ数式を移した場合の扱いは公式に記載が見当たらないので、移した先で設定を確認してください。
入力した時刻を固定する数式はなぜ循環参照になるのですか?
=IF(B2="","",IF(C2="",NOW(),C2)) のように、C2がC2自身の値を返す仕組みで時刻を止めているためです。反復計算をオンにしないと#REF!になります。確実に記録したい場合は、日付と時刻を挿入するショートカットやApps Scriptで値として書き込む方法が壊れにくいです。