Документация HotXLS

Обратный вызов OnUserFunction / OnUserFunctionEx

Обратный вызов OnUserFunction позволяет коду приложения вычислять пользовательские или иные неподдерживаемые функции листа в процессе выполнения Calculate. Назначьте его для TXLSWorkbook или TXLSXWorkbook перед вызовом Calculate
Используйте OnUserFunctionEx, когда обратному вызову требуется текущий контекст формулы. Контекст сообщает индекс листа с отсчётом от 1, а также строку и столбец ячейки с формулой с отсчётом от 1; вызовы Calculate на уровне рабочей книги, не вычисляющие ячейку, сообщают строку и столбец как 0

Синтаксис

type
  TXLSUserFunctionContext = record
    SheetIndex: Integer;
    Row: Integer;
    Col: Integer;
  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;

Аргументы

FunctionName функция имя из формула текст
Args zero-основанный Variant array containing evaluated argument значения. для zero-argument функции этот значение является Null
Context для OnUserFunctionEx, reports SheetIndex, Row, и Col. лист, строка и столбец значения являются 1-основанный для ячейка формулы; строка и столбец являются 0 когда no ячейка является being evaluated
Value задать этот к функция result
Handled задать к True когда callback supplies result. Leave False к keep normal unsupported функция behavior

Пример

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');

См. также