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 | 関数 名前 から 数式 テキスト |
| Args | zero-ベース 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 エンジンは、スカラーのスナップショットの代わりに、その範囲参照を依存する数式のために保持します
関連項目