※本ページにはプロモーション(広告)が含まれています
Excelで =UNIQUE(A2:A100) や =FILTER(A2:C100, B2:B100>10) といった動的配列数式(スピル)を入力した瞬間、#SPILL! エラーが表示されて結果が一つも返ってこない――この症状に悩まされている方は非常に多いです。せっかく最新のExcel関数を使おうとしているのに、思った通りに動かないと作業が完全に止まってしまいます。
結論から言うと、#SPILL! エラーの原因は8パターンに集約され、そのほとんどは「スピル先のセル範囲に既存データや結合セルが存在する」ことが原因です。さらに、Excel 365、Excel 2021、Excel 2019、Mac版、Web版それぞれで動的配列のサポート範囲が異なるため、「同じファイルでも環境によってエラーになる」ケースも頻発しています。
本記事では、Excel動的配列とスピル機能の正しい仕組みから、#SPILL! エラーの8つの典型パターンと具体的な解決法、結合セルの一括解除、CSE配列との互換性、ファイル形式(.xlsx / .xlsb / .xls)の影響まで、画像と関数例を交えて完全に解説します。読み終わるころには、どんな #SPILL! エラーに遭遇しても、原因を瞬時に特定して解決できるようになっているはずです。
この記事を読むとわかること
- Excelの動的配列(Dynamic Array)とスピルの正しい仕組み
#SPILL!エラーが発生する8つの原因パターンと見分け方- スピル先範囲に既存データがある場合の解決手順(5ステップ)
- 結合セルが干渉しているケースの一括解除方法
- テーブル(ListObject)内で動的配列が使えない理由と回避策
- UNIQUE / SORT / FILTER / SEQUENCE / XLOOKUP / XMATCH 関数の正しい書き方
- Excel 365 / 2021 / 2019 / Mac / Web 版の対応状況とバージョン別の対処
- 従来のCSE配列数式(Ctrl+Shift+Enter)との互換性と書き換えのコツ
- .xlsx と .xlsb、古い .xls ファイルでの動的配列の挙動の違い
- よくある質問7問への明確な回答
動的配列とスピルの仕組み——まず正しく理解する
解決法に入る前に、まず動的配列とスピルが「どう動いているか」を正確に押さえておきましょう。仕組みを理解せずに対処するとエラーが再発しやすいからです。
動的配列(Dynamic Array)とは
動的配列は、1つのセルに入力した数式が複数のセルに自動で結果を展開する仕組みです。従来のExcelでは、1つの数式は1つのセルにしか結果を返せませんでしたが、Excel 365で導入された動的配列により、1つの数式が必要なだけのセル範囲に「あふれて(spill)」結果を表示するようになりました。
たとえば、A2:A100 にある100行の名前リストから重複を除いた一覧を作りたいとき、従来は配列数式や複雑な手順が必要でしたが、動的配列なら次の1行で完了します。
=UNIQUE(A2:A100)
この数式をC2セルに入れるだけで、C2から下方向に重複を取り除いたユニーク値が自動展開されます。これが「スピル」です。
スピル範囲とゴーストセル
スピルした結果セル群はスピル範囲(Spilled Range)と呼ばれ、青い枠線で囲まれた状態で表示されます。先頭セル(数式が実際に入っているセル)を「アンカーセル」、その他の表示セルを「ゴーストセル」と呼びます。
ゴーストセルをクリックすると、数式バーには元の数式が灰色で表示されます。これは「このセル自体には数式は入っていないが、別のセルから流れてきた結果である」ことを示しています。
スピル参照(#演算子)
スピル範囲全体を参照するには、アンカーセル名の後ろに # を付けます。
=COUNTA(C2#)
=SORT(C2#)
=FILTER(D2:F100, C2#="営業部")
スピル範囲のサイズが変わっても C2# は自動で追従するため、メンテナンス性の高い数式を組めるのが動的配列の最大のメリットです。
#SPILL! エラーが出る根本理由
動的配列の仕組みからわかるとおり、Excelは「結果を返したい範囲」を計算で決定します。その範囲のどこか1セルでも空けることができない場合、結果を返す場所がなくなりエラーになる――これが #SPILL! の本質です。「あふれられない」という意味で、エラーメッセージも英語では「Spill range isn’t blank」「Spill range is too big」など、状況に応じた具体的な文言で表示されます。
#SPILL! エラーの8つの原因パターン
ここからが本題です。#SPILL! エラーを引き起こす典型的な8パターンを、原因の発生頻度が高い順に解説します。エラーセルをクリックすると左側に黄色い警告マークが表示されるので、それをクリックしてエラー詳細メッセージを確認してから、該当パターンを照合してください。
パターン1: スピル先セルに既存データがある
最も多い原因。動的配列があふれようとしている範囲のセルに、すでに文字・数値・数式・空白文字(半角スペース)などが入っている状態です。Excelは既存データを上書きしないため、結果を返せず #SPILL! となります。エラーメッセージは「Spill range isn’t blank(スピル範囲が空白ではない)」。
パターン2: スピル範囲に結合セルがある
スピル先に結合セルが1つでもあると、Excelは結合セル領域に整然と値を配置できないため #SPILL! を返します。エラーメッセージは「Spill range has merged cells(スピル範囲に結合セルがあります)」。結合セルは動的配列の最大の天敵です。
パターン3: Excelテーブル(ListObject)内に入力
「ホーム」→「テーブルとして書式設定」で作成したExcelテーブルの中に動的配列数式を入れると #SPILL! になります。テーブルは「1行=1レコード」の構造を維持するため、複数行にあふれることを許可しない仕様です。
パターン4: スピル範囲が大きすぎる
=A:A*2 のように列全体を参照する数式を、空きセルに入力すると、約100万行に値をスピルしようとしてメモリ不足になります。「Spill range is too big(スピル範囲が大きすぎます)」と表示されます。
パターン5: 揮発性関数(INDIRECT / OFFSET / RAND等)との組み合わせ
スピル範囲のサイズが事前計算できない揮発性関数を参照すると、Excelが安全側に倒して #SPILL! を出すことがあります。「Spill range is unknown(スピル範囲が不明)」。
パターン6: 古いExcelバージョンで非対応関数を使用
Excel 2019 や Excel 2016 では、UNIQUE / FILTER / SORT / SEQUENCE / XLOOKUP などの動的配列ネイティブ関数自体が存在しません。これらを使ったファイルを古いExcelで開くと、#NAME? や #SPILL! として表示されます。
パターン7: ファイル形式が古い(.xls)
拡張子 .xls(Excel 97-2003形式)のファイルでは、動的配列は使用できません。ファイルを .xlsx や .xlsb に変換する必要があります。
パターン8: Mac版/Web版の機能制限
Mac版Excelは概ね対応していますが、一部のオプション機能(Sequence のステップなど)で挙動が異なることがあります。Web版(Excel for the web)も対応はしていますが、Windows版と比べて表示反映が遅延することがあります。

#SPILL!エラーの解決手順——パターン別の具体的対処
原因が特定できたら、ここからの手順で順番に対処すれば100%解決できます。
解決1: スピル先のセルを空にする(パターン1の対処)
もっとも基本的かつ重要な手順です。次の5ステップで進めます。
- エラーセルをクリックし、左側の黄色いひし形マークをクリック
- 「スピル範囲を選択」をクリック——これでスピルできなかったセル範囲全体が選択されます
- 選択範囲のセルを目視で確認。空白に見えても半角スペースや改行が入っていることがあるので注意
- 選択したまま
Deleteキーを押す(または「ホーム」→「クリア」→「すべてクリア」) - エラーセルに戻って
F2→Enterで数式を再評価——スピルが復活します
ポイントは「すべてクリア」を使うこと。「内容のクリア」だと書式やコメントが残り、それが原因で再エラーになるケースがあります。
解決2: 結合セルを一括解除する(パターン2の対処)
結合セルを1つずつ探すのは現実的ではありません。次の方法でシート全体の結合セルを一気に検出・解除できます。
Ctrl + Aでシート全体を選択Ctrl + Fで検索ダイアログを開く- 「オプション」を展開し、「書式」→「配置」タブ→「セルを結合する」にチェック
- 「すべて検索」をクリック——結合セルの一覧が表示される
- 一覧で
Ctrl + Aですべての結合セルを選択 - 「ホーム」→「セルを結合して中央揃え」のドロップダウン→「セル結合の解除」
これでシート内のすべての結合セルが解除されます。結合解除後はレイアウトが崩れるので、外観が必要な場合は「選択範囲内で中央」(書式設定→配置→横位置)で代替するのが定石です。
解決3: テーブルを範囲に変換する(パターン3の対処)
Excelテーブル(ListObject)の中では動的配列が使えないため、テーブルの外側で数式を組むか、テーブルそのものを通常の範囲に戻します。
- テーブル内の任意のセルをクリック
- 「テーブルデザイン」タブ→「範囲に変換」
- 確認ダイアログで「はい」
- 通常の範囲に戻ったら、動的配列数式を再入力
表の見た目を維持したい場合は、変換前にコピーしておくか、「テーブルとして書式設定」のスタイルだけ手動で適用し直してください。
解決4: 範囲を限定して指定し直す(パターン4の対処)
列全体ではなく、必要な範囲だけを指定します。
NG: =UNIQUE(A:A)
OK: =UNIQUE(A2:A1000)
データ件数が変動するなら、COUNTA と OFFSET を組み合わせるよりも、充分大きいが現実的な範囲(例: A2:A10000)を指定するのが安全です。
解決5: 入力前にスピル先の余白を確保する
動的配列数式を入れる前に、結果が展開される予想行数分の空行を確保しておけば、スピル時にエラーになりません。たとえば、ユニーク値が最大50件出ると予想されるなら、入力セルから下に50行分の空白を確保してから関数を入れます。
主要な動的配列関数の使い方
動的配列関数を正しく使えば、これまで複雑な配列数式やヘルパー列で対処していた処理が驚くほどシンプルになります。代表6関数を例とともに整理します。
UNIQUE——重複の除去
=UNIQUE(A2:A100)
=UNIQUE(A2:A100, FALSE, TRUE) # 1回だけ出現した値のみ
SORT——並べ替え
=SORT(A2:C100, 2, -1)
# 第2列(B列)を降順で並べ替え
FILTER——条件抽出
=FILTER(A2:C100, B2:B100>10)
=FILTER(A2:C100, (B2:B100>10)*(C2:C100="東京"), "該当なし")
複数条件はAND(積)なら * 、OR(和)なら + で結合します。
SEQUENCE——連番の生成
=SEQUENCE(10) # 1〜10
=SEQUENCE(5, 3) # 5行×3列の連番
=SEQUENCE(12, 1, "2026/1/1", 30) # 月初を30日刻みで
XLOOKUP / XMATCH——VLOOKUPの後継
=XLOOKUP(F2, A2:A100, C2:C100, "該当なし")
=XMATCH(F2, A2:A100, 0, 1)
# モード1: 完全一致、見つからなければ次に大きい値
XLOOKUPは検索値が見つからない場合のデフォルト値(第4引数)、検索モード(第5引数:完全一致・前方一致・ワイルドカード)、検索方向(第6引数:先頭から・末尾から)を細かく指定できます。VLOOKUPの全機能を上位互換で含むと言って差し支えありません。
Excel版別の対応状況
動的配列とスピルの対応はExcelのバージョンによって大きく異なります。「Excel 365を使っているからスピルが動く」と思っても、サブスクリプションのチャネル設定によっては未対応バージョンが配信されていることもあるため、必ず確認してください。
| Excel版 | 動的配列・スピル | UNIQUE/FILTER/SORT | XLOOKUP/XMATCH | SEQUENCE | 備考 |
|---|---|---|---|---|---|
| Excel 365 (Win) | 完全対応 | 対応 | 対応 | 対応 | 常に最新機能 |
| Excel 365 (Mac) | 完全対応 | 対応 | 対応 | 対応 | 一部UI差異 |
| Excel for the web | 対応 | 対応 | 対応 | 対応 | 反映が若干遅い |
| Excel 2021 | 完全対応 | 対応 | 対応 | 対応 | 永続ライセンス版で安定 |
| Excel 2019 | 未対応 | 未対応 | 未対応 | 未対応 | CSE配列で代替必要 |
| Excel 2016以前 | 未対応 | 未対応 | 未対応 | 未対応 | 関数自体が存在しない |
| Excel Mobile | 表示のみ可 | 表示のみ | 表示のみ | 表示のみ | 編集機能制限 |
古いバージョンを併用している場合
社内のチームで Excel 2019 / 365 を混在利用している場合、365で作った動的配列ファイルを2019で開くと _xlfn._xlws. や _xlfn. という接頭辞が関数名に付与されて表示崩れが起きます。これは「この関数は、古いバージョンでは認識されない」というExcelの注意マーカーです。混在環境では、動的配列を避け、従来のCSE配列数式(Ctrl+Shift+Enter)で書き直すか、UNIQUE等の機能をピボットテーブルで代替するのが現実的です。
CSE配列数式との互換と書き換え
Excel 365では、従来のCSE配列数式(Ctrl+Shift+Enterで確定する数式)も引き続き利用できますが、新規入力では動的配列が優先されます。古いCSE配列のファイルを365で開くと、自動でスピル動作に変換されることがあり、レイアウトが崩れて見える原因になることがあります。
CSE配列の見分け方
セルを選択して数式バーを見たとき、数式が {…} の中括弧で囲まれていればCSE配列数式です。これを動的配列に書き換えるときは、中括弧を消して、もし可能ならネイティブな動的配列関数(UNIQUE / FILTER等)を使った形に書き換えるのがおすすめです。
暗黙の共通部分演算子(@)
古いCSE配列を365で開いたとき、自動的に @(at記号)が数式に追加されることがあります。これは「暗黙の共通部分演算子」で、「この数式は1つの値だけを返してください」という指示です。意図的にスピルさせたい場合は、@ を手動で削除すると動的配列としてスピルし直します。
ファイル形式(.xlsx / .xlsb / .xls)の影響
| 拡張子 | 動的配列対応 | ファイルサイズ | 読み書き速度 | 推奨度 |
|---|---|---|---|---|
| .xlsx | 対応 | 標準 | 標準 | ★★★★★(基本これ) |
| .xlsm | 対応 | 標準 | 標準 | ★★★★☆(マクロ含む場合) |
| .xlsb | 対応 | 小さい | 高速 | ★★★★☆(大規模データ向け) |
| .xls | 未対応 | 大きい | 低速 | ★☆☆☆☆(移行推奨) |
| .csv | 関数自体保存不可 | 最小 | 最速 | ★★★☆☆(データ受け渡し用) |
動的配列を使う場合、.xls形式のファイルを受け取ったら最初に「名前を付けて保存」で .xlsx に変換しましょう。.xlsバイナリ形式のまま動的配列を書こうとしても保存時に強制的に削除されるため、編集が無駄になります。
動的配列をうまく使うコツ
エラー対処だけでなく、動的配列を活用するためのベストプラクティスを整理しておきます。
1. スピル範囲は常に「下方向に余裕を持つ」
動的配列はデータ件数の変動に応じてスピル範囲が伸縮するため、「下方向に何も置かない」設計が基本です。動的配列を入れた列はその下に手動データを書かないのが鉄則です。
2. スピル参照を活用する
個別セル参照(C2、C3、C4…)ではなくスピル参照(C2#)を使うと、データ件数が変わっても集計が壊れません。
NG: =SUM(C2:C50)
OK: =SUM(C2#)
3. テーブルと動的配列は併用しない
ListObjectテーブルは「行追加でテーブルが自動拡張する」性質を持ち、動的配列のスピル動作と競合します。動的配列を使うシートではテーブル機能を使わず、通常の範囲で運用するのがトラブル回避の近道です。どうしても両方使いたい場合は、テーブルから値を読み取って、別シートの通常範囲に動的配列で展開する設計にします。
4. INDIRECTを避け、LET関数で代替する
動的配列とINDIRECTの相性は悪いため、LET関数で中間変数を定義する方法が増えています。
=LET(rng, A2:A100, sorted, SORT(rng), UNIQUE(sorted))
5. エラー時はIFERRORでラップ
条件によっては結果が空配列になる場合があるので、IFERROR で包んで挙動を安定させます。
=IFERROR(FILTER(A2:C100, B2:B100="営業部"), "該当なし")
🛒 関連商品をAmazonでチェック
よくある質問(FAQ)
Q1. #SPILL! エラーセルをクリックしても、エラー詳細が表示されません。
セルを選択した状態で左側に表示される黄色いひし形マークをクリックしてください。「エラーチェックオプション」が無効になっている場合は、「ファイル」→「オプション」→「数式」→「エラーチェック」→「バックグラウンドでエラーチェックを行う」にチェックを入れることで表示されるようになります。
Q2. 結合セルを解除したのに、まだ #SPILL! が消えません。
シート全体ではなく、スピル範囲だけで結合セルを再検索してみてください。また、シート保護がかかっていると一部結合セルが解除できないことがあります。「校閲」→「シート保護の解除」を実行してから再度結合解除を行ってください。
Q3. 列全体(A:A)を参照したいのですが、必ず範囲を限定しないとダメですか?
動的配列では「列全体参照」は #SPILL! を誘発しやすいため非推奨です。大きめだが現実的な範囲(A2:A10000等)を指定するか、テーブル名参照(テーブルなら自動拡張)を活用してください。
Q4. UNIQUEで重複除去した結果を、さらに昇順で並び替えたい。
関数をネストするだけです。
=SORT(UNIQUE(A2:A100))
降順なら第3引数に -1 を渡します(=SORT(UNIQUE(A2:A100), 1, -1))。
Q5. 動的配列の結果を別のシートで参照したいです。
スピル参照を別シートでも使えます。たとえば、Sheet1のC2にスピルした結果をSheet2のA1で参照したい場合は =Sheet1!C2# と書きます。スピル範囲のサイズが変わっても自動で追従します。
Q6. Excel 2019で同じことをやるにはどうすればよいですか?
2019ではUNIQUE等のネイティブ動的配列関数が存在しないため、従来のCSE配列数式(Ctrl+Shift+Enterで確定する {=INDEX(IF(…))} 形式)で代替するか、ピボットテーブルを使ってください。重複除去なら「データ」→「重複の削除」、ソートなら「並べ替え」機能、フィルターなら「オートフィルター」で代用するのが実用的です。
Q7. 同じファイルを共同編集していて、相手から「#SPILL! が出る」と言われました。私の環境では出ません。
相手のExcelバージョンが古い可能性が高いです。「ファイル」→「情報」→「互換性チェック」を実行すると、相手のバージョンで動かない機能が一覧表示されます。動的配列に依存しない形に書き換えるか、相手のExcelバージョンを365/2021に更新してもらってください。
Q8. Excel for the webで動的配列が反映されないことがあります。
ブラウザのキャッシュが原因のことが多いです。Ctrl + F5(スーパーリロード)でページを再読み込みするか、別のブラウザ(Chrome / Edge / Firefox)で開き直してください。同時編集中はリアルタイム更新の競合で表示が一時的に遅延することもあります。
まとめ
Excelの動的配列とスピル機能で #SPILL! エラーが出る原因は、9割以上が「スピル先のセルに既存データまたは結合セルがある」ことに起因します。本記事で解説した8パターンの原因を順に確認し、エラーセルの黄色マークから詳細メッセージを読めば、どんな #SPILL! でも10分以内に解決できるはずです。
重要なポイントを最後におさらいします。
#SPILL!エラーは「結果を返す場所がない」というExcelからのメッセージ- 原因8パターンのうち、最頻出は「スピル先の既存データ」と「結合セル干渉」
- 結合セルは Ctrl+F→書式→セルを結合する→すべて検索→Ctrl+A→結合解除の流れで一括処理
- Excelテーブル(ListObject)の中では動的配列が使えない——範囲に変換する
- 動的配列に対応するのは Excel 365 / Excel 2021 / Mac版 / Web版、2019以前は非対応
- UNIQUE / SORT / FILTER / SEQUENCE / XLOOKUP / XMATCH は従来関数の上位互換
- スピル参照(
C2#)を活用すると、データ件数が変わっても集計が壊れない - ファイル形式は
.xlsxまたは.xlsbを使用(.xls は非対応) - 古いCSE配列との混在時は
@(暗黙の共通部分演算子)の挙動に注意 - 共同編集環境ではExcelバージョンを揃えるか、動的配列に依存しない設計に
動的配列をマスターすれば、これまで複雑なCSE配列数式やマクロ、VBAで書いていた処理がたった1行に集約できます。最初のうちは #SPILL! エラーに戸惑うかもしれませんが、原因パターンを覚えてしまえば怖いものはありません。「結果を置く場所が空いているか?」を常に意識する——これだけで、Excelの表計算の世界が一段階上のレベルに進化します。
minto.tech スマホ(Android/iPhone)・PC(Mac/Windows)の便利情報をお届け! 月間アクセス160万PV!スマートフォン、タブレット、パソコン、地デジに関する素朴な疑問や、困ったこと、ノウハウ、コツなどが満載のお助け記事サイトはこちら!