動的配列
動的配列は、1 つの数式が複数の値を返し、その結果が周辺セルに spill(こぼれ出し)する仕組みです。数式テキストを保持する起点セルと、計算結果が射影されるスピル範囲の組で表現します。Formulon はスピルの形状、依存関係、衝突挙動を再計算の一部として管理します。
用語: spill / spill range
動的配列数式が複数の値を返したときに広がる矩形領域のこと。左上の起点セルが数式テキストを持ち、それ以外のセルは結果の読み取り専用射影になります。
用語: anchor cell
動的配列数式の本体を保持するセルです。起点セルを編集または消去するとスピル全体が変化します。スピル範囲内の起点以外のセルは直接編集できず、消去しても起点セルが変わるまで結果は変わりません。
挙動の概要
- スピル範囲は数式結果の形状(スカラー / 行 / 列 / 2 次元配列)から決まる。
- 形状が変わる数式は依存セルを dirty にし、それらのスピル起点を再計算する。
- スピル範囲が非空セルを上書きしそうな場合は
#SPILL!を返し、データを黙って上書きすることはない。 - 暗黙的 broadcasting で次元が合わない場合(例: 3 行と 5 行を混在)は、関数族ごとの Excel error 規則に従う。
- 起点セルの数式を評価
- 結果形状を算出scalar・行・列・2-D
- スピル矩形は空か空 → スピル範囲に書込み、形状を起点セルに保存 / 非空 → 起点セルに #SPILL!、値は書かない
- 前回と形状が変化したか変化 → 新旧スピル矩形の依存先を dirty 化 / 不変 → スピル安定
スピルする関数の例
=SEQUENCE(5)
=UNIQUE(A1:A100)
=SORT(A1:B20, 2, -1)
=FILTER(A1:C50, B1:B50 > 0)
=LET(x, A1:A10, x * 2)動的配列以前の Excel で書かれたワークブックとの後方互換のため、暗黙交差 (@) も引き続きサポートします。
v0.9.3 の配列関数更新
v0.9.3 では、上記のスピル規則に直結する 2 つの挙動を修正しました。
- 形状が一致しない配列同士の暗黙のブロードキャストが、近似ルールではなく Excel の実際の array-broadcast ルールに従うようになりました。上の「関数族ごとの Excel error 規則に従う」はこの修正を指しています。
INDEX、XLOOKUP、INDIRECTの range 結果は、単一スカラーに収束させるのではなく、動的配列アロケータを経由して他の配列生成数式と同様にスピルするようになりました。
v0.9.2 の配列関数更新
v0.9.2 では、配列対応関数の Excel 互換性をいくつか修正しました。
MAPとMAKEARRAYは、検証済みケースで Excel と同じ形のエラーをスピルする。WRAPROWSとWRAPCOLSは、出力形状と padding の扱いを取得済みの Excel Oracle データに合わせた。TRIMRANGEは、先頭・末尾の空白行 / 空白列の扱いを Excel 由来の期待値に近づけた。
再計算との連携
再計算エンジンは起点セルごとに以下のスピルメタデータを保持します。
| フィールド | 用途 |
|---|---|
| 起点アドレス | 数式本体のシート / 行 / 列 |
| 結果形状 | 直近の成功時の行数 x 列数 |
| スピルエラー | スピルが成立しなかった場合の #SPILL!、それ以外は null |
| 範囲の依存元 | スピル内のいずれかのアドレスを参照しているセル |
形状が変わると、旧スピル矩形・新スピル矩形いずれかにかかるすべての依存セルが dirty 化されます。
スピル状態の検査
WASM / Native Node は spillInfo(sheet, row, col) を公開しています。MCP の formulon_trace ツールはセッションから参照元 / 参照先 / スピル情報を読み取れます。#SPILL! の原因となるセルを特定したいときに有効です。
互換性の注意
動的配列の挙動はワークブック単位のフラグや、同じシート内に旧来の CSE 配列が混在しているかどうかにも依存します。混在ワークブックを扱うときは、結果を信頼する前にゴールデンデータと突き合わせてください。