エクセルで数式を入れたら、セルに「#スピル!」(英語版は「#SPILL!」)と出て結果が表示されない。このエラーは原因が1つではなく、Microsoft の公式ヘルプでは7種類に分けて説明されています。直し方は種類ごとにまったく違うので、まず「どの種類か」を見分けるのが一番の近道です。この記事では、エラーセルの警告アイコンから種類を確かめる手順と、種類別の直し方を比較表で逆引きできるように整理しました。
結論:#スピル!は「結果を並べる場所がない」エラー。原因の種類を見てから直す
#スピル!エラーは、1つの数式が複数の結果を返そうとしたのに、Excel がその結果をセルに並べられないときに出ます。Microsoft のヘルプでは、数式が複数の結果を返すのにグリッドへ返せない場合のエラーと説明されています。複数の結果が隣のセルへ自動で広がる動きを「スピル」と呼び、広がる先の範囲を「スピル範囲」と呼びます。
一番多いのは、スピル範囲に何か入力済みのセルが残っているケースです。この場合は、エラーのセルを選んで警告アイコンから「障害物セルの選択」を押し、そのセルの中身を消すか移動すれば、すぐに結果が広がります。それ以外の6種類(結合セル・テーブル内・シートの端・サイズ不定・メモリ不足・原因不明)は、消すだけでは直らないので下の比較表で当てはまるものを探してください。
なお、Google スプレッドシートで「配列の結果が展開されると…」と出て止まる場合は仕組みが別です。そちらはスプレッドシートでARRAYFORMULAが1行しか出ない時の対処で扱っています。
スピルエラーの種類を確かめる手順
種類は、エラーのセルに付く警告アイコンから確認できます。手順は次の3つです。
- #スピル!が出ているセルを1つ選ぶ(スピルしようとした範囲が破線の枠で表示されます)
- セルの横に出る警告アイコン(!マーク)を押す
- 開いたメニューの一番上に出ている、エラーの種類を読む
破線の枠は「本来ここまで結果が広がるはずだった範囲」です。枠の中に文字や数値が入ったセル、結合セル、テーブルが含まれていないかを見るだけでも、原因のあたりがつきます。
注意点として、メニューに出る種類名の日本語表記は、公式ヘルプの見出しと一字一句同じとは限りません。たとえば検索でよく使われる「スピル範囲が空白ではありません」という言い回しは、公式ヘルプ(日本語版)では「スピル範囲が空ではない」という見出しで書かれており、ヘルプ上に逐語の記載はありません。表示は Excel のバージョンや翻訳の更新で変わることがあるので、下の表では公式ヘルプの日本語見出しと英語版の見出しを並べ、近い言い回しから引けるようにしています。
スピルエラーの原因7種と見分け方の比較表
公式ヘルプが挙げている7種類を、見分けるポイントと最初にやることで並べました。英語版の Excel を使っている場合は英語の見出しが手がかりになります。
公式ヘルプの見出し(日本語版) | 英語版の見出し | 見分けるポイント | 最初にやること |
|---|---|---|---|
スピル範囲が空ではない | Spill range isn't blank | 破線の枠の中に、値・空白文字・数式が入ったセルがある | 「障害物セルの選択」で該当セルへ飛び、中身を消すか移動する |
結合されたセルにスピルする | Spill into merged cells | 破線の枠の中に結合セルがある | セルの結合を解除するか、結合セルと重ならない場所へ数式を移す |
テーブルの数式 | Table formula | 数式を入れたセルが「テーブル」の中にある | 数式をテーブルの外へ移すか、テーブルを範囲に変換する |
ワークシートの端を超えて拡大する | Extends beyond the worksheet's edge | A:A のような列全体の参照を使い、結果がシートの最終行を超える | 参照を必要な行だけに絞るか、@ 演算子で1つの値に絞る |
不確定なサイズ | Indeterminate size | RAND・RANDARRAY・RANDBETWEEN で結果の件数が毎回変わる | 件数を決める部分から乱数の関数を外す |
メモリが不足している | Out of memory | 参照している範囲や配列が非常に大きい | より小さい範囲を参照するように書き直す |
認識されない/フォールバック | Unrecognized/Fallback | 上のどれにも当てはまらない | 数式に必要な引数がすべて入っているかを確かめる |
実務で問い合わせを受けると、7種類のうち大半は上の3つ(空でない・結合セル・テーブル)です。特に、他の人が作ったブックに後から数式を足したときに起きやすく、見た目では空に見えるセルにスペースや数式の残りが入っていることがよくあります。
原因別のスピルエラーの直し方
スピル範囲が空白ではないときの直し方
警告アイコンのメニューで「障害物セルの選択」を押すと、邪魔をしているセルへ移動します。そのセルの中身を削除するか別の場所へ移すと、その時点で数式の結果が広がります。公式ヘルプでも、障害物がなくなるとすぐに配列数式がスピルすると説明されています。
見た目は空なのに障害物になるセルには、半角や全角のスペース、空の文字列を返す数式(="" など)、白い文字で入力された値があります。「何も入っていないはずなのに直らない」ときは、そのセルを選んで数式バーを確かめてください。
結合セルが原因のときの直し方
公式ヘルプのとおり、スピルする数式は結合セルの上には結果を広げられません。直し方は、該当セルの結合を解除するか、結合セルと重ならない範囲へ数式を移すかのどちらかです。見た目のために結合を残したい場合は、結合ではなく「選択範囲内で中央」の配置を使うと、スピルとの衝突を避けられます。
結合セルはスピル以外にも、並べ替えやフィルターの失敗を引き起こします。並べ替えで同じように止まっている場合は結合セルが原因で並べ替えできない時の対処もあわせて確認してください。
テーブル内でスピルしないときの直し方
Excel の「テーブル」の中では、スピルする数式は使えません。公式ヘルプでは、数式をテーブルの外へ移すか、テーブルを範囲に変換する方法が案内されています。変換する場合は[テーブル デザイン]→[ツール]→[範囲に変換]を選びます。
テーブルの便利さ(行の追加に合わせて参照が自動で伸びる)を残したいときは、テーブルはそのままにして、スピルする数式だけをテーブルの外の列に置き、テーブルを構造化参照で読む形がおすすめです。公式ヘルプでも、動的配列の数式はテーブルの外に置き、データ側をテーブルにして構造化参照で参照する使い方が紹介されています。
実務で多い3つの原因は、ここまでの直し方でたいていその場で解決できます。ただ、同じブックを何人もで触っていると、誰かが空いたセルにメモを書いたり、見た目のためにセルを結合したりして、直してもまた壊れることがあります。私たちは、こうした壊れやすい共有の表を、入力欄と集計を分けたアプリの形に作り替えるお手伝いもしています。記事の途中で恐縮ですが、同じ悩みが続いている方の参考になればと思いますので、よろしければご覧ください。
シートの端を超えるときの直し方(列全体の参照)
公式ヘルプの例では、セル E2 に =VLOOKUP(A:A,A:C,2,FALSE) と入れると、Excel が A 列全体を検索値として扱い、1,048,576件の結果を返そうとしてシートの最後まで届いてしまいます。以前の Excel では同じ数式が「その行の値だけ」を見ていたので、古いブックを最新の Excel で編集したときに出やすいエラーです。
公式ヘルプが示す直し方は3つあります。
直し方 | 数式の例 | テーブル内で使えるか | 結果が広がるか |
|---|---|---|---|
必要な範囲だけを参照する | =VLOOKUP(A2:A7,A:C,2,FALSE) | 使えない | 広がる |
同じ行のセルだけを参照して下へコピーする | =VLOOKUP(A2,A:C,2,FALSE) | 使える | 広がらない |
@ 演算子で1つの値に絞って下へコピーする | =VLOOKUP(@A:A,A:C,2,FALSE) | 使える | 広がらない |
「スピルを解除して、昔のように1セルに1つの値だけ出したい」という場合は、2つ目か3つ目の書き方にすると、結果が隣のセルへ広がらなくなります。
サイズが決まらないときの直し方(乱数の関数)
=SEQUENCE(RANDBETWEEN(1,1000)) のように、結果の件数そのものが計算のたびに変わる数式は、Excel が広げる範囲の大きさを決められず #スピル!になります。公式ヘルプでは、このエラーは主に RAND・RANDARRAY・RANDBETWEEN の使用に関係すると書かれています。
一方で、OFFSET・INDIRECT・TODAY のような揮発性の関数は、計算のたびに違う値を返すわけではないので、このエラーの原因にはなりにくいと説明されています。件数を決める部分には乱数を使わず、固定の数や別セルの値を参照する形に変えてください。
メモリ不足・原因不明のときの直し方
「メモリが不足している」は、スピルさせようとした配列が大きすぎるときに出ます。参照範囲を必要な行・列に絞るのが基本です。「認識されない/フォールバック」は、Excel 自身が原因を特定できないときの表示で、公式ヘルプでは数式に必要な引数がそろっているかの確認が案内されています。
どちらも、数式を小さく分けて1つずつ確かめると原因が見つかりやすくなります。そもそも再計算が止まっている疑いがあるときは、エクセルの数式が計算されない原因で計算方法の設定も確認しておくと安心です。
古い Excel(2019以前)で開いたときの挙動と @ 演算子
結果が隣のセルへ自動で広がる「動的配列」は、Microsoft 365 の最新チャネルで2020年1月に一般提供された仕組みです。FILTER 関数の公式ページでも、対応するバージョンとして Microsoft 365・Excel 2024・Excel 2021 などが挙がっており、Excel 2019 は含まれていません。そのため、同じブックを新旧の Excel で開くと、表示や動きが変わります。
新しい Excel で古い数式に @ が付く理由
以前の Excel で作った数式を動的配列に対応した Excel で開くと、数式の先頭などに「@」が付くことがあります。これは公式ヘルプで「共通部分演算子」と呼ばれるもので、古い Excel が見えないところで行っていた「暗黙的な共通部分(複数の値から、数式のある行の値だけを取り出す処理)」を目に見えるようにした記号です。計算結果は変わりません。
公式ヘルプの例では、=A1:A10 は =@A1:A10 と表示され、=INDEX(A1:A10,B1) は =@INDEX(A1:A10,B1) と表示されます。@ は多くの場合削除できますが、削除するとその数式は複数の結果を返す数式として扱われ、スピル範囲が空いていなければ #スピル!になります。古い挙動のまま使いたいなら、@ は残しておくのが無難です。
動的配列の数式を古い Excel で開いた場合
新しい Excel で作ったスピルする数式は、古いバージョンの Excel では従来の配列数式(Ctrl+Shift+Enter で入れる、中かっこ { } で囲まれた数式)として表示されます。公式ヘルプによると、見た目の結果はほぼ同じですが、範囲の大きさが自動で変わらず、スピルの枠線も出ません。元データの行数が増えても結果が伸びないので、古い Excel の利用者がいる共有ブックでは注意が必要です。
また、配列の計算と @ を1つの数式に混ぜた場合、古い Excel では数式が _xlfn.SINGLE() という形で表示され、#NAME? エラーになると公式ヘルプに書かれています。新旧の Excel が混在する職場では、互換性チェックで該当する数式を事前に探しておくのが確実です。
何度も壊れる共有ブックは作り替えも選択肢
スピルエラー自体は、原因さえ分かれば数分で直せるエラーです。問題になるのは、直しても同じブックで何度も起きるときです。実務で見ていると、次のような状態がそろうと再発しやすくなります。
- 集計の数式と、人が手で入力する欄が同じシートの近くにある
- 見た目を整えるためのセル結合が多い
- Microsoft 365 と古い買い切り版の Excel を使う人が混在している
- ブックの作り方を知っている人が社内に1人しかいない
この状態なら、まずは入力用のシートと集計用のシートを分けるだけでも再発はかなり減ります。それでも月に何度も直す手間が出ているなら、表計算のまま運用し続けるか、入力画面と集計を分けたシステムに移すかを比べてみる価値があります。費用の目安と判断のしかたは、脱エクセルの費用相場と判断軸にまとめています。
スピルエラーが一度直れば十分という場合は、作り替える必要はありません。比較表で原因を特定し、その種類に合った直し方をするのが一番早く確実です。
よくある質問
エクセルの#スピル!エラーとは何ですか?
1つの数式が複数の結果を返そうとしたのに、Excel がその結果を隣のセルへ並べられないときに出るエラーです。英語版の Excel では #SPILL! と表示されます。公式ヘルプでは原因が7種類に分けられています。
「スピル範囲が空白ではありません」と出たらどうすればいいですか?
エラーのセルを選び、警告アイコンのメニューから「障害物セルの選択」を押すと、邪魔をしているセルへ移動します。そのセルの中身を消すか移動すれば結果が広がります。見た目は空でもスペースや空の文字列を返す数式が入っていることがあるので、数式バーで確かめてください。なお、この言い回しは公式ヘルプ上では「スピル範囲が空ではない」という見出しで書かれています。
テーブルの中でスピルさせることはできますか?
できません。Excel のテーブル内ではスピルする数式はサポートされていません。数式をテーブルの外へ移すか、[テーブル デザイン]→[ツール]→[範囲に変換]でテーブルを通常の範囲に変換してください。
スピルを解除して1つのセルだけに結果を出したいときは?
同じ行のセルだけを参照して数式を下へコピーするか、=VLOOKUP(@A:A,A:C,2,FALSE) のように @ 演算子を付けて1つの値に絞ります。どちらも結果は隣のセルへ広がりません。
数式に勝手に@が付いたのはなぜですか?
以前の Excel で作った数式を、動的配列に対応した新しい Excel で開いたためです。古い Excel が見えないところで行っていた暗黙的な共通部分を @ で表示しているだけで、計算結果は変わりません。削除すると複数の結果を返す数式として扱われ、#スピル!になることがあります。