Dokumentacja HotXLS

Callback OnUserFunction / OnUserFunctionEx

Callback OnUserFunction pozwala kodowi aplikacji ewaluować niestandardowe lub nieobsługiwane funkcje arkusza podczas Calculate. Przypisz go do TXLSWorkbook lub TXLSXWorkbook przed wywołaniem Calculate
Użyj OnUserFunctionEx gdy callback potrzebuje bieżącego kontekstu formuły. Kontekst raportuje 1-based indeks arkusza oraz 1-based wiersz i kolumnę komórki formuły; wywołania Calculate na poziomie skoroszytu, które nie ewaluują komórki, raportują wiersz i kolumnę jako 0

Składnia

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;

Argumenty

FunctionName funkcja nazwa z formuła tekst
Args zero-oparty Variant array containing evaluated argument wartości. dla zero-argument funkcje ten wartość jest Null
Context dla OnUserFunctionEx, reports SheetIndex, Row, i Col. arkusz, wiersz i kolumna wartości są 1-oparty dla komórka formuły; wiersz i kolumna są 0 gdy no komórka jest being evaluated
Value ustawić ten do funkcja result
Handled ustawić do True gdy callback supplies result. Leave False do keep normal unsupported funkcja behavior

Przykład

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

Przykład z kontekstem

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

Zobacz też