HotXLS ドキュメント

Excel 計算エンジン

概要

HotXLS には数式を解析・計算する組み込みエンジンが含まれています。このエンジンはプロセス内でセルの数式をプログラム的に評価し、計算されたワークブックの値を解決するために Excel や外部の OLE コントローラーを呼び出す必要がありません

計算の実行

保存やエクスポートの前に、メインのワークブックインターフェースを使用してワークブック全体の再計算をトリガーします

procedure Calculate;

このエンジンは標準的な数学、日付、論理、文字列、統計の各関数ファミリーをサポートします。セルの依存関係を順次解決し、参照チェーンをたどって循環参照を防ぎます

コンテキスト依存の数式評価

TXLSWorksheet と TXLSXWorksheet は EvaluateFormulaAt を公開しており、一時的なセルを書き込んだりワークブックの計算状態を変更したりすることなく、指定した 1 始まりの行と列で数式テキストを計算できます

A1 と R1C1 の参照形式、ローカル名、構造化参照、数式の依存関係、配列ルート、型付きの Excel エラー値、揮発性の状態、明示的な外部参照の許可、キャンセル、安定した失敗カテゴリは、通常のワークブックエバリュエーターと共通です

CreateFormulaEvaluationTemplate は不変のアンカーを一度コンパイルし、それを複数のターゲットセルで再利用します。ターゲット行に依存する A1 構造化参照はターゲットコンテキストごとに解決され、呼び出しごとの上限によって数式の長さ、構文項目のステップ数、再帰の深さ、生成される配列のバイト数が制限されます

結果の型、既定の上限値、有効期間の規則、および Delphi / C++Builder の例については「コンテキスト依存の数式評価」を参照してください

配列演算子

算術、比較、連結、単項マイナス、パーセントの各演算子は、スカラー値に加えて計算済みの配列も受け入れます

スカラーはすべての要素へブロードキャストされ、1 行または 1 列の配列は互換性のある次元へブロードキャストされます。互換性のない形状では #VALUE! が返されます

エラーはそれぞれの結果セル内に保持されるため、1 か所のゼロ除算や無効な要素があっても、残りのセルについて計算された値は失われません

COMBINA と PERMUTATIONA は、非負整数の引数を切り捨て、オーバーフローをチェックしながら、スカラーとブロードキャスト配列の両方で同じセマンティクスを共有します。一方 MUNIT はコンパクトな 2 次元 Double 型の単位行列を返します

FormulaArrayMemoryLimit の既定値は 64 MiB で、生成されるマトリックスのペイロードの上限となります。MUNIT はさらに、固定の次元上限を課す代わりに、ワークシートの残りスピル領域を検証します

数式の有無の検査

ISFORMULA(reference) は、参照先のセルを計算することなく数式の有無を検査します。そのため、キャッシュされた結果がエラーや空文字列であっても、そのセルに数式があることを検出できます

矩形の範囲を指定すると、同じ形状のブール配列が返されます。共有数式や従来形式・XLSX の配列数式のメンバーは true を返し、動的スピルではアンカーのみが数式セルになります

直接の値やスカラーの定義名は #VALUE! を返し、無効な参照は #REF! を保持します。生成されるブール配列は FormulaArrayMemoryLimit によって制限されます

XLSX は _xlfn.ISFORMULA として書き込み、開いたときに裸の名前に復元します。ODS は標準の of:=ISFORMULA 構文を使い、従来の XLS 出力では、データをコミットする前に未対応の将来関数が拒否されます

最新のテキスト関数

UNICHAR は数値入力をゼロの方向へ切り捨て、有効な Unicode スカラー値を UTF-16 に変換します。これには、補助平面に対するサロゲートペアの出力や、すべての私用領域が含まれます

ゼロおよび範囲外の入力は #VALUE! を返し、単独のサロゲートコードポイントや Unicode の非文字は #N/A を返します。範囲や生成配列の入力では、これらのエラーが要素ごとに保持されます

BAHTTEXT は有限の数値をタイのバーツとサタンのテキストに変換します。中間値は小数点第 2 位でゼロから離れる方向へ丸められ、丸めた絶対値がゼロになっても負号は保持され、整数型へ縮小されることなく指数表記が展開されます

XLSX は UNICHAR を _xlfn.UNICHAR として保存し、再び開いたときに裸の名前に復元します。BAHTTEXT は標準の関数識別子をそのまま使うため、XLS と XLSX のどちらの数式でも裸の名前のままです

回帰と予測

LINEST と LOGEST は、1 つ以上の予測変数の列または行を受け入れ、Excel と同じ順序で係数を返します。省略可能な切片がその後に続きます

statistics 引数が true の場合、両方の関数は、係数の標準誤差、適合度の統計、F 統計量、自由度、回帰平方和、残差平方和を含む完全な 5 行の結果を返します

TREND と GROWTH は同じ多変量モデルを使用し、指定された新しい予測変数の値について、行または列の形状を保持します

従来の XLS の依存関係再計算

TXLSWorkbook.Recalculate は、最初の呼び出しで数式の依存関係グラフを構築し、物理的なセル順序ではなく、参照元を先に評価する順序で数式を評価します

それ以降の呼び出しではグラフを再利用し、変更された値の推移的な依存先と揮発性数式だけを再計算します。数式の編集、名前、ワークシート構造、参照の書き換えが行われると、グラフは安全に無効化され、再構築されます

循環参照には、従来のワークブックの EnableIteration、MaxIterations、MaxIterationChange の各設定が使われます。また UseFullPrecision=False が指定されると、表示桁数の精度がキャッシュ結果とその下流の計算に適用されます

定義名の依存関係

増分計算では、ワークブックスコープおよびワークシートスコープの名前が、ネストした数式や複数領域の参照を通じてたどられます

非環式の名前数式は正確なセル依存関係として寄与し、再帰的な名前の循環は、安全に揮発性の再計算へフォールバックします

What-If データテーブル

従来の XLS と最新の XLSX のどちらのワークシートでも、1 変数または 2 変数の What-If データテーブルを作成、計算、読み書き、コピーし、構造的に調整できます

function AddDataTable(
  const AResultRange, ARowInputCell, AColumnInputCell: WideString
): TXLSDataTable;

結果範囲には計算済みの出力セルだけが含まれ、数式と試行値は Excel と同じレイアウトで周囲のセルを使います

  • 列入力テーブル — ARowInputCell を空のままにし、各結果列の上にソース数式を置き、結果行の左側に試行値を置きます
  • 行入力テーブル — AColumnInputCell を空のままにし、各結果行の左側にソース数式を置き、結果列の上に試行値を置きます
  • 2 変数テーブル — 両方の入力セルを指定し、結果範囲の上と左にソース数式を置き、結果の上に行入力の試行値、左側に列入力の試行値を置きます
Sheet.Range['B1', 'B1'].Value := 0;
Sheet.Range['D1', 'D1'].Formula := '=B1*2+1';
Sheet.Range['C2', 'C2'].Value := 1;
Sheet.Range['C3', 'C3'].Value := 2;
Sheet.Range['C4', 'C4'].Value := 3;

Table := Sheet.AddDataTable('D2:D4', '', 'B1');
Workbook.Recalculate;

この列入力の例では D2:D4 に 3、5、7 が計算されます。各試行値は独立した計算コンテキストを通じて適用されるため、他の数式セルを経由して間接的に B1 を参照する数式も正しく再計算されます

AddDataTable は、無効な範囲、無効な入力参照、または両方の入力参照が空の場合に nil を返します。ワークシートの DataTables コレクションから、結果の定義とその削除済み入力フラグを参照できます

参照先の入力セルを削除してもテーブルの定義は保持され、その出力は #REF! を返します。これは保存されたワークブックのセマンティクスと一致します

ユーザー定義関数

カスタムビジネスロジックで数式エンジンを拡張します。以下のイベントを使用して独自の関数を登録します

ワークブックまたは個々のコンテキスト依存評価が明示的に AllowUnsafeFormulaCallbacks を有効にしていない限り、危険な外部名やマクロ形式の名前は、引数やハンドラーが実行される前に拒否されます