You've already forked lazarus-ccr
fpspreadsheet: Fix "IF"-formulas (COUNTIF, SUMIF, etc) containing a 3D reference.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6536 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -1076,9 +1076,13 @@ var
|
|||||||
r, c: LongInt;
|
r, c: LongInt;
|
||||||
dr, dc: LongInt;
|
dr, dc: LongInt;
|
||||||
cell, addcell: PCell;
|
cell, addcell: PCell;
|
||||||
|
sh: Integer;
|
||||||
s: String;
|
s: String;
|
||||||
f: Double;
|
f: Double;
|
||||||
dt: TDateTime;
|
dt: TDateTime;
|
||||||
|
book: TsWorkbook;
|
||||||
|
sheet0: TsWorksheet;
|
||||||
|
sheet2: TsWorksheet;
|
||||||
compareNumber: Double = 0.0;
|
compareNumber: Double = 0.0;
|
||||||
compareStr: String = '';
|
compareStr: String = '';
|
||||||
compareOp: TsCompareOperation = coEqual;
|
compareOp: TsCompareOperation = coEqual;
|
||||||
@ -1286,8 +1290,21 @@ begin
|
|||||||
else DoCompareEmpty(ArgToString(Args[0]) = '', ArgToFloat(Args[2]));
|
else DoCompareEmpty(ArgToString(Args[0]) = '', ArgToFloat(Args[2]));
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if (Args[0].ResultType = rtCellRange) then
|
if (Args[0].ResultType = rtCellRange) then begin
|
||||||
|
if Args[0].ResCellRange.Sheet1 <> Args[0].ResCellRange.Sheet2 then begin
|
||||||
|
Result := ErrorResult(errArgError);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
if (Length(Args) = 3) and (Args[2].ResCellRange.Sheet1 <> Args[2].ResCellrange.Sheet2) then
|
||||||
|
begin
|
||||||
|
Result := ErrorResult(errArgError);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
book := TsWorkbook(TsWorksheet(Args[0].Worksheet).Workbook);
|
||||||
|
sheet0 := book.GetWorksheetByIndex(Args[0].ResCellRange.Sheet1);
|
||||||
|
sheet2 := book.GetWorksheetbyIndex(Args[2].ResCellrange.Sheet1);
|
||||||
for r := Args[0].ResCellRange.Row1 to Args[0].ResCellRange.Row2 do
|
for r := Args[0].ResCellRange.Row1 to Args[0].ResCellRange.Row2 do
|
||||||
|
begin
|
||||||
for c := Args[0].ResCellRange.Col1 to Args[0].ResCellRange.Col2 do
|
for c := Args[0].ResCellRange.Col1 to Args[0].ResCellRange.Col2 do
|
||||||
begin
|
begin
|
||||||
// Get value to be added. Not needed for counting (AFlag = 0)
|
// Get value to be added. Not needed for counting (AFlag = 0)
|
||||||
@ -1295,8 +1312,9 @@ begin
|
|||||||
if AFlag > 0 then
|
if AFlag > 0 then
|
||||||
begin
|
begin
|
||||||
if Length(Args) = 2 then
|
if Length(Args) = 2 then
|
||||||
addcell := (Args[0].Worksheet as TsWorksheet).FindCell(r + dr, c + dc) else
|
addcell := sheet0.FindCell(r + dr, c + dc)
|
||||||
addCell := (Args[2].Worksheet as TsWorksheet).FindCell(r + dr, c + dc);
|
else
|
||||||
|
addCell := sheet2.FindCell(r + dr, c + dc);
|
||||||
if addcell <> nil then
|
if addcell <> nil then
|
||||||
case addcell^.Contenttype of
|
case addcell^.Contenttype of
|
||||||
cctNumber : addnumber := addcell^.NumberValue;
|
cctNumber : addnumber := addcell^.NumberValue;
|
||||||
@ -1305,7 +1323,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
cell := (Args[0].Worksheet as TsWorksheet).FindCell(r, c);
|
cell := sheet0.FindCell(r, c);
|
||||||
case compareType of
|
case compareType of
|
||||||
ctNumber:
|
ctNumber:
|
||||||
if cell <> nil then
|
if cell <> nil then
|
||||||
@ -1326,6 +1344,8 @@ begin
|
|||||||
DoCompareEmpty((cell = nil) or ((cell <> nil) and (cell^.ContentType = cctEmpty)), addNumber);
|
DoCompareEmpty((cell = nil) or ((cell <> nil) and (cell^.ContentType = cctEmpty)), addNumber);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
case AFlag of
|
case AFlag of
|
||||||
0: Result := IntegerResult(n);
|
0: Result := IntegerResult(n);
|
||||||
|
Reference in New Issue
Block a user