Skip to content

数式エンジン ​

評価器は、スカラー値、範囲、配列、エラー、参照、ロケール依存の挙動を Excel と一致させることを目指しています。Formulon は認識対象の関数名を起動時に登録し、各バインディングは登録済みの関数を評価できます。

たとえば、A1 に数値 10、B1 に数式 =A1*2 が入っている場合、B1 の評価結果は数値 20 です。数式の文字列、結果の種類、計算結果のキャッシュ値はそれぞれ別のものです。数式の結果は数値・文字列・真偽値・エラー・配列などになります。エンジンは値をホストへ返し、formulon-cell のような UI がグリッド上での表示を担当します。

用語: tree-walker

評価器は、解析済みの数式の構文木(AST)をバイトコードに変換せず、そのまま辿って評価します。すべてのビルドがこの 1 つの評価器を使い、結果がずれうる別の高速経路はありません。

用語: value kind(値の種類)

セル値・数式結果に付く弁別子です。Blank / Number / Bool / Text / Error / Array / Ref / Lambda の 8 種類があります。各バインディングは enum として公開します(例: WASM ValueKind.Number、Python ValueKind.NUMBER)。

01数式テキスト=SUM(A1:A10)02字句・構文解析構文木 (AST) を作る03参照解決名前・テーブル・範囲04評価器AST を直接たどる05Value8 種類の値の種別のいずれか01数式テキスト=SUM(A1:A10)02字句・構文解析構文木 (AST) を作る03参照解決名前・テーブル・範囲04評価器AST を直接たどる05Value8 種類の値の種別のいずれか
どのビルドでも評価器は 1 つだけなので、結果がずれる別の高速経路はありません。

認識対象の関数 ​

Formulon は、数学、統計、論理、テキスト、日付 / 時刻、検索、財務、エンジニアリング、情報、データベース、Web、キューブ、LET / LAMBDA / 動的配列系など、合計 526 件の Excel 関数名を認識します。これは認識カタログであり、Microsoft 365 の外部サービスに依存する関数まですべてローカル実装済みという意味ではありません。

511 件の実装(環境依存の CELL、INFO を含む)と、15 件の未提供スタブで、認識対象は合計 526 件です。カテゴリ別、状態別の内訳は 数式カバレッジ を参照してください。

参照と配列 ​

範囲形の定義名は配列として評価され、スピルによる仮想セルも列挙されます。1900 / 1904 日付システムは評価器まで伝わり、行全体 / 列全体や 3-D 範囲はワークブックモデルに基づいて解決されます。配列の要素数の拡張(ブロードキャスト)は関数ごとの Excel 規則に従います。数式をセルに書き込まずに評価する方法は ワークブック操作 — アドホック数式評価 を参照してください。

参照値を範囲の端点に使う ​

参照値を返す定義名や INDEX、OFFSET、XLOOKUP、IFS、SWITCH などの関数は、範囲の端点に使えます(A1:MyName、A1:INDEX(...)、XLOOKUP(...):B3)。ROW / COLUMN も、このような動的な範囲を受け取ります。名前の定義が定数・通常の式・文字列を返す場合、端点に使うと #VALUE! になります。未定義の名前は #NAME?、別シートの端点は #VALUE! になります。同じブックの名前や関数は [0]!Name、[0]!Fn(args) の形式で指定できます。A1:[0]!Rng のような範囲や、[0]!Rng A1:A5 のような交差にも使えます。

外部ワークブック参照とキャッシュ値 ​

数式バーでは、ブック名やパスを使って外部ワークブックを指定できます。=[Book.xlsx]Sheet1!A1、='/Users/x/[Book.xlsx]Sheet1'!A1、=SUM([Book.xlsx]Sheet1:Sheet2!A1)、=Book.xlsx!Name などの形式に対応します。同じ形式はセル、定義名、条件付き書式の数式、入力規則の数式でも使えます。外部リンク表にないブックを参照する数式を入力するとリンクレコードが追加され、以後は大文字・小文字を区別せず同じレコードを再利用します。保存時はリンクのインデックス形式に変換しますが、数式取得 API ではブック名やパスの表記を返します。

[1]Sheet1!A1、[2]!Name、'[1]My Sheet'!A1 のようにファイルから読み込んだインデックス形式も同じ外部リンクキャッシュを解決します。数式取得 API は保存用インデックスではなく対応するブック名やパスを返します。

外部参照は外部リンクパーツに保存されたセルと定義名のキャッシュ値を読み取ります。Formulon は参照元ワークブックを開いたり、ネットワークから取得したり、外部データを更新したりしません。XLSX と XLSB は保存・再読み込み時にリンク表と数式を保持しますが、評価結果はキャッシュ値だけから得られます。

関数値とトリミング参照 ​

SUM のような登録済み組み込み関数を単独で書くと関数値になります。TYPE(SUM) は 128、LET(f,ABS,f(-2)) は 2 になります。字句スコープの LET バインディングや定義名で組み込み関数名を隠すこともできます。関数値は CHOOSE、IF、REDUCE などを経由してから呼び出すこともできます。

A1:.A10、A1.:A10、A1.:.A10 の参照形式は、それぞれ範囲の末尾、先頭、両端にある空白の行・列を取り除きます。TRIMRANGE(...) も同じ参照として動作します。これらは参照のまま編集に追随します。数式バーの表記は Excel の保存形式(関数値は _xleta.、トリミング演算子は _xlfn._TRO_TRAILING、_xlfn._TRO_LEADING、_xlfn._TRO_ALL)へ変換され、読み取り時に戻されます。XLSX / XLSB の保存・再読み込みでも同じです。

数式の境界ケース ​

混同しやすい文字列と空白の状態も、現在の Excel と同じ挙動にしています。

  • TRIM は連続する空白を 1 文字にまとめますが、残すのは連続の先頭にあった文字です。全角スペース(U+3000)を U+0020 に書き換えることはありません。
  • ISOMITTED は LAMBDA 呼び出しで省略された引数を TRUE と判定します。先頭、途中、末尾のどこで省略しても同じです。
  • 長さ 0 の文字列は空白セルではなく文字列です。CELL("type", ...) は "l" を返し、ワイルドカード条件 COUNTIF(range, "*") はこれを含めます。一方、COUNTIF(range, "=") の空白セル検査はこの値を満たしません。

USDOLLAR と DOLLAR はどちらも文字列を返します。USDOLLAR はプロファイルに米ドル専用の設定がある場合はそれを使い、設定がなければそのロケールの DOLLAR 通貨形式へフォールバックします。DOLLAR は常に選択したロケールの通貨形式と既定の小数桁数に従います。たとえば win-365-ja_JP では DOLLAR(1234.5) は小数 0 桁の円表示になり、米ドル設定のある USDOLLAR(1234.5) は $1,234.50 になります。米ドル設定がないプロファイルでは、USDOLLAR もロケールの通貨形式になります。表示上 0 に丸められる負数も符号を保つため、USDOLLAR(-0.001, 2) は ($0.00)、DOLLAR(-0.001, 2) は ¥-0.00 になります。

集計関数の参照と行の表示状態 ​

SUBTOTAL と AGGREGATE は、参照先セルに保存された数式を調べます。セル自身の数式に SUBTOTAL または AGGREGATE が含まれていれば、そのセルは除外されます。この判定は LET / LAMBDA の本体や、実行されない IF の分岐にも入ります。スピル配列や CSE 配列では、条件を満たす起点セルに従ってすべてのセルが除外されます。定義名の別名、INDIRECT、またはそのセルを参照するだけの数式は、入れ子の呼び出しを作りません。この規則は SUBTOTAL のすべての関数番号と、AGGREGATE のオプション 0–3(配列形式 14–19 を含む)に適用されます。AGGREGATE のオプション 4–7 では入れ子のセルを保持します。

SUBTOTAL の 1–11 は、シートまたはそのテーブルの AutoFilter に条件がある場合だけ、非表示行をフィルターによる非表示として扱います。条件が 1 つでもあれば、そのシートの非表示行をすべて除外します。101–111 は常に非表示行を除外します。参照先がすべて除外された場合、SUBTOTAL は #VALUE! ではなく空集合に対する結果を返します。

数値書式と日付 / 時刻の値 ​

数値書式の検証は Excel のセクション規則に従います。セクションは最大 4 個で、条件は最初の 2 個だけに書けます。@ と数値 / 日付トークンの混在、閉じていない引用符・角括弧・エスケープ・_・* は拒否されます。条件付きセクションでは Excel の正数 / 負数に対する暗黙の符号用セクションを使います。数値を受け入れるセクションがなければ、TEXT は #VALUE!、表示テキストは ######## になります。テキスト専用セクションが数値を選んだ場合は General で表示します。

TEXT と表示形式の分数は、固定分母や 0 で埋める分母を含む連分数探索を使い、分数への変換前に % を適用します。科学表記は工学的な桁区切りに対応し、小数点より前のカンマは値をスケールします。整数の分数用空白、General と組み合わせた [DBNum1]、シリアル値 0 の 1900/1/0、1904 日付システムの負の日付 / 時刻、1904 日付システムの上限シリアル値は Excel と同じです。日付は 1 回だけ丸めた秒から描画し、深夜を越える場合は翌日へ繰り上げます。

TIME は各成分を切り捨ててから、日へ繰り上げる前の時・分・秒を 32767 以下に制限します。32767 を超える成分は #NUM! になり、有限でない日付 / 時刻入力や範囲外の入力も同じエラーになります。

ネストの上限 ​

数式テキストは Excel の入力上限に従います。グループ化の括弧は 256 段まで(関数呼び出し自身の括弧は数えません)、---1 のような単項符号の連続は 1024 個まで、関数呼び出しは 65 段まで(最も外側の呼び出しと、その内側の 64 段)で、間に演算子や括弧があっても同じです。いずれかの上限を超えた数式は、Excel が入力を拒否するのと同様に、切り詰められずに NestedFormulaTooDeep で丸ごと拒否されます。

修飾付き組み込み関数の呼び出し ​

Sheet1!SUM(...) や [0]!LET(...) のようにシートまたはワークブックで修飾した組み込み関数の呼び出しは、数式の入口で拒否されます。この判定はセル、条件付き書式、定義名、入力規則を含むすべての入口に適用されます。ユーザー定義関数の修飾付き呼び出しは許可されます。

エラーの扱い ​

Excel エラーはホスト言語の例外ではなく 値 として扱います。以下は代表例で、全 ErrorCode は エラーモデル にまとめています。

Excel エラー意味
#DIV/0!0 除算、または除数が空
#VALUE!引数・オペランドの型不一致
#REF!参照を解決できない(削除されたシート、壊れた範囲など)
#NAME?未知の関数 / defined name
#NUM!数値オーバーフローや不正な数値入力
#N/A値なし。MATCH / VLOOKUP 系で発生
#NULL!範囲交差が空
#SPILL!動的配列のスピルが成立しない(衝突・範囲外)
#CALC!エンジンが結果を返せない(再帰・未完了評価など)
#GETTING_DATAExcel の非同期検索用プレースホルダー。Formulon は外部データを取得しません

セルエラーとホスト失敗は別物

#DIV/0! を返す数式は API として 失敗していません。呼び出しは成功しており、結果がエラー値なのです。getValue() の結果で status を確認してから、result.value.kind === ValueKind.Error で判定してください。不正なバイト列、無効なハンドル、IO 失敗などのホスト側の失敗は、別の経路(ステータスオブジェクト、例外、非ゼロの終了コード)で報告されます。

座標 ​

バインディングは 0 から始まる数値座標を使い、ロケールごとのアドレス解析を避けます。

Excel のアドレスバインディングのタプル (sheet, row, col)
Sheet1!A1(0, 0, 0)
Sheet1!B4(0, 3, 1)
Sheet2!C10(1, 9, 2)

A1 テキストは CLI 引数・数式文字列・MCP ツール入力など、明示的に要求している場面でのみ受け付けます。

ロケール依存挙動 ​

現在の互換性プロファイルは、数値・真偽値・エラーの表記と解析、TEXT() の書式文字と名前、文字列の照合と型変換、CODE() / CHAR() と 2 バイト文字のコードページ、R1C1 の文字、CELL() のコード、FORMULATEXT() の関数名と区切り文字、GROUPBY / PIVOTBY のラベル、ピボットテーブルのラベルとレイアウトの既定値を制御します。数式は常に英語の関数名と保存用の区切り文字で入力し、CLI の出力はロケールに依存しません。既定は win-365-en_US です。14 のロケールに 28 のプロファイル ID があり、ID は mac-365-<locale> と win-365-<locale> の形で、ja_JP、en_US、de_DE、fr_FR、zh_CN、ko_KR、th_TH、es_ES、es_MX、pt_BR、ru_RU、zh_TW、it_IT、nl_NL に対応します。すべての mac-* と win-365-ja_JP は Excel との実測に基づき、その他の win-* は Mac の実測から推定しています。Mac プロファイルは比較、並べ替え、検索、グループ化、AutoFilter に各ロケールの Excel 実測照合順序を使います。Windows プロファイルは Windows Excel 365 ja-JP で実測した Windows の単語順を使います。プロファイルはワークブックに保存されないため、読み込み後に再適用してください。詳しくは ロケールプロファイル と テキスト照合 を参照してください。

次に読むもの ​