Skip to content

動的配列

動的配列は、1 つの数式が複数の値を返し、その結果が周辺セルに spill(こぼれ出し)する仕組みです。数式テキストを保持する起点セルと、計算結果が射影されるスピル範囲の組で表現します。Formulon はスピルの形状、依存関係、衝突挙動を再計算の一部として管理します。

用語: spill / spill range

動的配列数式が複数の値を返したときに広がる矩形領域のこと。左上の起点セルが数式テキストを持ち、それ以外のセルは結果の読み取り専用射影になります。

用語: anchor cell

動的配列数式の本体を保持するセルです。起点セルを編集または消去するとスピル全体が変化します。スピル範囲内の起点以外のセルは直接編集できず、消去しても起点セルが変わるまで結果は変わりません。

挙動の概要

  • スピル範囲は数式結果の形状(スカラー / 行 / 列 / 2 次元配列)から決まる。
  • 形状が変わる数式は依存セルを dirty にし、それらのスピル起点を再計算する。
  • スピル範囲が非空セルを上書きしそうな場合は #SPILL! を返し、データを黙って上書きすることはない。
  • 暗黙的 broadcasting で次元が合わない場合(例: 3 行と 5 行を混在)は、関数族ごとの Excel error 規則に従う。
  • bare range、算術 / 比較演算子、IF は引数の形状に合わせてスピルする。bare range の空白セルは 0 になる。
  • スカラー関数は range 引数を要素ごとに評価する。range を返す組み込み関数は共通のスピルアロケータを通り、衝突とグリッド外判定を共有する。
  • @ は暗黙の交差を適用し、数式の起点に対応する range / array の値へ縮約する。
  • スピル演算子 # は、OFFSETINDIRECTCHOOSEIF、括弧で囲んだ参照、LET で束縛した名前など、実行時に計算される anchor を受け取れます。複数セルへ解決される anchor は左上だけに暗黙縮約せず、#REF! を返します。
起点セルの数式を評価結果形状を算出scalar・行・列・2-Dスピル矩形は空か空 → スピル範囲に書込み、形状を起点セルに保存 / 非空 → 起点セルに#SPILL!、値は書かない前回と形状が変化したか変化 → 新旧スピル矩形の依存先を dirty 化 / 不変 → スピル安定起点セルの数式を評価結果形状を算出scalar・行・列・2-Dスピル矩形は空か空 → スピル範囲に書込み、形状を起点セルに保存 / 非空 → 起点セルに #SPILL!、値は書かない前回と形状が変化したか変化 → 新旧スピル矩形の依存先を dirty化 / 不変 → スピル安定

スピルする関数の例

text
=SEQUENCE(5)
=UNIQUE(A1:A100)
=SORT(A1:B20, 2, -1)
=FILTER(A1:C50, B1:B50 > 0)
=LET(x, A1:A10, x * 2)

動的配列以前の Excel で書かれたワークブックとの後方互換のため、暗黙交差 (@) も引き続きサポートします。

ここに挙げた数式は下のパネルで実行できます。上の表は evaluateFormulaArray() の結果で、隣に表示される形状は説明用に描いた図ではなく、エンジンが算出した行数 x 列数です。その下のシートは実物の formulon-cell グリッドで、同じ数式を D2 に書き込んで再計算した状態です。選択されているスピル範囲は spillInfo() が返した矩形です。「スピル先を塞ぐ」を押すとその矩形の中に値が 1 つ入り、起点セルは #SPILL! になって結果は 1 つも書き込まれません。デモ側の演出ではなく、上で述べた衝突の規則がそのまま現れています。

ダイナミック配列とスピル

配列を返す数式を、まず evaluateFormulaArray() でワークブックを書き換えずに形のまま取得し、次に下のシートの実際のセルへ書き込んで spillInfo() でスピル範囲を確認します。

本物の Formulon エンジン (WASM) がこのページ内で動作します。データは送信されません。

デモを試す順序

まず =SEQUENCE(3,4) を選び、プレビューの形状を確認します。シートへ書き込んだ後に右下を塞ぐと、結果が一部だけ書かれることなく起点セルが #SPILL! になります。塞いだセルを空にしてから =FILTER(A2:B6,B2:B6>4) へ切り替え、A 列または B 列の入力値を編集してください。プレビューはすぐ変わります。書き込んだ数式のスピル範囲は再計算時に更新されます。

計算された anchor は tree-walker で評価します。実行時に生成される anchor には bytecode の spill-reference opcode 用の pool entry がないため、リリース成果物でもこの形式の数式は tree-walker 経路を使います。

再計算との連携

再計算エンジンは起点セルごとに以下のスピルメタデータを保持します。

フィールド用途
起点アドレス数式本体のシート / 行 / 列
結果形状直近の成功時の行数 x 列数
スピルエラースピルが成立しなかった場合の #SPILL!、それ以外は null
範囲の依存元スピル内のいずれかのアドレスを参照しているセル

形状が変わると、旧スピル矩形・新スピル矩形いずれかにかかるすべての依存セルが dirty 化されます。

スピル状態の検査

WASM / Native Node は spillInfo(sheet, row, col) を公開しています。MCP の formulon_trace ツールはセッションから参照元 / 参照先 / スピル情報を読み取れます。#SPILL! の原因となるセルを特定したいときに有効です。

互換性の注意

動的配列の挙動はワークブック単位のフラグや、同じシート内に旧来の CSE 配列が混在しているかどうかにも依存します。混在ワークブックを扱うときは、結果を信頼する前にゴールデンデータと突き合わせてください。

次に読むもの