HotXLS ドキュメント

OnUserFunction / OnUserFunctionEx コールバック

The OnUserFunction コールバックを使用すると、 Calculate中にアプリケーションコードがカスタムまたはサポートされていないワークシート関数を評価できます。 TXLSWorkbook を呼び出す前に TXLSXWorkbook または Calculate
コールバックが現在の数式コンテキストを必要とする場合は OnUserFunctionEx を使用します。コンテキストは 1 ベースのシートインデックスと数式セルの 1 ベースの行と列を報告します。セルを評価しないワークブックレベルの Calculate 呼び出しは、行と列として 0

構文

type
  TXLSUserArgKind = (akuValue, akuRangeRef, akuArray);

  TXLSUserFunctionContext = record
    SheetIndex: Integer;
    Row: Integer;
    Col: Integer;
    ArgCount: Integer;
    ArgKinds: array of TXLSUserArgKind;
  end;

  TXLSUserFunctionEvent = procedure(
    Sender: TObject;
    const FunctionName: WideString;
    const Args: Variant;
    var Value: Variant;
    var Handled: Boolean) of object;

  TXLSUserFunctionExEvent = procedure(
    Sender: TObject;
    const FunctionName: WideString;
    const Args: Variant;
    const Context: TXLSUserFunctionContext;
    var Value: Variant;
    var Handled: Boolean) of object;

property OnUserFunction: TXLSUserFunctionEvent;
property OnUserFunctionEx: TXLSUserFunctionExEvent;
property AllowUnsafeFormulaCallbacks: Boolean;

引数

FunctionName関数 名前 から 数式 テキスト
Argszero-ベース Variant array containing evaluated argument 値. 向け zero-argument 関数 この 値 です Null
Context向け OnUserFunctionEx, reports SheetIndex, Row, と Col. シート, 行 と 列 値 です 1-ベース 向け セル 数式; 行 と 列 です ArgCount 場合 no セル です being evaluated Args 配列の長さ (引数なしの呼び出しでは 0) で、 ArgKinds classifies each argument as akuValue (literal value), akuRangeRef (cell or range reference), or akuArray (配列定数)。セル数式ではシート、行、列の値は 1 始まりです。行と列は 0 評価対象のセルがない場合です。種別は引数の評価前に記録されるため、SUM や MAP 系のハンドラーは、評価結果が Args entry carries only the value
Value設定 この へ 関数 result
Handled設定 へ True 場合 callback supplies result. Leave False へ keep normal unsupported 関数 behavior

使用例

AllowUnsafeFormulaCallbacks defaults to False クラシック XLS と XLSX の両方のワークブックに適用されるため、数式を保持しても、危険な外部系/マクロ系の関数名をホスト アプリケーション コードが処理することは許可されません
The default gate covers DDE, CALL, REGISTER, REGISTER.ID, WEBSERVICE, RTD, SQL.REQUEST, EXEC, RUN, CREATE.OBJECT, APP.ACTIVATE, SEND.KEYS, OPEN, SAVE, SAVE.AS, FOPEN, FWRITE, FWRITELN, FCLOSE, and FILE.DELETE 認識できる future-function プレフィックスが正規化された後に行われます
拒否は、引数の評価前、またワークブック ローカル、プロセス全体、リゾルバー、イベントの各コールバックが実行される前に行われます。通常のカスタム関数や未対応の関数名については、既存のコールバック動作がそのまま維持されます
Set the workbook property to True すべての数式と登録済みハンドラーが信頼できる場合に限ります。文脈に応じた評価では、代わりに TXLSFormulaEvaluationOptions.AllowUnsafeFormulaCallbacks, while an explicitly supplied False overrides a workbook-wide opt-in

Example

procedure TForm1.WorkbookUserFunction(Sender: TObject;
  const FunctionName: WideString; const Args: Variant;
  var Value: Variant; var Handled: Boolean);
begin
  if SameText(FunctionName, 'DOUBLEPLUS') then
  begin
    Value := Double(Args[0]) * 2 + Double(Args[1]);
    Handled := True;
  end;
end;

Workbook.OnUserFunction := WorkbookUserFunction;
Value := Workbook.Calculate('=DOUBLEPLUS(A1;5)');

コンテキスト対応の使用例

procedure TForm1.WorkbookUserFunctionEx(Sender: TObject;
  const FunctionName: WideString; const Args: Variant;
  const Context: TXLSUserFunctionContext;
  var Value: Variant; var Handled: Boolean);
begin
  if SameText(FunctionName, 'ROWBONUS') then
  begin
    Value := Double(Args[0]) + Context.Row + Context.Col;
    Handled := True;
  end;
end;

Workbook.OnUserFunctionEx := WorkbookUserFunctionEx;
Value := Worksheet.Calculate('=C2');

Receiving range arguments

引数がワークシート範囲に評価された場合、 Args entry is a varUnknown Variant that holds an ICalcRangeList 範囲に含まれる各セルの評価値が Variant にコピーされることはありません。判定と取り出しには VarIsRange リストを返すオーバーロードを使用し、解決された矩形は TXLSCalcRange
type
  TXLSCalcRange = class
    property row1: Integer;   { 0-based, inclusive }
    property col1: Integer;   { 0-based, inclusive }
    property row2: Integer;
    property col2: Integer;
    property SheetIndex: Integer;
  end;

  ICalcRangeList = interface
    property Count: Integer;
    property Item[Index: Integer]: TXLSCalcRange;
  end;

function VarIsRange(Value: Variant): Boolean; overload;
function VarIsRange(Value: Variant; var Int: ICalcRangeList): Boolean; overload;
function RangeToVariant(Value: TXLSCalcRangeList): Variant;
    
Coordinates match the TXLSGetValue 規約に従います。0 始まりで終端を含みます。ハンドラー自身が範囲を返すには TXLSCalcRangeList and wraps it with RangeToVariant before assigning Value エンジンは、スカラーのスナップショットの代わりに、その範囲参照を依存する数式のために保持します

関連項目