Excelの#SPILL!を原因別に切り分ける|配列式が表示されないときの確認

動的配列の式が #SPILL! になったら、式をすぐ書き換える前に、Excelが結果を置こうとする範囲と、その範囲を使えない理由を確認します。

AIものさし編集部

動的配列の式が #SPILL! になったら、式をすぐ書き換える前に、Excelが結果を置こうとする範囲と、その範囲を使えない理由を確認します。出力先に値や結合セルがある、テーブル内に式を置いている、結果がシート端を越える、計算ごとに配列の大きさが変わるなど、原因ごとに直し方は異なります。式の左上セルからspill範囲を特定し、既存データを消さずに原因を一つずつ切り分けましょう。

最初に元データを守る

#SPILL!のセルを選ぶと、Excelは計算結果が広がる予定の範囲を示します。まず式と期待する出力件数を記録し、下のセルや右側にある値を一括削除しないでください。そこには別の数式、入力済みデータ、見えにくい空白文字があるかもしれません。

  1. エラーセルの数式と、参照している入力範囲をコピーして記録する。

  2. エラーセルを選び、点線のspill範囲またはエラーチェック詳細を確認する。

  3. Excelが示す「阻害セル」があれば、そのセルの値・数式・結合状態を確認する。

  4. 結果が本来何行・何列になるかを、入力データや条件から見積もる。

  5. 変更前の値を保全し、消去・移動が必要なら対象セルだけを別シートなどへ退避する。

原因別の早見表

表は横にスクロールできます

原因兆候確認・対応
出力範囲に値がある点線範囲内に入力値、数式、空白文字がある阻害セルだけ確認し、必要な値を保全してから移動・削除する
結合セルが重なるspill予定範囲の一部が結合されている結合が必要な表示か確認し、必要なら数式の配置・範囲を変える
Excelテーブル内に置いたテーブル列で動的配列を展開しようとしているspill式はテーブル外のグリッドへ置く。表の行ごとの計算なら通常の行式や構造化参照を検討する
シート端を越える式が列全体など大きすぎる範囲を返す必要な入力範囲に絞るか、1行ずつ計算する。全列参照が本当に必要か確認する
配列サイズが安定しないRANDARRAY/RANDBETWEENなどが再計算ごとにサイズを変えるサイズを決める入力や関数を見直し、計算時に結果範囲が安定する形へ直す
メモリ不足・原因不明大きな配列や複雑な計算で発生、阻害セルが見つからないまず対象範囲を小さくした複製で再現し、公式の詳細分類と計算負荷を確認する

早見表は候補を絞るためのものです。複数の原因が重なることもあります。たとえば列全体を参照した式の出力が大きく、さらに途中に入力値がある場合、阻害セルだけ取り除いてもシート端や計算量の問題が残ります。

出力先が空いていない場合

最もよくあるのは、配列結果の予定範囲に既存の値がある状態です。式の左上セルを選び、点線で示される範囲と阻害セルを見比べます。表示が空白に見えても、セルに空白文字や数式が入っていることがあるため、セルを個別に選んで数式バーや値を確認します。

対処は、阻害セルの内容を理解してから選びます。不要なテスト値なら別の場所へ退避してから消す。必要な入力値なら、数式の出力位置を空いた範囲へ動かすか、配列の対象を絞ります。範囲全体を選択してDeleteする方法は、関係ないデータまで失う危険があるため避けます。

テーブル・結合セルに重なる場合

動的配列の結果をExcelテーブル内へspillさせることはできません。テーブルは各行に独立した値を持つ用途に向き、動的配列は隣接セルへ結果範囲を展開します。フィルター・見出し・構造化参照のためにテーブルを使っているなら、テーブルを安易に範囲へ変換せず、spill式をテーブル外に置く案を先に検討します。

結果範囲に結合セルがある場合も展開を妨げます。装飾目的で結合しているなら表示構造を変更できるか確認しますが、帳票の意味や印刷レイアウトに影響することがあります。結合を解除する前に、変更後の見出しや数式の参照先を保てるかを確認してください。

シート端・結果サイズ・計算負荷

全列参照を使う式が大量の値を返そうとすると、出力先がシートの最終行・列を越えることがあります。Microsoftの例では、列全体を検索対象にした式が大量の配列結果を生成してspillできないケースが示されています。必要な行だけを参照する、データ範囲をテーブル参照にする、または従来型の1行ずつの式へ変えることで、返す範囲を限定できる場合があります。最終行まで埋める前に、期待件数と出力列数から必要な範囲を見積もってください。

RANDARRAYやRANDBETWEENなど、再計算のたびに配列サイズが変化する式は、計算の追加パスで範囲が安定せず #SPILL! になる場合があります。サイズを決める値を固定セルへ分離し、同じ計算で同じ行数・列数になる式へ変えるのが切り分けの第一歩です。単に揮発関数を含むだけで必ず失敗するわけではなく、結果サイズが計算中に安定するかを見ます。

配列が極端に大きい場合はメモリ不足も原因になります。いきなり本番範囲を変更せず、コピーしたブックの少数行で同じ式を試し、入力範囲や式を段階的に広げます。小さくした時だけ成功するなら、セルの障害ではなく返却サイズ・計算量の問題を疑います。

原因を確定する確認順

  1. エラーセルからspill予定範囲を表示し、出力行数・列数を記録する。

  2. 範囲内の値・数式・空白文字・結合セル・テーブル境界を確認する。

  3. 阻害セルがあれば値を保全し、必要なセルだけを動かすか、数式位置を変更する。

  4. 阻害がないのに失敗する場合、列全体・シート端・可変サイズ・メモリ負荷を順に疑う。

  5. 修正後にエラーが消えたかだけでなく、期待した行数・列数・代表値が返ったか照合する。

  6. 保存前に、数式・入力値・フィルター・テーブル範囲が意図せず変わっていないか確認する。

修正案を試すときは、数式セルだけを別セルへ移して原因が消えるか確認するのも有効です。ただし、参照先が相対参照か絶対参照かで式の意味が変わるため、コピー後に数式文字列を確認し、元のセルを消す前に結果を比較します。

Excelテーブルで行ごとに計算したいとき

表の各行に一つずつ値を返す計算なら、動的配列の一括spillではなく、テーブル列の計算列として同じ行の式を使う方が適切なことがあります。たとえば各レコードの単価×数量を計算する列は、行ごとに対応する式を置けます。一方、重複を除いた一覧や抽出結果など可変長の集合を出したい場合は、テーブルの外にspill用の領域を用意します。

テーブルを範囲へ変換すれば問題が必ず解決するとは限りません。フィルター・追加行の自動拡張・列名参照など、テーブルが担っていた機能が変わります。spill式を外へ移す、出力用シートを作る、対象行を絞る選択肢を比べ、既存の業務表の役割を壊さない方法を選びます。

#SPILL!ではないように見える場合

エラー検査には、原因を判定できない・認識できないケースもあります。エラーの種類、式、入力範囲、spill予定範囲、Excelの版を記録し、同じ式を小さな複製で再現できるか確認します。古いExcelや動的配列を扱わない環境では、同じ式が別の表示や計算結果になる可能性があります。異なるExcel版をまたぐ共有ブックでは、受け手側の版が動的配列をサポートするかも別に確認してください。

動的配列を含む別ブック参照は、source workbookを閉じた状態では制約があり、更新時に#REF!となる場合があります。これは通常のspill範囲の障害とは原因が異なります。参照ブックが閉じているかを確認し、#SPILL!の阻害セルを消す操作だけで直そうとしないでください。

修正後のQAチェックリスト

  • 変更前の式と阻害セルの内容を記録した。

  • spill予定範囲の妨げを原因別に確認した。

  • 変更したのは必要なセル・式・範囲だけである。

  • 表の役割、結合、フィルター、入力済みデータを意図せず壊していない。

  • エラー表示が消え、期待件数・列数・代表値が一致する。

  • 保存後に再計算しても、結果範囲が安定している。

次にすること

まずエラーセルを選択し、Excelが示すspill範囲と阻害セルを確認します。阻害セルが見つかったら、値を保全したうえでそのセルだけを移動し、期待件数と代表値を再確認します。阻害がない場合は、テーブル内の式、シート端、可変サイズ、配列負荷の順に調べます。原因を特定できない場合は、式・Excelの版・入力範囲・エラー詳細を記録し、複製で再現してから管理者やサポートへ渡してください。

式の形を比べて原因を絞る

数式の意図を変えず、返す範囲だけを狭められるかを確認します。例として、A列の全行をlookup対象にした式がシートの端まで結果を返そうとしているなら、実際にデータがある範囲へ限定する案があります。Microsoftの公式例も、全列参照が大量の配列結果を返す状況と、対象範囲を絞る方法を示しています。行数を決められない業務表では、データ範囲の終端を確認し、意図した件数を超えて返していないか先に見積もります。

=FILTER(A2:A500,A2:A500<>"")

このように入力範囲を限定した場合、500行を超える新しいデータは結果に含まれません。件数が増える運用なら、範囲を広げる手順、テーブル外の出力位置、または自動拡張する参照設計を決めておく必要があります。式を短くしただけで、対象データの欠落がないかは別途確認します。

テーブル Orders の担当者を一覧化したい場合は、テーブル内の各行に UNIQUE の結果をspillさせず、テーブルの外側で =UNIQUE(Orders[担当]) のように出力します。テーブル内の各注文行に金額を計算するなら、計算列として行ごとの式を置きます。前者は可変長一覧、後者は1行単位の計算なので、同じ「配列式で一覧を作る」方法に揃える必要はありません。

変更後は、元データから期待される一意件数と結果の件数を比較します。フィルター条件に空白やエラー値が含まれる場合は、結果から消えた行が意図した除外かをサンプルIDで照合します。spillエラーが消えても、式が返す対象を狭めすぎて重要な値を落としたなら修正成功とは言えません。

公式Sources

Microsoft Support, How to correct a #SPILL! error: https://support.microsoft.com/en-us/excel/how-to-correct-a-spill-error(新しいタブで開く)

Microsoft Support, Dynamic array formulas and spilled array behavior: https://support.microsoft.com/en-us/excel/dynamic-array-formulas-and-spilled-array-behavior(新しいタブで開く)

Microsoft Support, Spilled range operator: https://support.microsoft.com/en-us/excel/spilled-range-operator(新しいタブで開く)

確認日:2026-10-15。製品仕様の根拠はMicrosoft公式資料。特定のブック・Excel版での操作検証は未実施。