diff --git a/sc/source/ui/view/tabvwsh4.cxx b/sc/source/ui/view/tabvwsh4.cxx index bff3d4930f1f..d503fba5949a 100644 --- a/sc/source/ui/view/tabvwsh4.cxx +++ b/sc/source/ui/view/tabvwsh4.cxx @@ -2077,19 +2077,27 @@ void ScTabViewShell::HandleDuplicateRecordsRemove(const rtl::Reference> aUnionArray; - sal_uInt32 nRow = bIncludesHeaders ? 1 : 0; - sal_uInt32 lRows = aDataArray.getLength(); + SCROW nRow = bIncludesHeaders ? 1 : 0; + SCROW lRows = aDataArray.getLength(); sal_uInt32 nDeleteCount = 0; + SCROW nPrevRowDeleted = -1; + std::vector aDelRanges; while (nRow < lRows) { if (lcl_CheckInArrayRows(aUnionArray, aDataArray[nRow], rSelectedEntries)) { - table::CellRangeAddress aCellRange(aRange.Sheet, aRange.StartColumn, - aRange.StartRow + nRow - nDeleteCount, - aRange.EndColumn, aRange.StartRow + nRow - nDeleteCount); - ActiveSheet->removeRange(aCellRange, sheet::CellDeleteMode_UP); + if (nPrevRowDeleted + 1 == nRow) + aDelRanges.back().EndRow++; + else + { + table::CellRangeAddress aCellRange(aRange.Sheet, aRange.StartColumn, + aRange.StartRow + nRow - nDeleteCount, + aRange.EndColumn, aRange.StartRow + nRow - nDeleteCount); + aDelRanges.push_back(aCellRange); + } ++nDeleteCount; + nPrevRowDeleted = nRow; } else { @@ -2097,6 +2105,8 @@ void ScTabViewShell::HandleDuplicateRecordsRemove(const rtl::ReferenceremoveRange(rRange, sheet::CellDeleteMode_UP); } else {