fpspreadsheet: Add INDEX formula.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9355 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
parent
0e9a6e81b3
commit
6124d2d047
@ -2279,6 +2279,37 @@ begin
|
|||||||
Result.ResultType := rtHyperlink;
|
Result.ResultType := rtHyperlink;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ INDEX(range, row_no, col_no)
|
||||||
|
Searches for a value in an array based on its coordinates.
|
||||||
|
In contrast to Excel, row_no and col_no cannot be omitted. }
|
||||||
|
procedure fpsINDEX(var Result: TsExpressionResult; const Args: TsExprParameterArray);
|
||||||
|
var
|
||||||
|
rng: TsCellRange3d;
|
||||||
|
col: Int64; // should be cardinal, but using integer due to subtraction
|
||||||
|
row: Int64; // dto.
|
||||||
|
book: TsWorkbook;
|
||||||
|
begin
|
||||||
|
Result := ErrorResult(errArgError);
|
||||||
|
if Length(Args) < 3 then
|
||||||
|
exit;
|
||||||
|
if not (Args[0].ResultType = rtCellRange) then
|
||||||
|
exit;
|
||||||
|
rng := Args[0].ResCellRange;
|
||||||
|
row := ArgToInt(Args[1]) + rng.Row1 - 1; // The Args are relative to the range
|
||||||
|
col := ArgToInt(Args[2]) + rng.Col1 - 1;
|
||||||
|
if (row < rng.Row1) or (row > rng.Row2) or (col < rng.Col1) or (col > rng.Col2) then
|
||||||
|
begin
|
||||||
|
Result := ErrorResult(errWrongType); // #VALUE! when row/col are outside the range
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
if (rng.Sheet1 <> rng.Sheet2) then // Only range within same sheet allowed.
|
||||||
|
exit;
|
||||||
|
book := TsWorksheet(Args[0].Worksheet).Workbook;
|
||||||
|
Result := CellResult(row, col);
|
||||||
|
Result.ResSheetIndex := rng.Sheet1;
|
||||||
|
Result.ResSheetName := book.GetWorksheetByIndex(rng.Sheet1).Name;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure fpsINDIRECT(var Result: TsExpressionResult;
|
procedure fpsINDIRECT(var Result: TsExpressionResult;
|
||||||
const Args: TsExprParameterArray);
|
const Args: TsExprParameterArray);
|
||||||
{ INDIRECT(string_reference, [ref_style])
|
{ INDIRECT(string_reference, [ref_style])
|
||||||
@ -2585,6 +2616,7 @@ begin
|
|||||||
AddFunction(cat, 'ADDRESS', 'S', 'IIibs',INT_EXCEL_SHEET_FUNC_ADDRESS, @fpsADDRESS);
|
AddFunction(cat, 'ADDRESS', 'S', 'IIibs',INT_EXCEL_SHEET_FUNC_ADDRESS, @fpsADDRESS);
|
||||||
AddFunction(cat, 'COLUMN', 'I', 'r', INT_EXCEL_SHEET_FUNC_COLUMN, @fpsCOLUMN);
|
AddFunction(cat, 'COLUMN', 'I', 'r', INT_EXCEL_SHEET_FUNC_COLUMN, @fpsCOLUMN);
|
||||||
AddFunction(cat, 'HYPERLINK', 'S', 'Ss', INT_EXCEL_SHEET_FUNC_HYPERLINK, @fpsHYPERLINK);
|
AddFunction(cat, 'HYPERLINK', 'S', 'Ss', INT_EXCEL_SHEET_FUNC_HYPERLINK, @fpsHYPERLINK);
|
||||||
|
AddFunction(cat, 'INDEX', 'C', 'RII', INT_EXCEL_SHEET_FUNC_INDEX, @fpsINDEX);
|
||||||
AddFunction(cat, 'INDIRECT', 'C', 'Sb', INT_EXCEL_SHEET_FUNC_INDIRECT, @fpsINDIRECT);
|
AddFunction(cat, 'INDIRECT', 'C', 'Sb', INT_EXCEL_SHEET_FUNC_INDIRECT, @fpsINDIRECT);
|
||||||
AddFunction(cat, 'MATCH', 'I', 'SRi', INT_EXCEL_SHEET_FUNC_MATCH, @fpsMATCH);
|
AddFunction(cat, 'MATCH', 'I', 'SRi', INT_EXCEL_SHEET_FUNC_MATCH, @fpsMATCH);
|
||||||
AddFunction(cat, 'ROW', 'I', 'r', INT_EXCEL_SHEET_FUNC_ROW, @fpsROW);
|
AddFunction(cat, 'ROW', 'I', 'r', INT_EXCEL_SHEET_FUNC_ROW, @fpsROW);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user