sc/inc/markarr.hxx                            |    5 -
 sc/inc/markdata.hxx                           |   11 +--
 sc/inc/markmulti.hxx                          |   16 ++--
 sc/qa/unit/copy_paste_test.cxx                |    2 
 sc/qa/unit/mark_test.cxx                      |   34 +++++----
 sc/qa/unit/parallelism.cxx                    |    6 -
 sc/qa/unit/subsequent_filters-test.cxx        |    4 -
 sc/qa/unit/ucalc.cxx                          |   88 ++++++++++++------------
 sc/qa/unit/ucalc_condformat.cxx               |    2 
 sc/qa/unit/ucalc_formula.cxx                  |   70 +++++++++----------
 sc/qa/unit/ucalc_sharedformula.cxx            |   20 ++---
 sc/source/core/data/colcontainer.cxx          |    4 -
 sc/source/core/data/conditio.cxx              |    2 
 sc/source/core/data/documen2.cxx              |   20 +++--
 sc/source/core/data/markarr.cxx               |   37 +++++-----
 sc/source/core/data/markdata.cxx              |   92 +++++++++++++++++---------
 sc/source/core/data/markmulti.cxx             |   74 ++++++++++++--------
 sc/source/core/data/table2.cxx                |    2 
 sc/source/core/tool/chgtrack.cxx              |    2 
 sc/source/filter/excel/xelink.cxx             |    2 
 sc/source/ui/Accessibility/AccessibleCell.cxx |    2 
 sc/source/ui/app/transobj.cxx                 |    4 -
 sc/source/ui/dataprovider/dataprovider.cxx    |    2 
 sc/source/ui/docshell/arealink.cxx            |    4 -
 sc/source/ui/docshell/dbdocfun.cxx            |    2 
 sc/source/ui/docshell/dbdocimp.cxx            |    4 -
 sc/source/ui/docshell/docfunc.cxx             |   28 +++----
 sc/source/ui/docshell/docsh.cxx               |    2 
 sc/source/ui/docshell/docsh5.cxx              |    4 -
 sc/source/ui/docshell/impex.cxx               |    4 -
 sc/source/ui/drawfunc/futext3.cxx             |    2 
 sc/source/ui/navipi/content.cxx               |    2 
 sc/source/ui/undo/undoblk.cxx                 |   14 +--
 sc/source/ui/undo/undoblk3.cxx                |    2 
 sc/source/ui/unoobj/cellsuno.cxx              |   38 +++++-----
 sc/source/ui/unoobj/cursuno.cxx               |    4 -
 sc/source/ui/unoobj/docuno.cxx                |   12 +--
 sc/source/ui/unoobj/funcuno.cxx               |    4 -
 sc/source/ui/vba/vbarange.cxx                 |    2 
 sc/source/ui/vba/vbaworksheets.cxx            |    2 
 sc/source/ui/view/cellsh1.cxx                 |    2 
 sc/source/ui/view/gridwin.cxx                 |    2 
 sc/source/ui/view/gridwin4.cxx                |    2 
 sc/source/ui/view/viewdata.cxx                |    6 +
 sc/source/ui/view/viewfun4.cxx                |    2 
 sc/source/ui/view/viewfun5.cxx                |    2 
 sc/source/ui/view/viewfunc.cxx                |    4 -
 47 files changed, 356 insertions(+), 295 deletions(-)

New commits:
commit 9ab64dc48a6a61edce6ff3724093162ca1cf8331
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Fri May 29 16:14:52 2020 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Sat May 30 10:49:19 2020 +0200

    pass ScSheetLimits around
    
    instead of MAXROW, MAXCOL. In preparation for more conversion work that
    needs to be done to make jumbo sheets work.
    
    Change-Id: I4698b8fe111e060ae2a965afc7276b7e7bfb482a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95153
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sc/inc/markarr.hxx b/sc/inc/markarr.hxx
index 692814374069..ac212b0e7c2a 100644
--- a/sc/inc/markarr.hxx
+++ b/sc/inc/markarr.hxx
@@ -24,6 +24,7 @@
 #include <vector>
 
 class ScRangeList;
+struct ScSheetLimits;
 
 struct ScMarkEntry
 {
@@ -41,14 +42,14 @@ struct ScMarkEntry
 */
 class SC_DLLPUBLIC ScMarkArray
 {
+    const ScSheetLimits &       mrSheetLimits;
     std::vector<ScMarkEntry>    mvData;
-    SCROW                       mnMaxRow;
 
 friend class ScMarkArrayIter;
 friend class ScDocument;                // for FillInfo
 
 public:
-            ScMarkArray(SCROW nMaxRow);
+            ScMarkArray( const ScSheetLimits& rLimits );
             ScMarkArray( ScMarkArray&& rArray ) noexcept;
             ScMarkArray( const ScMarkArray& rArray );
             ~ScMarkArray();
diff --git a/sc/inc/markdata.hxx b/sc/inc/markdata.hxx
index 485dcfbf9b12..a92e00ce3746 100644
--- a/sc/inc/markdata.hxx
+++ b/sc/inc/markdata.hxx
@@ -54,8 +54,7 @@ private:
     ScRangeList     aBottomEnvelope;        // list of ranges in the bottom 
envelope of the multi selection
     ScRangeList     aLeftEnvelope;          // list of ranges in the left 
envelope of the multi selection
     ScRangeList     aRightEnvelope;         // list of ranges in the right 
envelope of the multi selection
-    SCROW           mnMaxRow;
-    SCCOL           mnMaxCol;
+    const ScSheetLimits& mrSheetLimits;
     bool            bMarked:1;              // rectangle marked
     bool            bMultiMarked:1;
 
@@ -63,12 +62,12 @@ private:
     bool            bMarkIsNeg:1;           // cancel if multi selection
 
 public:
-    ScMarkData(SCROW nMaxRow, SCCOL nMaxCol);
-    ScMarkData(SCROW nMaxRow, SCCOL nMaxCol, const ScRangeList& rList);
+    ScMarkData(const ScSheetLimits& rSheetLimits);
+    ScMarkData(const ScSheetLimits& rSheetLimits, const ScRangeList& rList);
     ScMarkData(const ScMarkData& rData) = default;
     ScMarkData(ScMarkData&& rData) = default;
-    ScMarkData& operator=(const ScMarkData& rData) = default;
-    ScMarkData& operator=(ScMarkData&& rData) = default;
+    ScMarkData& operator=(const ScMarkData& rData);
+    ScMarkData& operator=(ScMarkData&& rData);
     ~ScMarkData();
 
     void        ResetMark();
diff --git a/sc/inc/markmulti.hxx b/sc/inc/markmulti.hxx
index 2e05c7ff2eb3..c2090183f6fb 100644
--- a/sc/inc/markmulti.hxx
+++ b/sc/inc/markmulti.hxx
@@ -35,18 +35,18 @@ private:
     typedef std::vector<ScMarkArray> MapType;
     MapType aMultiSelContainer;
     ScMarkArray aRowSel;
-    SCROW mnMaxRow;
+    const ScSheetLimits& mrSheetLimits;
 
 friend class ScMultiSelIter;
 
 public:
-    ScMultiSel(SCROW nMaxRow);
+    ScMultiSel(ScSheetLimits const &);
     ScMultiSel(const ScMultiSel& rMultiSel) = default;
     ScMultiSel(ScMultiSel&& rMultiSel) = default;
     ~ScMultiSel();
 
-    ScMultiSel& operator=(const ScMultiSel& rMultiSel) = default;
-    ScMultiSel& operator=(ScMultiSel&& rMultiSel) = default;
+    ScMultiSel& operator=(const ScMultiSel& rMultiSel);
+    ScMultiSel& operator=(ScMultiSel&& rMultiSel);
 
     SCCOL GetMultiSelectionCount() const;
     bool HasMarks( SCCOL nCol ) const;
@@ -55,16 +55,16 @@ public:
     bool IsAllMarked( SCCOL nCol, SCROW nStartRow, SCROW nEndRow ) const;
     bool HasEqualRowsMarked( SCCOL nCol1, SCCOL nCol2 ) const;
     SCROW GetNextMarked( SCCOL nCol, SCROW nRow, bool bUp ) const;
-    void SetMarkArea( const ScSheetLimits& rLimits, SCCOL nStartCol, SCCOL 
nEndCol, SCROW nStartRow, SCROW nEndRow, bool bMark );
-    void Set( const ScSheetLimits& rLimits, ScRangeList const & );
+    void SetMarkArea( SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCROW 
nEndRow, bool bMark );
+    void Set( ScRangeList const & );
     bool IsRowMarked( SCROW nRow ) const;
     bool IsRowRangeMarked( SCROW nStartRow, SCROW nEndRow ) const;
     bool IsEmpty() const { return ( aMultiSelContainer.empty() && 
!aRowSel.HasMarks() ); }
     ScMarkArray GetMarkArray( SCCOL nCol ) const;
     void Clear();
-    void MarkAllCols( const ScSheetLimits& rLimits, SCROW nStartRow, SCROW 
nEndRow );
+    void MarkAllCols( SCROW nStartRow, SCROW nEndRow );
     bool HasAnyMarks() const;
-    void ShiftCols(const ScSheetLimits& rLimits, SCCOL nStartCol, long 
nColOffset);
+    void ShiftCols(SCCOL nStartCol, long nColOffset);
     void ShiftRows(SCROW nStartRow, long nRowOffset);
 
     // For faster access from within ScMarkData, instead of creating
diff --git a/sc/qa/unit/copy_paste_test.cxx b/sc/qa/unit/copy_paste_test.cxx
index 71adbe5c8c8d..e81c0eee0957 100644
--- a/sc/qa/unit/copy_paste_test.cxx
+++ b/sc/qa/unit/copy_paste_test.cxx
@@ -88,7 +88,7 @@ void ScCopyPasteTest::testCopyPasteXLS()
     ScRefFlags nRes = aSrcRange.Parse("B2:C5", &rDoc, 
rDoc.GetAddressConvention());
     CPPUNIT_ASSERT_MESSAGE("Failed to parse.", (nRes & ScRefFlags::VALID));
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(rDoc.GetSheetLimits());
     aMark.SetMarkArea(aSrcRange);
 
     pViewShell->GetViewData().GetMarkData().SetMarkArea(aSrcRange);
diff --git a/sc/qa/unit/mark_test.cxx b/sc/qa/unit/mark_test.cxx
index 83a38baae039..b2efc9a817a7 100644
--- a/sc/qa/unit/mark_test.cxx
+++ b/sc/qa/unit/mark_test.cxx
@@ -146,7 +146,8 @@ void Test::testSimpleMark( const ScRange& rRange, const 
ScRange& rSelectionCover
                            const ScRangeList& rLeftEnvelope, const 
ScRangeList& rRightEnvelope,
                            const ScRangeList& rTopEnvelope, const ScRangeList& 
rBottomEnvelope )
 {
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScSheetLimits aSheetLimits(MAXCOL, MAXROW);
+    ScMarkData aMark(aSheetLimits);
     CPPUNIT_ASSERT( !aMark.IsMarked() && !aMark.IsMultiMarked() );
 
     aMark.SetMarkArea( rRange );
@@ -251,16 +252,16 @@ void Test::testSimpleMark_Row()
 void Test::testMultiMark( const MultiMarkTestData& rMarksData )
 {
 
-    ScMarkData aMark(MAXROW, MAXCOL);
-    ScMultiSel aMultiSel(MAXROW);
+    ScSheetLimits aSheetLimits(MAXCOL, MAXROW);
+    ScMarkData aMark(aSheetLimits);
+    ScMultiSel aMultiSel(aSheetLimits);
     CPPUNIT_ASSERT( !aMark.IsMarked() && !aMark.IsMultiMarked() );
     CPPUNIT_ASSERT_EQUAL( SCCOL(0), aMultiSel.GetMultiSelectionCount() );
     CPPUNIT_ASSERT( !aMultiSel.HasAnyMarks() );
 
     for ( const auto& rAreaTestData : rMarksData.aMarks )
     {
-        aMultiSel.SetMarkArea( ScSheetLimits(MAXCOL, MAXROW),
-                               rAreaTestData.aRange.aStart.Col(), 
rAreaTestData.aRange.aEnd.Col(),
+        aMultiSel.SetMarkArea( rAreaTestData.aRange.aStart.Col(), 
rAreaTestData.aRange.aEnd.Col(),
                                rAreaTestData.aRange.aStart.Row(), 
rAreaTestData.aRange.aEnd.Row(),
                                rAreaTestData.bMark );
         aMark.SetMultiMarkArea( rAreaTestData.aRange, rAreaTestData.bMark );
@@ -829,7 +830,8 @@ void Test::testMultiMark_NegativeMarking()
 
 void Test::testInsertTabBeforeSelected()
 {
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScSheetLimits aSheetLimits(MAXCOL, MAXROW);
+    ScMarkData aMark(aSheetLimits);
     aMark.SelectOneTable(0);
     aMark.InsertTab(0);
     CPPUNIT_ASSERT_EQUAL(SCTAB(1), aMark.GetSelectCount());
@@ -838,7 +840,8 @@ void Test::testInsertTabBeforeSelected()
 
 void Test::testInsertTabAfterSelected()
 {
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScSheetLimits aSheetLimits(MAXCOL, MAXROW);
+    ScMarkData aMark(aSheetLimits);
     aMark.SelectOneTable(0);
     aMark.InsertTab(1);
     CPPUNIT_ASSERT_EQUAL(SCTAB(1), aMark.GetSelectCount());
@@ -847,7 +850,8 @@ void Test::testInsertTabAfterSelected()
 
 void Test::testDeleteTabBeforeSelected()
 {
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScSheetLimits aSheetLimits(MAXCOL, MAXROW);
+    ScMarkData aMark(aSheetLimits);
     aMark.SelectOneTable(1);
     aMark.DeleteTab(0);
     CPPUNIT_ASSERT_EQUAL(SCTAB(1), aMark.GetSelectCount());
@@ -856,7 +860,8 @@ void Test::testDeleteTabBeforeSelected()
 
 void Test::testDeleteTabAfterSelected()
 {
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScSheetLimits aSheetLimits(MAXCOL, MAXROW);
+    ScMarkData aMark(aSheetLimits);
     aMark.SelectOneTable(0);
     aMark.DeleteTab(1);
     CPPUNIT_ASSERT_EQUAL(SCTAB(1), aMark.GetSelectCount());
@@ -873,16 +878,17 @@ void Test::testScMarkArraySearch_check(const ScMarkArray 
& ar, SCROW nRow, bool
 
 void Test::testScMarkArraySearch()
 {
+    ScSheetLimits aSheetLimits(MAXCOL, MAXROW);
     // empty
     {
-        ScMarkArray ar(MAXROW);
+        ScMarkArray ar(aSheetLimits);
         testScMarkArraySearch_check(ar, -1, true, 0);
         testScMarkArraySearch_check(ar, 100, true, 0);
     }
 
     // one range
     {
-        ScMarkArray ar(MAXROW);
+        ScMarkArray ar(aSheetLimits);
         ar.SetMarkArea(10, 20, true);
 
         // 0-9,10-20,21+
@@ -903,7 +909,7 @@ void Test::testScMarkArraySearch()
 
     // three ranges
     {
-        ScMarkArray ar(MAXROW);
+        ScMarkArray ar(aSheetLimits);
         ar.SetMarkArea(10, 20, true);
         ar.SetMarkArea(21, 30, true);
         ar.SetMarkArea(50, 100, true);
@@ -924,7 +930,7 @@ void Test::testScMarkArraySearch()
 
     // three single-row ranges
     {
-        ScMarkArray ar(MAXROW);
+        ScMarkArray ar(aSheetLimits);
         ar.SetMarkArea(4, 4, true);
         ar.SetMarkArea(6, 6, true);
         ar.SetMarkArea(8, 8, true);
@@ -944,7 +950,7 @@ void Test::testScMarkArraySearch()
 
     // one range
     {
-        ScMarkArray ar(MAXROW);
+        ScMarkArray ar(aSheetLimits);
         ar.SetMarkArea(10, MAXROW, true);
 
         // 0-10,11+
diff --git a/sc/qa/unit/parallelism.cxx b/sc/qa/unit/parallelism.cxx
index 9af1daaca9e0..ae5bf3c0b132 100644
--- a/sc/qa/unit/parallelism.cxx
+++ b/sc/qa/unit/parallelism.cxx
@@ -104,7 +104,7 @@ ScUndoCut* ScParallelismTest::cutToClip(ScDocShell& rDocSh, 
const ScRange& rRang
     ScDocument* pSrcDoc = &rDocSh.GetDocument();
 
     ScClipParam aClipParam(rRange, true);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(pSrcDoc->GetSheetLimits());
     aMark.SetMarkArea(rRange);
     pSrcDoc->CopyToClip(aClipParam, pClipDoc, &aMark, false, false);
 
@@ -135,7 +135,7 @@ ScUndoCut* ScParallelismTest::cutToClip(ScDocShell& rDocSh, 
const ScRange& rRang
 
 void ScParallelismTest::pasteFromClip(ScDocument* pDestDoc, const ScRange& 
rDestRange, ScDocument* pClipDoc)
 {
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(pDestDoc->GetSheetLimits());
     aMark.SetMarkArea(rDestRange);
     pDestDoc->CopyFromClip(rDestRange, aMark, InsertDeleteFlags::ALL, nullptr, 
pClipDoc);
 }
@@ -884,7 +884,7 @@ void 
ScParallelismTest::testFormulaGroupsInCyclesAndWithSelfReference()
     m_pDoc->SetAutoCalc(true);
 
     const ScRange aChangeRange(1, 1, 0, 1, 4, 0); // B2:B5
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
 
     // Set up clip document.
diff --git a/sc/qa/unit/subsequent_filters-test.cxx 
b/sc/qa/unit/subsequent_filters-test.cxx
index 3292058ed979..8f106f0d9da7 100644
--- a/sc/qa/unit/subsequent_filters-test.cxx
+++ b/sc/qa/unit/subsequent_filters-test.cxx
@@ -815,7 +815,7 @@ void ScFiltersTest::testFormulaDepDeleteContentsODS()
     // Delete D2:D5.
     ScDocFunc& rFunc = xDocSh->GetDocFunc();
     ScRange aRange(3,1,0,3,4,0);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(rDoc.GetSheetLimits());
     aMark.SetMarkArea(aRange);
     aMark.MarkToMulti();
     bool bGood = rFunc.DeleteContents(aMark, InsertDeleteFlags::ALL, true, 
true);
@@ -2853,7 +2853,7 @@ void ScFiltersTest::testOptimalHeightReset()
 
     // delete content of A1
     ScRange aDelRange(0,0,0,0,0,0);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(rDoc.GetSheetLimits());
     aMark.SetMarkArea(aDelRange);
     bool bRet = rFunc.DeleteContents( aMark, InsertDeleteFlags::ALL, false, 
true );
     CPPUNIT_ASSERT_MESSAGE("DeleteContents failed", bRet);
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index 0bc11aaeeaae..0dce6db3589b 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -366,7 +366,7 @@ void Test::testRangeList()
 
 void Test::testMarkData()
 {
-    ScMarkData aMarkData(MAXROW, MAXCOL);
+    ScMarkData aMarkData(m_pDoc->GetSheetLimits());
 
     // Empty mark. Nothing is selected.
     std::vector<sc::ColRowSpan> aSpans = aMarkData.GetMarkedRowSpans();
@@ -599,7 +599,7 @@ void Test::testSelectionFunction()
     ScRangeList aRanges;
     aRanges.push_back(ScRange(1,1,0,1,7,0)); // B2:B8
     aRanges.push_back(ScRange(3,1,0,3,7,0)); // D2:D8
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.MarkFromRangeList(aRanges, true);
 
     struct Check
@@ -658,7 +658,7 @@ void Test::testSelectionFunction()
     }
 
     // Make sure that when no selection is present, use the current cursor 
position.
-    ScMarkData aEmpty(MAXROW, MAXCOL);
+    ScMarkData aEmpty(m_pDoc->GetSheetLimits());
 
     {
         // D3 (numeric cell containing 5.)
@@ -747,7 +747,7 @@ void Test::testMarkedCellIteration()
     m_pDoc->SetFormula(ScAddress(2,2,0), "=SUM(1,2,3)", m_pDoc->GetGrammar());
 
     // Select A1:C5.
-    ScMarkData aMarkData(MAXROW, MAXCOL);
+    ScMarkData aMarkData(m_pDoc->GetSheetLimits());
     aMarkData.SetMarkArea(ScRange(0,0,0,2,4,0));
     aMarkData.MarkToMulti(); // TODO : we shouldn't have to do this.
 
@@ -1885,7 +1885,7 @@ void Test::testMatrixComparisonWithErrors()
 
     // Create a matrix formula in B3:B4 referencing A1:A2 and doing a greater
     // than comparison on it's values. Error value must be propagated.
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     m_pDoc->InsertMatrixFormula(1, 2, 1, 3, aMark, "=A1:A2>0");
 
@@ -1903,7 +1903,7 @@ void Test::testMatrixConditionalBooleanResult()
 
     // Create matrix formulas in A1:B1,A2:B2,A3:B3,A4:B4 producing mixed
     // boolean and numeric results in an unformatted area.
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     m_pDoc->InsertMatrixFormula( 0,0, 1,0, aMark, "=IF({1,0};TRUE();42)");  // 
{TRUE,42}
     m_pDoc->InsertMatrixFormula( 0,1, 1,1, aMark, "=IF({0,1};TRUE();42)");  // 
{42,1} aim for {42,TRUE}
@@ -1935,7 +1935,7 @@ void Test::testEnterMixedMatrix()
     m_pDoc->SetValue(1, 1, 0, val);
 
     // Create a matrix range in A4:B5 referencing A1:B2.
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     m_pDoc->InsertMatrixFormula(0, 3, 1, 4, aMark, "=A1:B2");
 
@@ -1962,7 +1962,7 @@ void Test::testMatrixEditable()
 
     // A3:A4 is a matrix.
     ScRange aMatRange(0,2,0,0,3,0);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SetMarkArea(aMatRange);
     m_pDoc->InsertMatrixFormula(0, 2, 0, 3, aMark, "=TRANSPOSE(A1:B1)");
 
@@ -3346,7 +3346,7 @@ void Test::testCopyPaste()
     ScDocumentUniquePtr pUndoDoc(new ScDocument(SCDOCMODE_UNDO));
     pUndoDoc->InitUndo(m_pDoc, 1, 1, true, true);
     std::unique_ptr<ScUndoPaste> pUndo(createUndoPaste(getDocShell(), aRange, 
std::move(pUndoDoc)));
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SetMarkArea(aRange);
     m_pDoc->CopyFromClip(aRange, aMark, InsertDeleteFlags::ALL, nullptr, 
&aClipDoc);
 
@@ -3472,7 +3472,7 @@ void Test::testCopyPasteAsLink()
     copyToClip(m_pDoc, aRange, &aClipDoc);
 
     aRange = ScRange(1,1,1,1,3,1); // Paste to B2:B4 on Sheet2.
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SetMarkArea(aRange);
     // Paste range as link.
     m_pDoc->CopyFromClip(aRange, aMark, InsertDeleteFlags::CONTENTS, nullptr, 
&aClipDoc, true, true);
@@ -3531,7 +3531,7 @@ void Test::testCopyPasteTranspose()
     aNewClipDoc.TransposeClip(pTransClip.get(), InsertDeleteFlags::ALL, false);
 
     ScRange aDestRange(3,1,1,3,3,1);//target: Sheet2.D2:D4
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SetMarkArea(aDestRange);
     m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, 
pTransClip.get());
     pTransClip.reset();
@@ -3586,7 +3586,7 @@ void Test::testCopyPasteMultiRange()
         }
     }
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
 
     // Copy A2:B2, A4:B4, and A6:B6 to clipboard.
@@ -3683,7 +3683,7 @@ void Test::testCopyPasteSkipEmpty()
     ScRange aSrcRange(0,0,0,0,4,0);
     ScRange aDestRange(1,0,0,1,4,0);
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SetMarkArea(aDestRange);
 
     // Put some texts in B1:B5.
@@ -3816,7 +3816,7 @@ void Test::testCopyPasteSkipEmpty2()
 
     // Paste to A3 with the skip empty option set.  This used to freeze. 
(fdo#77735)
     ScRange aDestRange(0,2,0,2,2,0);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SetMarkArea(aDestRange);
     m_pDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::ALL, nullptr, 
&aClipDoc, false, false, true, true);
 
@@ -3840,7 +3840,7 @@ void Test::testCutPasteRefUndo()
     // A2 references B2.
     m_pDoc->SetString(ScAddress(0,1,0), "=B2");
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
 
     // Set up clip document for cutting of B2.
@@ -3917,7 +3917,7 @@ void Test::testCutPasteGroupRefUndo()
         CPPUNIT_ASSERT_EQUAL_MESSAGE("Initial formula failure", 
OUString::createFromAscii(aDataCheck[i][1]), aString);
     }
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
 
     // Set up clip document.
@@ -4040,7 +4040,7 @@ void Test::testUndoCut()
     CPPUNIT_ASSERT_EQUAL(111.0, m_pDoc->GetValue(0,3,0));
 
     // Select A1:A3.
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     ScRange aRange(0,0,0,0,2,0);
     aMark.SetMarkArea(aRange);
     aMark.MarkToMulti();
@@ -4154,7 +4154,7 @@ void Test::testCopyPasteRelativeFormula()
     // Select and copy B3:B4 to the clipboard.
     ScRange aRange(1,2,0,1,3,0);
     ScClipParam aClipParam(aRange, false);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SetMarkArea(aRange);
     ScDocument aClipDoc(SCDOCMODE_CLIP);
     m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false);
@@ -4209,7 +4209,7 @@ void Test::testCopyPasteRepeatOneFormula()
     m_pDoc->InsertTab(0, "Test");
 
     ScDocument aClipDoc(SCDOCMODE_CLIP);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
 
     // Insert values in A1:B10.
     for (SCROW i = 0; i < 10; ++i)
@@ -4365,7 +4365,7 @@ void Test::testMergedCells()
     m_pDoc->ExtendMerge( 1, 1, nEndCol, nEndRow, 0);
     CPPUNIT_ASSERT_MESSAGE("did not merge cells", nEndCol == 3 && nEndRow == 
3);
     ScRange aRange(0,2,0,MAXCOL,2,0);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SetMarkArea(aRange);
     getDocShell().GetDocFunc().InsertCells(aRange, &aMark, INS_INSROWS_BEFORE, 
true, true);
     m_pDoc->ExtendMerge(1, 1, nEndCol, nEndRow, 0);
@@ -4552,7 +4552,7 @@ void Test::testSearchCells()
     SvxSearchItem aItem(SID_SEARCH_ITEM);
     aItem.SetSearchString("A");
     aItem.SetCommand(SvxSearchCmd::FIND_ALL);
-    ScMarkData aMarkData(MAXROW, MAXCOL);
+    ScMarkData aMarkData(m_pDoc->GetSheetLimits());
     aMarkData.SelectOneTable(0);
     SCCOL nCol = 0;
     SCROW nRow = 0;
@@ -4692,7 +4692,7 @@ void Test::testAutoFill()
 
     m_pDoc->SetValue(0,0,0,1);
 
-    ScMarkData aMarkData(MAXROW, MAXCOL);
+    ScMarkData aMarkData(m_pDoc->GetSheetLimits());
     aMarkData.SelectTable(0, true);
 
     m_pDoc->Fill( 0, 0, 0, 0, nullptr, aMarkData, 5);
@@ -4812,7 +4812,7 @@ void Test::testAutoFillSimple()
     m_pDoc->SetValue(0, 0, 0, 1);
     m_pDoc->SetString(0, 1, 0, "=10");
 
-    ScMarkData aMarkData(MAXROW, MAXCOL);
+    ScMarkData aMarkData(m_pDoc->GetSheetLimits());
     aMarkData.SelectTable(0, true);
 
     m_pDoc->Fill( 0, 0, 0, 1, nullptr, aMarkData, 6, FILL_TO_BOTTOM, 
FILL_AUTO);
@@ -4902,13 +4902,13 @@ void Test::testCopyPasteFormulasExternalDoc()
 
     ScRange aRange(0,0,0,0,5,0);
     ScClipParam aClipParam(aRange, false);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SetMarkArea(aRange);
     ScDocument aClipDoc(SCDOCMODE_CLIP);
     m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false);
 
     aRange = ScRange(1,1,1,1,6,1);
-    ScMarkData aMarkData2(MAXROW, MAXCOL);
+    ScMarkData aMarkData2(m_pDoc->GetSheetLimits());
     aMarkData2.SetMarkArea(aRange);
     rExtDoc.CopyFromClip(aRange, aMarkData2, InsertDeleteFlags::ALL, nullptr, 
&aClipDoc);
 
@@ -4957,13 +4957,13 @@ void Test::testCopyPasteReferencesExternalDoc()
 
     ScRange aRange(0,2,0,0,5,0);
     ScClipParam aClipParam(aRange, false);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SetMarkArea(aRange);
     ScDocument aClipDoc(SCDOCMODE_CLIP);
     m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark, false, false);
 
     aRange = ScRange(0,0,0,0,3,0);
-    ScMarkData aMarkData2(MAXROW, MAXCOL);
+    ScMarkData aMarkData2(m_pDoc->GetSheetLimits());
     aMarkData2.SetMarkArea(aRange);
     rExtDoc.CopyFromClip(aRange, aMarkData2, InsertDeleteFlags::ALL, nullptr, 
&aClipDoc);
 
@@ -5264,7 +5264,7 @@ void Test::testNoteDeleteRow()
 
     // Delete row 2.
     ScDocFunc& rDocFunc = getDocShell().GetDocFunc();
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     rDocFunc.DeleteCells(ScRange(0,1,0,MAXCOL,1,0), &aMark, 
DelCellCmd::CellsUp, true);
 
@@ -5368,7 +5368,7 @@ void Test::testNoteLifeCycle()
 
     ScClipParam aClipParam(aPos, false);
     ScDocument aClipDoc(SCDOCMODE_CLIP);
-    ScMarkData aMarkData(MAXROW, MAXCOL);
+    ScMarkData aMarkData(m_pDoc->GetSheetLimits());
     aMarkData.SelectOneTable(0);
     m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMarkData, false, true);
 
@@ -5503,7 +5503,7 @@ void Test::testNoteCopyPaste()
     pNote->SetText(aPos, "Note2");
 
     // Copy B2:B4 to clipboard.
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     ScRange aCopyRange(1,1,0,1,3,0);
     ScDocument aClipDoc(SCDOCMODE_CLIP);
@@ -5994,7 +5994,7 @@ void Test::testDeleteContents()
 
     // Delete D2:D6.
     ScRange aRange(3,1,0,3,5,0);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     aMark.SetMarkArea(aRange);
 
@@ -6025,7 +6025,7 @@ void Test::testTransliterateText()
     m_pDoc->SetString(ScAddress(0,2,0), "Oscar");
 
     // Change them to uppercase.
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SetMarkArea(ScRange(0,0,0,0,2,0));
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
     rFunc.TransliterateText(
@@ -6402,7 +6402,7 @@ void Test::testCopyPasteMatrixFormula()
     m_pDoc->SetValue(ScAddress(3,2,0), 11.0);   // D3
 
     // Insert matrix formula to A1
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     m_pDoc->InsertMatrixFormula(0, 0, 0, 0, aMark, 
"=COUNTIF(ISBLANK(B1:D1);TRUE())");
     m_pDoc->CalcAll();
@@ -6486,7 +6486,7 @@ void Test::testUndoDataAnchor()
     //pDrawLayer->BeginCalcUndo(false);
     // Insert a new row at row 3.
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     rFunc.InsertCells(ScRange( 0, aOldStart.Row() - 1, 0, MAXCOL, 
aOldStart.Row(), 0 ), &aMark, INS_INSROWS_BEFORE, true, true);
 
@@ -6686,7 +6686,7 @@ void Test::printRange(ScDocument* pDoc, const ScRange& 
rRange, const char* pCapt
 
 void Test::clearRange(ScDocument* pDoc, const ScRange& rRange)
 {
-    ScMarkData aMarkData(MAXROW, MAXCOL);
+    ScMarkData aMarkData(pDoc->GetSheetLimits());
     aMarkData.SetMarkArea(rRange);
     pDoc->DeleteArea(
         rRange.aStart.Col(), rRange.aStart.Row(),
@@ -6704,7 +6704,7 @@ ScUndoCut* Test::cutToClip(ScDocShell& rDocSh, const 
ScRange& rRange, ScDocument
     ScDocument* pSrcDoc = &rDocSh.GetDocument();
 
     ScClipParam aClipParam(rRange, true);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(pSrcDoc->GetSheetLimits());
     aMark.SetMarkArea(rRange);
     pSrcDoc->CopyToClip(aClipParam, pClipDoc, &aMark, false, false);
 
@@ -6736,21 +6736,21 @@ ScUndoCut* Test::cutToClip(ScDocShell& rDocSh, const 
ScRange& rRange, ScDocument
 void Test::copyToClip(ScDocument* pSrcDoc, const ScRange& rRange, ScDocument* 
pClipDoc)
 {
     ScClipParam aClipParam(rRange, false);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(pSrcDoc->GetSheetLimits());
     aMark.SetMarkArea(rRange);
     pSrcDoc->CopyToClip(aClipParam, pClipDoc, &aMark, false, false);
 }
 
 void Test::pasteFromClip(ScDocument* pDestDoc, const ScRange& rDestRange, 
ScDocument* pClipDoc)
 {
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(pDestDoc->GetSheetLimits());
     aMark.SetMarkArea(rDestRange);
     pDestDoc->CopyFromClip(rDestRange, aMark, InsertDeleteFlags::ALL, nullptr, 
pClipDoc);
 }
 
 void Test::pasteOneCellFromClip(ScDocument* pDestDoc, const ScRange& 
rDestRange, ScDocument* pClipDoc, InsertDeleteFlags eFlags)
 {
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(pDestDoc->GetSheetLimits());
     aMark.SetMarkArea(rDestRange);
     sc::CopyFromClipContext aCxt(*pDestDoc, nullptr, pClipDoc, eFlags, false, 
false);
     aCxt.setDestRange(rDestRange.aStart.Col(), rDestRange.aStart.Row(),
@@ -6763,7 +6763,7 @@ void Test::pasteOneCellFromClip(ScDocument* pDestDoc, 
const ScRange& rDestRange,
 ScUndoPaste* Test::createUndoPaste(ScDocShell& rDocSh, const ScRange& rRange, 
ScDocumentUniquePtr pUndoDoc)
 {
     ScDocument& rDoc = rDocSh.GetDocument();
-    ScMarkData aMarkData(MAXROW, MAXCOL);
+    ScMarkData aMarkData(rDoc.GetSheetLimits());
     aMarkData.SetMarkArea(rRange);
     std::unique_ptr<ScRefUndoData> pRefUndoData(new ScRefUndoData(&rDoc));
 
@@ -7010,7 +7010,7 @@ void Test::testProtectedSheetEditByRow()
 
         // Try to delete row 3.  It should fail.
         ScRange aRow3(0,2,0,MAXCOL,2,0);
-        ScMarkData aMark(MAXROW, MAXCOL);
+        ScMarkData aMark(m_pDoc->GetSheetLimits());
         aMark.SelectOneTable(0);
         bool bDeleted = rDocFunc.DeleteCells(aRow3, &aMark, DelCellCmd::Rows, 
true);
         CPPUNIT_ASSERT_MESSAGE("deletion of row 3 should fail.", !bDeleted);
@@ -7048,7 +7048,7 @@ void Test::testProtectedSheetEditByRow()
 
     {
         // Insert matrix into B2:C3.
-        ScMarkData aMark(MAXROW, MAXCOL);
+        ScMarkData aMark(m_pDoc->GetSheetLimits());
         aMark.SelectOneTable(1);
         m_pDoc->InsertMatrixFormula(1, 1, 2, 2, aMark, "={1;2|3;4}");
 
@@ -7086,7 +7086,7 @@ void Test::testProtectedSheetEditByColumn()
 
         // Try to delete column C.  It should fail.
         ScRange aCol3(2,0,0,2,MAXROW,0);
-        ScMarkData aMark(MAXROW, MAXCOL);
+        ScMarkData aMark(m_pDoc->GetSheetLimits());
         aMark.SelectOneTable(0);
         bool bDeleted = rDocFunc.DeleteCells(aCol3, &aMark, DelCellCmd::Cols, 
true);
         CPPUNIT_ASSERT_MESSAGE("deletion of column 3 should fail.", !bDeleted);
@@ -7124,7 +7124,7 @@ void Test::testProtectedSheetEditByColumn()
 
     {
         // Insert matrix into B2:C3.
-        ScMarkData aMark(MAXROW, MAXCOL);
+        ScMarkData aMark(m_pDoc->GetSheetLimits());
         aMark.SelectOneTable(1);
         m_pDoc->InsertMatrixFormula(1, 1, 2, 2, aMark, "={1;2|3;4}");
 
diff --git a/sc/qa/unit/ucalc_condformat.cxx b/sc/qa/unit/ucalc_condformat.cxx
index 24b091603b63..3c9fcefee6d2 100644
--- a/sc/qa/unit/ucalc_condformat.cxx
+++ b/sc/qa/unit/ucalc_condformat.cxx
@@ -33,7 +33,7 @@ void Test::testCopyPasteSkipEmptyConditionalFormatting()
     ScRange aDestRange(0,0,0,1,2,0);
     ScRange aSrcRange(3,3,0,5,4,0);
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SetMarkArea(aDestRange);
 
     m_pDoc->SetValue(0,0,0,1);
diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx
index 332da1efe004..920350424fb8 100644
--- a/sc/qa/unit/ucalc_formula.cxx
+++ b/sc/qa/unit/ucalc_formula.cxx
@@ -1260,7 +1260,7 @@ void 
Test::testFormulaCompilerImplicitIntersection1ParamNoChange()
         {
             if (rCase.bMatrixFormula)
             {
-                ScMarkData aMark(MAXROW, MAXCOL);
+                ScMarkData aMark(m_pDoc->GetSheetLimits());
                 aMark.SelectOneTable(0);
                 SCCOL nColStart = rCase.aCellAddress.Col();
                 SCROW nRowStart = rCase.aCellAddress.Row();
@@ -2241,7 +2241,7 @@ void Test::testFormulaRefUpdateInsertRows()
     CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(ScAddress(1,4,0)));
 
     // Insert rows over rows 1:2.
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
     rFunc.InsertCells(ScRange(0,0,0,m_pDoc->MaxCol(),1,0), &aMark, 
INS_INSROWS_BEFORE, false, true);
@@ -2396,7 +2396,7 @@ void Test::testFormulaRefUpdateInsertColumns()
     CPPUNIT_ASSERT_EQUAL(4.0, m_pDoc->GetValue(ScAddress(2,3,0)));
 
     // Insert columns over A:B.
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
     rFunc.InsertCells(ScRange(0,0,0,1,m_pDoc->MaxRow(),0), &aMark, 
INS_INSCOLS_BEFORE, false, true);
@@ -2994,7 +2994,7 @@ void Test::testFormulaRefUpdateDeleteContent()
 
     // Delete B2.
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SetMarkArea(ScAddress(1,1,0));
     rFunc.DeleteContents(aMark, InsertDeleteFlags::CONTENTS, true, true);
 
@@ -3034,7 +3034,7 @@ void Test::testFormulaRefUpdateDeleteAndShiftLeft()
     CPPUNIT_ASSERT_EQUAL(15.0, m_pDoc->GetValue(aPos));
 
     // Delete columns D:E (middle of the reference).
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
     bool bDeleted = rFunc.DeleteCells(ScRange(3,0,0,4,m_pDoc->MaxRow(),0), 
&aMark, DelCellCmd::CellsLeft, true);
@@ -3169,7 +3169,7 @@ void Test::testFormulaRefUpdateDeleteAndShiftLeft2()
     funcCheckOriginal();
 
     // Delete Column A.
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
     bool bDeleted = rFunc.DeleteCells(ScRange(0,0,0,0,m_pDoc->MaxRow(),0), 
&aMark, DelCellCmd::CellsLeft, true);
@@ -3208,7 +3208,7 @@ void Test::testFormulaRefUpdateDeleteAndShiftUp()
     CPPUNIT_ASSERT_EQUAL(15.0, m_pDoc->GetValue(aPos));
 
     // Delete rows 4:5 (middle of the reference).
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
     bool bDeleted = rFunc.DeleteCells(ScRange(0,3,0,m_pDoc->MaxCol(),4,0), 
&aMark, DelCellCmd::CellsUp, true);
@@ -3549,7 +3549,7 @@ void Test::testFormulaRefUpdateNameExpandRef()
 
     // Insert a new row at row 4, which should expand the named range to A1:A4.
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     rFunc.InsertCells(ScRange(0,3,0,m_pDoc->MaxCol(),3,0), &aMark, 
INS_INSROWS_BEFORE, false, true);
     ScRangeData* pName = m_pDoc->GetRangeName()->findByUpperName("MYRANGE");
@@ -3663,7 +3663,7 @@ void Test::testFormulaRefUpdateNameExpandRef2()
 
     // Insert a new row at row 4, which should expand the named range to A1:A4.
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
 
     // Insert a new column at column 3, which should expand the named
@@ -3708,7 +3708,7 @@ void Test::testFormulaRefUpdateNameDeleteRow()
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
 
     // Delete row 3.
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     rFunc.DeleteCells(ScRange(0,2,0,m_pDoc->MaxCol(),2,0), &aMark, 
DelCellCmd::CellsUp, true);
 
@@ -3773,7 +3773,7 @@ void Test::testFormulaRefUpdateNameDeleteRow()
 
     m_pDoc->InsertTab(1, "test2");
 
-    ScMarkData aMark2(MAXROW, MAXCOL);
+    ScMarkData aMark2(m_pDoc->GetSheetLimits());
     aMark2.SelectOneTable(1);
     rFunc.DeleteCells(ScRange(0,2,1,m_pDoc->MaxCol(),2,1), &aMark2, 
DelCellCmd::CellsUp, true);
 
@@ -4254,7 +4254,7 @@ void Test::testFormulaRefUpdateValidity()
     CPPUNIT_ASSERT_MESSAGE("Initial list is incorrect.", bGood);
 
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
 
     // Insert a new column at Column B, to move the list from C2:C4 to D2:D4.
@@ -4378,7 +4378,7 @@ void Test::testMultipleOperations()
     aParam.aRefFormulaCell = ScRefAddress(1,0,0);
     aParam.aRefFormulaEnd = aParam.aRefFormulaCell;
     aParam.aRefColCell = ScRefAddress(0,0,0);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SetMarkArea(ScRange(0,2,0,1,4,0)); // Select A3:B5.
     m_pDoc->InsertTableOp(aParam, 0, 2, 1, 4, aMark);
     CPPUNIT_ASSERT_EQUAL(20.0, m_pDoc->GetValue(1,2,0));
@@ -4463,7 +4463,7 @@ void Test::testFuncCOUNT()
     CPPUNIT_ASSERT_EQUAL(6.0, m_pDoc->GetValue(aPos));
 
     // Matrix in C1.
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     m_pDoc->InsertMatrixFormula(2, 0, 2, 0, aMark, 
"=COUNT(SEARCH(\"a\";{\"a\";\"b\";\"a\"}))");
     // Check that the #VALUE! error of "a" not found in "b" is not counted.
@@ -4568,7 +4568,7 @@ void Test::testFuncROW()
 
     // Insert a new row at row 4.
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     rFunc.InsertCells(ScRange(0,3,0,m_pDoc->MaxCol(),3,0), &aMark, 
INS_INSROWS_BEFORE, false, true);
     ASSERT_FORMULA_EQUAL(*m_pDoc, ScAddress(0,1,0), "ROW(A6)", "Wrong 
formula!");
@@ -4780,7 +4780,7 @@ void Test::testFuncMIN()
     m_pDoc->SetValue(ScAddress(1,1,0), 2.0);
 
     // Matrix in C1:C2.
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     m_pDoc->InsertMatrixFormula(2, 0, 2, 1, aMark, 
"=MIN(IF(A1:A2=\"c\";B1:B2))");
 
@@ -4992,7 +4992,7 @@ void Test::testFuncCOUNTIF()
     // Another test case adopted from tdf#99291, empty array elements should
     // not match empty cells, but cells with 0.
     clearSheet(m_pDoc, 0);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     m_pDoc->InsertMatrixFormula(0,0, 0,1, aMark, "=COUNTIF(B1:B5;C1:C2)");
     // As we will be testing for 0.0 values, check that formulas are actually 
present.
@@ -5030,7 +5030,7 @@ void Test::testFuncIF()
     CPPUNIT_ASSERT_EQUAL(OUString("not two"), 
m_pDoc->GetString(ScAddress(0,0,0)));
 
     // Test nested IF in array/matrix if the nested IF condition is a scalar.
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     m_pDoc->InsertMatrixFormula(0,2, 1,2, aMark, "=IF({1;0};IF(1;23);42)");
     // Results must be 23 and 42.
@@ -5147,7 +5147,7 @@ void Test::testFuncIFERROR()
 
     // Create a matrix range in last two rows of the range above, actual data
     // of the placeholders.
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     m_pDoc->InsertMatrixFormula(0, 20 + nRows-2, 0, 20 + nRows-1, aMark, 
"=IFERROR(3*A11:A12;1998)");
 
@@ -5330,7 +5330,7 @@ void Test::testFuncLEN()
     // Leave A1:A3 empty, and insert an array of LEN in B1:B3 that references
     // these empty cells.
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     m_pDoc->InsertMatrixFormula(1, 0, 1, 2, aMark, "=LEN(A1:A3)");
 
@@ -6282,7 +6282,7 @@ void Test::testFormulaDepTrackingDeleteRow()
 
     // Delete row 2.
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     rFunc.DeleteCells(ScRange(0,1,0,m_pDoc->MaxCol(),1,0), &aMark, 
DelCellCmd::CellsUp, true);
 
@@ -6340,7 +6340,7 @@ void Test::testFormulaDepTrackingDeleteCol()
 
     // Delete column A.  A1, B1, A3:A4 and B3:B4 should all show #REF!.
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     rFunc.DeleteCells(ScRange(0,0,0,0,m_pDoc->MaxRow(),0), &aMark, 
DelCellCmd::CellsLeft, true);
 
@@ -6425,7 +6425,7 @@ void Test::testFormulaMatrixResultUpdate()
     // Set a numeric value to A1.
     m_pDoc->SetValue(ScAddress(0,0,0), 11.0);
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     m_pDoc->InsertMatrixFormula(1, 0, 1, 0, aMark, "=A1");
     CPPUNIT_ASSERT_EQUAL(11.0, m_pDoc->GetValue(ScAddress(1,0,0)));
@@ -6797,7 +6797,7 @@ void Test::testExternalRefFunctions()
     FormulaError nErr = pFC->GetErrCode();
     CPPUNIT_ASSERT_EQUAL_MESSAGE("huge external range reference expected to 
yield FormulaError::MatrixSize", int(FormulaError::MatrixSize), 
static_cast<int>(nErr));
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     m_pDoc->InsertMatrixFormula(0,0,0,0, aMark, 
"'file:///extdata.fake'#Data.B1:AMJ1048575");
     pFC = m_pDoc->GetFormulaCell( ScAddress(0,0,0));
@@ -7054,7 +7054,7 @@ void Test::testFuncFORMULA()
     }
 
     // Matrix in D4:D6, no intersection with B1:B3
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     m_pDoc->InsertMatrixFormula(3, 3, 3, 5, aMark, "=FORMULA(B1:B3)");
     for (size_t i=0; i < SAL_N_ELEMENTS(aChecks); ++i)
@@ -7070,7 +7070,7 @@ void Test::testFuncTableRef()
     sc::AutoCalcSwitch aACSwitch(*m_pDoc, true); // turn on auto calc.
 
     m_pDoc->InsertTab(0, "Sheet1");
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     ScDocFunc& rDocFunc = getDocShell().GetDocFunc();
 
@@ -8284,7 +8284,7 @@ void Test::testFormulaErrorPropagation()
 
     m_pDoc->InsertTab(0, "Sheet1");
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     ScAddress aPos, aPos2;
     const OUString aTRUE("TRUE");
@@ -8377,7 +8377,7 @@ public:
                       std::function<double(SCROW )> const & lExpected ) const
     {
         ScDocument aClipDoc(SCDOCMODE_CLIP);
-        ScMarkData aMark(MAXROW, MAXCOL);
+        ScMarkData aMark(m_pDoc->GetSheetLimits());
 
         ScAddress aPos(nColumn, m_nStart1, 0);
         m_pDoc->SetString(aPos, rFormula);
@@ -8498,7 +8498,7 @@ void Test::testTdf97587()
     }
 
     ScDocument aClipDoc(SCDOCMODE_CLIP);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
 
     ScAddress aPos(1, 0, 0);
     m_pDoc->SetString(aPos, "=SUM(A1:A10)");
@@ -8536,7 +8536,7 @@ void Test::testMatConcat()
         }
     }
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     m_pDoc->InsertMatrixFormula(0, 12, 9, 21, aMark, "=A1:J10&A1:J10");
 
@@ -8599,7 +8599,7 @@ void Test::testMatConcatReplication()
         }
     }
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     m_pDoc->InsertMatrixFormula(0, 12, 9, 21, aMark, "=A1:J10&A1:J1");
 
@@ -8771,7 +8771,7 @@ void Test::testFuncSUMIFS()
 
     insertRangeData(m_pDoc, ScAddress(0,0,0), aData);
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     // Matrix formula in C8:C10 with SUMIFS
     m_pDoc->InsertMatrixFormula(2, 7, 2, 9, aMark, 
"=SUMIFS(B1:B7;A1:A7;A9:A11)");
@@ -8932,7 +8932,7 @@ void Test::testFuncRefListArraySUBTOTAL()
     m_pDoc->SetValue(0,5,0, 32.0);  // A6
 
     // Matrix in B7:B9, individual SUM of A2:A3, A3:A4 and A4:A5
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     m_pDoc->InsertMatrixFormula(1, 6, 1, 8, aMark, 
"=SUBTOTAL(9;OFFSET(A1;ROW(1:3);0;2))");
     ScAddress aPos(1,6,0);
@@ -9052,7 +9052,7 @@ void Test::testFuncJumpMatrixArrayIF()
     };                              // A7:B9
     insertRangeData(m_pDoc, ScAddress(0,6,0), aData);
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
 
     // Matrix in C10, summing B7,B9
@@ -9081,7 +9081,7 @@ void Test::testFuncJumpMatrixArrayOFFSET()
     };
     insertRangeData(m_pDoc, ScAddress(0,0,0), aData);   // A1:A3
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
 
     // Matrix in C5:C7, COLUMN()-3 here offsets by 0 but the entire expression
diff --git a/sc/qa/unit/ucalc_sharedformula.cxx 
b/sc/qa/unit/ucalc_sharedformula.cxx
index f076b57f8a64..87bebb4dacc6 100644
--- a/sc/qa/unit/ucalc_sharedformula.cxx
+++ b/sc/qa/unit/ucalc_sharedformula.cxx
@@ -679,7 +679,7 @@ void Test::testSharedFormulasRefUpdateRangeDeleteRow()
 
     // Delete row 3.  This will merge the two formula groups.
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     rFunc.DeleteCells(ScRange(0,2,0,MAXCOL,2,0), &aMark, DelCellCmd::Rows, 
true);
 
@@ -792,7 +792,7 @@ void Test::testSharedFormulasRefUpdateExternal()
 
     // Delete rows 1 and 2. This should not change the references in the 
formula cells below.
     ScDocFunc& rDocFunc = getDocShell().GetDocFunc();
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     rDocFunc.DeleteCells(ScRange(0,0,0,MAXCOL,1,0), &aMark, 
DelCellCmd::CellsUp, true);
 
@@ -906,7 +906,7 @@ void Test::testSharedFormulasInsertRow()
 
     // Insert a new row at row 3.
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     rFunc.InsertCells(ScRange(0,2,0,MAXCOL,2,0), &aMark, INS_INSROWS_BEFORE, 
true, true);
 
@@ -1027,7 +1027,7 @@ void Test::testSharedFormulasDeleteColumns()
     FormulaGrammarSwitch aFGSwitch(m_pDoc, 
formula::FormulaGrammar::GRAM_ENGLISH_XL_R1C1);
 
     ScDocFunc& rFunc = getDocShell().GetDocFunc();
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
 
     // First, test a single cell case.  A value in B1 and formula in C1.
@@ -2266,7 +2266,7 @@ void Test::testSharedFormulaUpdateOnReplacement()
 
     // Set up an undo object for deleting A4.
     ScRange aUndoRange(0,3,0,0,3,0);
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     aMark.SetMultiMarkArea(aUndoRange);
     ScDocumentUniquePtr pUndoDoc(new ScDocument(SCDOCMODE_UNDO));
@@ -2408,7 +2408,7 @@ void Test::testSharedFormulaDeleteTopCell()
     CPPUNIT_ASSERT_EQUAL( 3.0, m_pDoc->GetValue( ScAddress(0,1,0)));
 
     // Delete cell A1.
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
     getDocShell().GetDocFunc().DeleteCell( ScAddress(0,0,0), aMark, 
InsertDeleteFlags::CONTENTS, false);
     // Check it's gone.
@@ -2443,7 +2443,7 @@ void Test::testSharedFormulaCutCopyMoveIntoRef()
         const ScAddress aOrgPos(0,0,0);
         insertRangeData( m_pDoc, aOrgPos, aData);
 
-        ScMarkData aMark(MAXROW, MAXCOL);
+        ScMarkData aMark(m_pDoc->GetSheetLimits());
         aMark.SelectOneTable(0);
 
         // Set up clip document.
@@ -2490,7 +2490,7 @@ void Test::testSharedFormulaCutCopyMoveIntoRef()
             aPos.IncRow();
         }
 
-        ScMarkData aMark(MAXROW, MAXCOL);
+        ScMarkData aMark(m_pDoc->GetSheetLimits());
         aMark.SelectOneTable(0);
 
         // Set up clip document.
@@ -2557,7 +2557,7 @@ void Test::testSharedFormulaCutCopyMoveWithRef()
     const ScAddress aOrgPos(0,0,0);
     insertRangeData( m_pDoc, aOrgPos, aData);
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
 
     ScAddress aPos( ScAddress::UNINITIALIZED);
@@ -2651,7 +2651,7 @@ void Test::testSharedFormulaCutCopyMoveWithinRun()
         aPos.IncRow();
     }
 
-    ScMarkData aMark(MAXROW, MAXCOL);
+    ScMarkData aMark(m_pDoc->GetSheetLimits());
     aMark.SelectOneTable(0);
 
     // Set up clip document.
diff --git a/sc/source/core/data/colcontainer.cxx 
b/sc/source/core/data/colcontainer.cxx
index 74a3ca46ecfb..4a99bc16f336 100644
--- a/sc/source/core/data/colcontainer.cxx
+++ b/sc/source/core/data/colcontainer.cxx
@@ -25,7 +25,7 @@ ScColContainer::ScColContainer( const size_t nSize )
 {
     aCols.resize( nSize );
     for ( size_t nCol = 0; nCol < nSize; ++nCol )
-        aCols[nCol].reset( new ScColumn );
+        aCols[nCol].reset( new ScColumn() );
 }
 
 ScColContainer::~ScColContainer() COVERITY_NOEXCEPT_FALSE
@@ -49,7 +49,7 @@ void ScColContainer::resize( const size_t aNewColSize )
     size_t aOldColSize = aCols.size();
     aCols.resize( aNewColSize );
     for ( size_t nCol = aOldColSize; nCol < aNewColSize; ++nCol )
-        aCols[nCol].reset(new ScColumn);
+        aCols[nCol].reset(new ScColumn());
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx
index 6a150a82c60c..b18b68e1fc68 100644
--- a/sc/source/core/data/conditio.cxx
+++ b/sc/source/core/data/conditio.cxx
@@ -2231,7 +2231,7 @@ ScRangeList ScConditionalFormatList::GetCombinedRange() 
const
 void ScConditionalFormatList::RemoveFromDocument(ScDocument* pDoc) const
 {
     ScRangeList aRange = GetCombinedRange();
-    ScMarkData aMark(pDoc->MaxRow(), pDoc->MaxCol());
+    ScMarkData aMark(pDoc->GetSheetLimits());
     aMark.MarkFromRangeList(aRange, true);
     sal_uInt16 const pItems[2] = { sal_uInt16(ATTR_CONDITIONAL),0};
     pDoc->ClearSelectionItems(pItems, aMark);
diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx
index cc45c83c30d4..ac89e288bda1 100644
--- a/sc/source/core/data/documen2.cxx
+++ b/sc/source/core/data/documen2.cxx
@@ -91,6 +91,15 @@ using namespace com::sun::star;
 
 const sal_uInt16 ScDocument::nSrcVer = SC_CURRENT_VERSION;
 
+static ScSheetLimits* CreateSheetLimits()
+{
+    const ScDefaultsOptions& rOpt = SC_MOD()->GetDefaultsOptions();
+    if (rOpt.GetInitJumboSheets())
+        return new ScSheetLimits(MAXCOL_JUMBO, MAXROW_JUMBO);
+    else
+        return new ScSheetLimits(MAXCOL, MAXROW);
+}
+
 ScDocument::ScDocument( ScDocumentMode eMode, SfxObjectShell* pDocShell ) :
         
mpCellStringPool(std::make_shared<svl::SharedStringPool>(*ScGlobal::getCharClassPtr())),
         mpDocLinkMgr(new sc::DocumentLinkManager(pDocShell)),
@@ -101,13 +110,13 @@ ScDocument::ScDocument( ScDocumentMode eMode, 
SfxObjectShell* pDocShell ) :
         mpPrinter( nullptr ),
         mpVirtualDevice_100th_mm( nullptr ),
         pFormatExchangeList( nullptr ),
-        mxSheetLimits(new ScSheetLimits(MAXCOL, MAXROW)),
+        mxSheetLimits(CreateSheetLimits()),
         pFormulaTree( nullptr ),
         pEOFormulaTree( nullptr ),
         pFormulaTrack( nullptr ),
         pEOFormulaTrack( nullptr ),
         pPreviewCellStyle( nullptr ),
-        maPreviewSelection(MAXROW, MAXCOL),
+        maPreviewSelection(*mxSheetLimits),
         nUnoObjectId( 0 ),
         nRangeOverflowType( 0 ),
         aCurTextWidthCalcPos(MaxCol(),0,0),
@@ -170,12 +179,7 @@ ScDocument::ScDocument( ScDocumentMode eMode, 
SfxObjectShell* pDocShell ) :
         mbDocShellRecalc(false),
         mnMutationGuardFlags(0)
 {
-    const ScDefaultsOptions& rOpt = SC_MOD()->GetDefaultsOptions();
-    if (rOpt.GetInitJumboSheets())
-    {
-        mxSheetLimits = new ScSheetLimits(MAXCOL_JUMBO, MAXROW_JUMBO);
-    }
-    maPreviewSelection = { MaxRow(), MaxCol() };
+    maPreviewSelection = { *mxSheetLimits };
     aCurTextWidthCalcPos = { MaxCol(), 0, 0 };
 
     SetStorageGrammar( formula::FormulaGrammar::GRAM_STORAGE_DEFAULT);
diff --git a/sc/source/core/data/markarr.cxx b/sc/source/core/data/markarr.cxx
index 81481f2118f5..68fc09781a76 100644
--- a/sc/source/core/data/markarr.cxx
+++ b/sc/source/core/data/markarr.cxx
@@ -20,24 +20,27 @@
 #include <markarr.hxx>
 #include <address.hxx>
 #include <rangelst.hxx>
+#include <sheetlimits.hxx>
 #include <vector>
 
 #include <osl/diagnose.h>
 
-ScMarkArray::ScMarkArray(SCROW nMaxRow) :
-    mnMaxRow( nMaxRow )
+ScMarkArray::ScMarkArray(const ScSheetLimits& rLimits) :
+    mrSheetLimits(rLimits)
 {
     Reset(false);
 }
 
 // Move constructor
 ScMarkArray::ScMarkArray( ScMarkArray&& rOther ) noexcept
+    : mrSheetLimits(rOther.mrSheetLimits)
 {
     operator=(std::move(rOther));
 }
 
 // Copy constructor
 ScMarkArray::ScMarkArray( const ScMarkArray & rOther )
+    : mrSheetLimits(rOther.mrSheetLimits)
 {
     operator=(rOther);
 }
@@ -54,7 +57,7 @@ void ScMarkArray::Reset( bool bMarked, SCSIZE nNeeded )
     assert(nNeeded);
     mvData.resize(1);
     mvData.reserve(nNeeded);
-    mvData[0].nRow = mnMaxRow;
+    mvData[0].nRow = mrSheetLimits.mnMaxRow;
     mvData[0].bMarked = bMarked;
 }
 
@@ -104,9 +107,9 @@ bool ScMarkArray::GetMark( SCROW nRow ) const
 
 void ScMarkArray::SetMarkArea( SCROW nStartRow, SCROW nEndRow, bool bMarked )
 {
-    if (ValidRow(nStartRow, mnMaxRow) && ValidRow(nEndRow, mnMaxRow))
+    if (mrSheetLimits.ValidRow(nStartRow) && mrSheetLimits.ValidRow(nEndRow))
     {
-        if ((nStartRow == 0) && (nEndRow == mnMaxRow))
+        if ((nStartRow == 0) && (nEndRow == mrSheetLimits.mnMaxRow))
         {
             Reset(bMarked);
         }
@@ -123,7 +126,7 @@ void ScMarkArray::SetMarkArea( SCROW nStartRow, SCROW 
nEndRow, bool bMarked )
                 Search( nStartRow, nIndex );
                 ni = nIndex;
 
-                nInsert = MAXROWCOUNT;
+                nInsert = mrSheetLimits.GetMaxRowCount();
                 if ( mvData[ni].bMarked != bMarked )
                 {
                     if ( ni == 0 || (mvData[ni-1].nRow < nStartRow - 1) )
@@ -140,7 +143,7 @@ void ScMarkArray::SetMarkArea( SCROW nStartRow, SCROW 
nEndRow, bool bMarked )
                 if ( ni > 0 && mvData[ni-1].bMarked == bMarked )
                 {   // combine
                     mvData[ni-1].nRow = nEndRow;
-                    nInsert = MAXROWCOUNT;
+                    nInsert = mrSheetLimits.GetMaxRowCount();
                     bCombined = true;
                 }
             }
@@ -167,7 +170,7 @@ void ScMarkArray::SetMarkArea( SCROW nStartRow, SCROW 
nEndRow, bool bMarked )
                         else if ( ni == nInsert )
                             mvData[ni-1].nRow = nStartRow - 1;   // shrink
                     }
-                    nInsert = MAXROWCOUNT;
+                    nInsert = mrSheetLimits.GetMaxRowCount();
                     bCombined = true;
                 }
                 else if ( ni > 0 && ni == nInsert )
@@ -180,7 +183,7 @@ void ScMarkArray::SetMarkArea( SCROW nStartRow, SCROW 
nEndRow, bool bMarked )
                     mvData[ni].nRow = nEndRow;
                     mvData[ni].bMarked = bMarked;
                     ni++;
-                    nInsert = MAXROWCOUNT;
+                    nInsert = mrSheetLimits.GetMaxRowCount();
                 }
                 if ( ni < nj )
                 {   // remove entries
@@ -188,7 +191,7 @@ void ScMarkArray::SetMarkArea( SCROW nStartRow, SCROW 
nEndRow, bool bMarked )
                 }
             }
 
-            if ( nInsert < sal::static_int_cast<SCSIZE>(MAXROWCOUNT) )
+            if ( nInsert < 
sal::static_int_cast<SCSIZE>(mrSheetLimits.GetMaxRowCount()) )
             {   // insert or append new entry
                 if ( nInsert <= mvData.size() )
                 {
@@ -240,7 +243,7 @@ bool ScMarkArray::HasOneMark( SCROW& rStartRow, SCROW& 
rEndRow ) const
         if ( mvData[0].bMarked )
         {
             rStartRow = 0;
-            rEndRow = mnMaxRow;
+            rEndRow = mrSheetLimits.mnMaxRow;
             bRet = true;
         }
     }
@@ -254,7 +257,7 @@ bool ScMarkArray::HasOneMark( SCROW& rStartRow, SCROW& 
rEndRow ) const
         else
         {
             rStartRow = mvData[0].nRow + 1;
-            rEndRow = mnMaxRow;
+            rEndRow = mrSheetLimits.mnMaxRow;
         }
         bRet = true;
     }
@@ -278,21 +281,19 @@ bool ScMarkArray::operator==( const ScMarkArray& rOther ) 
const
 ScMarkArray& ScMarkArray::operator=( const ScMarkArray& rOther )
 {
     mvData = rOther.mvData;
-    mnMaxRow = rOther.mnMaxRow;
     return *this;
 }
 
 ScMarkArray& ScMarkArray::operator=(ScMarkArray&& rOther) noexcept
 {
     mvData = std::move(rOther.mvData);
-    mnMaxRow = rOther.mnMaxRow;
     return *this;
 }
 
 SCROW ScMarkArray::GetNextMarked( SCROW nRow, bool bUp ) const
 {
     SCROW nRet = nRow;
-    if (ValidRow(nRow, mnMaxRow))
+    if (mrSheetLimits.ValidRow(nRow))
     {
         SCSIZE nIndex;
         Search(nRow, nIndex);
@@ -333,7 +334,7 @@ SCROW ScMarkArray::GetMarkEnd( SCROW nRow, bool bUp ) const
 
 void ScMarkArray::Shift(SCROW nStartRow, long nOffset)
 {
-    if (nOffset == 0 || nStartRow > mnMaxRow)
+    if (nOffset == 0 || nStartRow > mrSheetLimits.mnMaxRow)
         return;
 
     for (size_t i=0; i < mvData.size(); ++i)
@@ -347,9 +348,9 @@ void ScMarkArray::Shift(SCROW nStartRow, long nOffset)
         {
             rEntry.nRow = 0;
         }
-        else if (rEntry.nRow > mnMaxRow)
+        else if (rEntry.nRow > mrSheetLimits.mnMaxRow)
         {
-            rEntry.nRow = mnMaxRow;
+            rEntry.nRow = mrSheetLimits.mnMaxRow;
         }
     }
 }
diff --git a/sc/source/core/data/markdata.cxx b/sc/source/core/data/markdata.cxx
index 6b8a99eb5237..d2983b25688a 100644
--- a/sc/source/core/data/markdata.cxx
+++ b/sc/source/core/data/markdata.cxx
@@ -32,13 +32,13 @@
 #include <osl/diagnose.h>
 
 #include <mdds/flat_segment_tree.hpp>
+#include <cassert>
 
 
-ScMarkData::ScMarkData(SCROW nMaxRow, SCCOL nMaxCol) :
+ScMarkData::ScMarkData(const ScSheetLimits& rSheetLimits) :
     maTabMarked(),
-    aMultiSel(nMaxRow),
-    mnMaxRow(nMaxRow),
-    mnMaxCol(nMaxCol)
+    aMultiSel(rSheetLimits),
+    mrSheetLimits(rSheetLimits)
 {
     ResetMark();
 }
@@ -47,6 +47,41 @@ ScMarkData::~ScMarkData()
 {
 }
 
+ScMarkData& ScMarkData::operator=(const ScMarkData& rOther)
+{
+    maTabMarked = rOther.maTabMarked;
+    aMarkRange = rOther.aMarkRange;
+    aMultiRange = rOther.aMultiRange;
+    aMultiSel = rOther.aMultiSel;
+    aTopEnvelope = rOther.aTopEnvelope;
+    aBottomEnvelope = rOther.aBottomEnvelope;
+    aLeftEnvelope = rOther.aLeftEnvelope;
+    aRightEnvelope = rOther.aRightEnvelope;
+    bMarked = rOther.bMarked;
+    bMultiMarked = rOther.bMultiMarked;
+    bMarking = rOther.bMarking;
+    bMarkIsNeg = rOther.bMarkIsNeg;
+    return *this;
+}
+
+ScMarkData& ScMarkData::operator=(ScMarkData&& rOther)
+{
+    maTabMarked = std::move(rOther.maTabMarked);
+    aMarkRange = std::move(rOther.aMarkRange);
+    aMultiRange = std::move(rOther.aMultiRange);
+    aMultiSel = std::move(rOther.aMultiSel);
+    aTopEnvelope = std::move(rOther.aTopEnvelope);
+    aBottomEnvelope = std::move(rOther.aBottomEnvelope);
+    aLeftEnvelope = std::move(rOther.aLeftEnvelope);
+    aRightEnvelope = std::move(rOther.aRightEnvelope);
+    bMarked = rOther.bMarked;
+    bMultiMarked = rOther.bMultiMarked;
+    bMarking = rOther.bMarking;
+    bMarkIsNeg = rOther.bMarkIsNeg;
+    return *this;
+}
+
+
 void ScMarkData::ResetMark()
 {
     aMultiSel.Clear();
@@ -106,7 +141,7 @@ void ScMarkData::SetMultiMarkArea( const ScRange& rRange, 
bool bMark, bool bSetu
     PutInOrder( nStartRow, nEndRow );
     PutInOrder( nStartCol, nEndCol );
 
-    aMultiSel.SetMarkArea( ScSheetLimits(mnMaxCol, mnMaxRow), nStartCol, 
nEndCol, nStartRow, nEndRow, bMark );
+    aMultiSel.SetMarkArea( nStartCol, nEndCol, nStartRow, nEndRow, bMark );
 
     if ( bMultiMarked )                 // Update aMultiRange
     {
@@ -271,10 +306,10 @@ bool ScMarkData::IsColumnMarked( SCCOL nCol ) const
 
     if ( bMarked && !bMarkIsNeg &&
                     aMarkRange.aStart.Col() <= nCol && aMarkRange.aEnd.Col() 
>= nCol &&
-                    aMarkRange.aStart.Row() == 0    && aMarkRange.aEnd.Row() 
== mnMaxRow )
+                    aMarkRange.aStart.Row() == 0    && aMarkRange.aEnd.Row() 
== mrSheetLimits.mnMaxRow )
         return true;
 
-    if ( bMultiMarked && aMultiSel.IsAllMarked( nCol, 0, mnMaxRow ) )
+    if ( bMultiMarked && aMultiSel.IsAllMarked( nCol, 0, 
mrSheetLimits.mnMaxRow ) )
         return true;
 
     return false;
@@ -286,7 +321,7 @@ bool ScMarkData::IsRowMarked( SCROW nRow ) const
     //TODO: GetMarkRowRanges for completely marked rows
 
     if ( bMarked && !bMarkIsNeg &&
-                    aMarkRange.aStart.Col() == 0    && aMarkRange.aEnd.Col() 
== mnMaxCol &&
+                    aMarkRange.aStart.Col() == 0    && aMarkRange.aEnd.Col() 
== mrSheetLimits.mnMaxCol &&
                     aMarkRange.aStart.Row() <= nRow && aMarkRange.aEnd.Row() 
>= nRow )
         return true;
 
@@ -325,10 +360,9 @@ void ScMarkData::MarkFromRangeList( const ScRangeList& 
rList, bool bReset )
 /**
   Optimise the case of constructing from a range list, speeds up import.
 */
-ScMarkData::ScMarkData(SCROW nMaxRow, SCCOL nMaxCol, const ScRangeList& rList)
-    : aMultiSel(nMaxRow),
-    mnMaxRow(nMaxRow),
-    mnMaxCol(nMaxCol)
+ScMarkData::ScMarkData(const ScSheetLimits& rLimits, const ScRangeList& rList)
+    : aMultiSel(rLimits),
+      mrSheetLimits(rLimits)
 {
     ResetMark();
 
@@ -340,7 +374,7 @@ ScMarkData::ScMarkData(SCROW nMaxRow, SCCOL nMaxCol, const 
ScRangeList& rList)
         bMultiMarked = true;
         aMultiRange = rList.Combine();
 
-        aMultiSel.Set( ScSheetLimits(mnMaxCol, mnMaxRow), rList );
+        aMultiSel.Set( rList );
     }
     else if (rList.size() == 1)
     {
@@ -447,7 +481,7 @@ std::vector<sc::ColRowSpan> ScMarkData::GetMarkedRowSpans() 
const
     typedef mdds::flat_segment_tree<SCCOLROW, bool> SpansType;
 
     ScRangeList aRanges = GetMarkedRanges();
-    SpansType aSpans(0, mnMaxRow+1, false);
+    SpansType aSpans(0, mrSheetLimits.mnMaxRow+1, false);
     SpansType::const_iterator itPos = aSpans.begin();
 
     for (size_t i = 0, n = aRanges.size(); i < n; ++i)
@@ -470,7 +504,7 @@ std::vector<sc::ColRowSpan> ScMarkData::GetMarkedColSpans() 
const
         {
             // Use segment tree to merge marked with multi marked.
             typedef mdds::flat_segment_tree<SCCOLROW, bool> SpansType;
-            SpansType aSpans(0, mnMaxCol+1, false);
+            SpansType aSpans(0, mrSheetLimits.mnMaxCol+1, false);
             SpansType::const_iterator itPos = aSpans.begin();
             do
             {
@@ -554,7 +588,7 @@ bool ScMarkData::IsAllMarked( const ScRange& rRange ) const
     SCROW nEndRow = rRange.aEnd.Row();
     bool bOk = true;
 
-    if ( nStartCol == 0 && nEndCol == mnMaxCol )
+    if ( nStartCol == 0 && nEndCol == mrSheetLimits.mnMaxCol )
         return aMultiSel.IsRowRangeMarked( nStartRow, nEndRow );
 
     for (SCCOL nCol=nStartCol; nCol<=nEndCol && bOk; nCol++)
@@ -622,7 +656,7 @@ void ScMarkData::ShiftCols(const ScDocument* pDoc, SCCOL 
nStartCol, long nColOff
     }
     else if (bMultiMarked)
     {
-        aMultiSel.ShiftCols(pDoc->GetSheetLimits(), nStartCol, nColOffset);
+        aMultiSel.ShiftCols(nStartCol, nColOffset);
         aMultiRange.IncColIfNotLessThan(pDoc, nStartCol, nColOffset);
     }
 }
@@ -667,13 +701,13 @@ void ScMarkData::GetSelectionCover( ScRange& rRange )
         SCCOL nStartCol = aMultiRange.aStart.Col(), nEndCol = 
aMultiRange.aEnd.Col();
         PutInOrder( nStartCol, nEndCol );
         nStartCol = ( nStartCol == 0 ) ? nStartCol : nStartCol - 1;
-        nEndCol = ( nEndCol == mnMaxCol ) ? nEndCol : nEndCol + 1;
+        nEndCol = ( nEndCol == mrSheetLimits.mnMaxCol ) ? nEndCol : nEndCol + 
1;
         std::unique_ptr<ScFlatBoolRowSegments> pPrevColMarkedRows;
         std::unique_ptr<ScFlatBoolRowSegments> pCurColMarkedRows;
         std::unordered_map<SCROW,ScFlatBoolColSegments> 
aRowToColSegmentsInTopEnvelope;
         std::unordered_map<SCROW,ScFlatBoolColSegments> 
aRowToColSegmentsInBottomEnvelope;
-        ScFlatBoolRowSegments aNoRowsMarked(mnMaxRow);
-        aNoRowsMarked.setFalse( 0, mnMaxRow );
+        ScFlatBoolRowSegments aNoRowsMarked(mrSheetLimits.mnMaxRow);
+        aNoRowsMarked.setFalse( 0, mrSheetLimits.mnMaxRow );
 
         bool bPrevColUnMarked = false;
 
@@ -683,8 +717,8 @@ void ScMarkData::GetSelectionCover( ScRange& rRange )
             bool bCurColUnMarked = !aMultiSel.HasMarks( nCol );
             if ( !bCurColUnMarked )
             {
-                pCurColMarkedRows.reset( new ScFlatBoolRowSegments(mnMaxRow) );
-                pCurColMarkedRows->setFalse( 0, mnMaxRow );
+                pCurColMarkedRows.reset( new 
ScFlatBoolRowSegments(mrSheetLimits.mnMaxRow) );
+                pCurColMarkedRows->setFalse( 0, mrSheetLimits.mnMaxRow );
                 ScMultiSelIter aMultiIter( aMultiSel, nCol );
                 ScFlatBoolRowSegments::ForwardIterator aPrevItr(
                     pPrevColMarkedRows ? *pPrevColMarkedRows
@@ -773,22 +807,22 @@ void ScMarkData::GetSelectionCover( ScRange& rRange )
                         lcl_AddRanges( rRange, aAddRange ); // Top envelope
                         auto it = aRowToColSegmentsInTopEnvelope.find(nTop - 
1);
                         if (it == aRowToColSegmentsInTopEnvelope.end())
-                            it = aRowToColSegmentsInTopEnvelope.emplace(nTop - 
1, ScFlatBoolColSegments(mnMaxCol)).first;
+                            it = aRowToColSegmentsInTopEnvelope.emplace(nTop - 
1, ScFlatBoolColSegments(mrSheetLimits.mnMaxCol)).first;
                         it->second.setTrue( nCol, nCol );
                     }
-                    if( nBottom < mnMaxRow )
+                    if( nBottom < mrSheetLimits.mnMaxRow )
                     {
                         ScRange aAddRange(nCol, nBottom + 1, 
aMultiRange.aStart.Tab(),
                                           nCol, nBottom + 1, 
aMultiRange.aStart.Tab());
                         lcl_AddRanges( rRange, aAddRange ); // Bottom envelope
                         auto it = 
aRowToColSegmentsInBottomEnvelope.find(nBottom + 1);
                         if (it == aRowToColSegmentsInBottomEnvelope.end())
-                            it = 
aRowToColSegmentsInBottomEnvelope.emplace(nBottom + 1, 
ScFlatBoolColSegments(mnMaxCol)).first;
+                            it = 
aRowToColSegmentsInBottomEnvelope.emplace(nBottom + 1, 
ScFlatBoolColSegments(mrSheetLimits.mnMaxCol)).first;
                         it->second.setTrue( nCol, nCol );
                     }
                 }
 
-                while( nTopPrev <= mnMaxRow && nBottomPrev <= mnMaxRow && ( 
nCol > nStartCol ) )
+                while( nTopPrev <= mrSheetLimits.mnMaxRow && nBottomPrev <= 
mrSheetLimits.mnMaxRow && ( nCol > nStartCol ) )
                 {
                     bool bRangeMarked;
                     const bool bHasValue = aPrevItr1.getValue( nTopPrev, 
bRangeMarked );
@@ -816,7 +850,7 @@ void ScMarkData::GetSelectionCover( ScRange& rRange )
                 bool bRangeMarked = false;
                 ScFlatBoolRowSegments::ForwardIterator aPrevItr(
                     pPrevColMarkedRows ? *pPrevColMarkedRows : aNoRowsMarked);
-                while( nTopPrev <= mnMaxRow && nBottomPrev <= mnMaxRow )
+                while( nTopPrev <= mrSheetLimits.mnMaxRow && nBottomPrev <= 
mrSheetLimits.mnMaxRow )
                 {
                     const bool bHasValue = aPrevItr.getValue(nTopPrev, 
bRangeMarked);
                     assert(bHasValue); (void)bHasValue;
@@ -892,12 +926,12 @@ void ScMarkData::GetSelectionCover( ScRange& rRange )
             aTopEnvelope.push_back( ScRange( nCol1, nRow1 - 1, nTab1, nCol2, 
nRow1 - 1, nTab2 ) );
             --nRow1New;
         }
-        if( nCol2 < mnMaxCol )
+        if( nCol2 < mrSheetLimits.mnMaxCol )
         {
             aRightEnvelope.push_back( ScRange( nCol2 + 1, nRow1, nTab1, nCol2 
+ 1, nRow2, nTab2 ) );
             ++nCol2New;
         }
-        if( nRow2 < mnMaxRow )
+        if( nRow2 < mrSheetLimits.mnMaxRow )
         {
             aBottomEnvelope.push_back( ScRange( nCol1, nRow2 + 1, nTab1, 
nCol2, nRow2 + 1, nTab2 ) );
             ++nRow2New;
diff --git a/sc/source/core/data/markmulti.cxx 
b/sc/source/core/data/markmulti.cxx
index b98872aaf0ec..f14999f542c7 100644
--- a/sc/source/core/data/markmulti.cxx
+++ b/sc/source/core/data/markmulti.cxx
@@ -27,9 +27,8 @@
 
 #include <algorithm>
 
-ScMultiSel::ScMultiSel(SCROW nMaxRow)
-    : aRowSel(nMaxRow),
-    mnMaxRow(nMaxRow)
+ScMultiSel::ScMultiSel(const ScSheetLimits& rSheetLimits)
+    : aRowSel(rSheetLimits), mrSheetLimits(rSheetLimits)
 {
 }
 
@@ -37,6 +36,21 @@ ScMultiSel::~ScMultiSel()
 {
 }
 
+ScMultiSel& ScMultiSel::operator=(const ScMultiSel& rOther)
+{
+    aMultiSelContainer = rOther.aMultiSelContainer;
+    aRowSel = rOther.aRowSel;
+    return *this;
+}
+
+ScMultiSel& ScMultiSel::operator=(ScMultiSel&& rOther)
+{
+    aMultiSelContainer = std::move(rOther.aMultiSelContainer);
+    aRowSel = std::move(rOther.aRowSel);
+    return *this;
+}
+
+
 void ScMultiSel::Clear()
 {
     aMultiSelContainer.clear();
@@ -163,18 +177,18 @@ SCROW ScMultiSel::GetNextMarked( SCCOL nCol, SCROW nRow, 
bool bUp ) const
     return ( bUp ? nRow2 : nRow1 );
 }
 
-void ScMultiSel::MarkAllCols( const ScSheetLimits& rLimits, SCROW nStartRow, 
SCROW nEndRow )
+void ScMultiSel::MarkAllCols( SCROW nStartRow, SCROW nEndRow )
 {
-    aMultiSelContainer.resize(rLimits.mnMaxCol+1, ScMarkArray(mnMaxRow));
-    for ( SCCOL nCol = rLimits.mnMaxCol; nCol >= 0; --nCol )
+    aMultiSelContainer.resize(mrSheetLimits.mnMaxCol+1, 
ScMarkArray(mrSheetLimits));
+    for ( SCCOL nCol = mrSheetLimits.mnMaxCol; nCol >= 0; --nCol )
     {
         aMultiSelContainer[nCol].SetMarkArea( nStartRow, nEndRow, true );
     }
 }
 
-void ScMultiSel::SetMarkArea( const ScSheetLimits& rLimits, SCCOL nStartCol, 
SCCOL nEndCol, SCROW nStartRow, SCROW nEndRow, bool bMark )
+void ScMultiSel::SetMarkArea( SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, 
SCROW nEndRow, bool bMark )
 {
-    if ( nStartCol == 0 && nEndCol == rLimits.mnMaxCol )
+    if ( nStartCol == 0 && nEndCol == mrSheetLimits.mnMaxCol )
     {
         aRowSel.SetMarkArea( nStartRow, nEndRow, bMark );
         if ( !bMark )
@@ -200,30 +214,30 @@ void ScMultiSel::SetMarkArea( const ScSheetLimits& 
rLimits, SCCOL nStartCol, SCC
         else
         {
             nBeg = aRowSel.GetNextMarked( nStartRow, false );
-            if ( nBeg != rLimits.GetMaxRowCount() )
+            if ( nBeg != mrSheetLimits.GetMaxRowCount() )
                 nLast = aRowSel.GetMarkEnd( nBeg, false );
         }
 
-        if ( nBeg != rLimits.GetMaxRowCount() && nLast >= nEndRow )
-            MarkAllCols( rLimits, nBeg, nEndRow );
+        if ( nBeg != mrSheetLimits.GetMaxRowCount() && nLast >= nEndRow )
+            MarkAllCols( nBeg, nEndRow );
         else
         {
-            while ( nBeg != rLimits.GetMaxRowCount() && nLast < nEndRow )
+            while ( nBeg != mrSheetLimits.GetMaxRowCount() && nLast < nEndRow )
             {
-                MarkAllCols( rLimits, nBeg, nLast );
+                MarkAllCols( nBeg, nLast );
                 nBeg = aRowSel.GetNextMarked( nLast + 1, false );
-                if ( nBeg != rLimits.GetMaxRowCount() )
+                if ( nBeg != mrSheetLimits.GetMaxRowCount() )
                     nLast = aRowSel.GetMarkEnd( nBeg, false );
             }
-            if ( nBeg != rLimits.GetMaxRowCount() && nLast >= nEndRow )
-                MarkAllCols( rLimits, nBeg, nEndRow );
+            if ( nBeg != mrSheetLimits.GetMaxRowCount() && nLast >= nEndRow )
+                MarkAllCols( nBeg, nEndRow );
         }
 
         aRowSel.SetMarkArea( nStartRow, nEndRow, false );
     }
 
     if (nEndCol >= static_cast<SCCOL>(aMultiSelContainer.size()))
-        aMultiSelContainer.resize(nEndCol+1, ScMarkArray(mnMaxRow));
+        aMultiSelContainer.resize(nEndCol+1, ScMarkArray(mrSheetLimits));
     for ( SCCOL nColIter = nEndCol; nColIter >= nStartCol; --nColIter )
         aMultiSelContainer[nColIter].SetMarkArea( nStartRow, nEndRow, bMark );
 }
@@ -232,7 +246,7 @@ void ScMultiSel::SetMarkArea( const ScSheetLimits& rLimits, 
SCCOL nStartCol, SCC
   optimised init-from-range-list. Specifically this is optimised for cases
   where we have very large data columns with lots and lots of ranges.
 */
-void ScMultiSel::Set( const ScSheetLimits& rLimits, ScRangeList const & rList )
+void ScMultiSel::Set( ScRangeList const & rList )
 {
     Clear();
     if (rList.size() == 0)
@@ -246,7 +260,7 @@ void ScMultiSel::Set( const ScSheetLimits& rLimits, 
ScRangeList const & rList )
             return lhs.aStart.Row() < rhs.aStart.Row();
         });
 
-    std::vector<std::vector<ScMarkEntry>> 
aMarkEntriesPerCol(rLimits.mnMaxCol+1);
+    std::vector<std::vector<ScMarkEntry>> 
aMarkEntriesPerCol(mrSheetLimits.mnMaxCol+1);
 
     SCCOL nMaxCol = -1;
     int i = 0;
@@ -258,7 +272,7 @@ void ScMultiSel::Set( const ScSheetLimits& rLimits, 
ScRangeList const & rList )
         SCROW nEndRow = rRange.aEnd.Row();
         assert( nEndRow >= nStartRow && "this method assumes the input data 
has ranges with endrow>=startrow");
         assert( nEndCol >= nStartCol && "this method assumes the input data 
has ranges with endcol>=startcol");
-        if ( nStartCol == 0 && nEndCol == rLimits.mnMaxCol )
+        if ( nStartCol == 0 && nEndCol == mrSheetLimits.mnMaxCol )
             aRowSel.SetMarkArea( nStartRow, nEndRow, /*bMark*/true );
         else
         {
@@ -285,7 +299,7 @@ void ScMultiSel::Set( const ScSheetLimits& rLimits, 
ScRangeList const & rList )
         ++i;
     }
 
-    aMultiSelContainer.resize(nMaxCol+1, ScMarkArray(mnMaxRow));
+    aMultiSelContainer.resize(nMaxCol+1, ScMarkArray(mrSheetLimits));
     for (SCCOL nCol = 0; nCol<=nMaxCol; ++nCol)
         if (!aMarkEntriesPerCol[nCol].empty())
         {
@@ -310,7 +324,7 @@ bool ScMultiSel::IsRowRangeMarked( SCROW nStartRow, SCROW 
nEndRow ) const
 ScMarkArray ScMultiSel::GetMarkArray( SCCOL nCol ) const
 {
     ScMultiSelIter aMultiIter( *this, nCol );
-    ScMarkArray aMarkArray(mnMaxRow);
+    ScMarkArray aMarkArray(mrSheetLimits);
     SCROW nTop, nBottom;
     while( aMultiIter.Next( nTop, nBottom ) )
         aMarkArray.SetMarkArea( nTop, nBottom, true );
@@ -327,9 +341,9 @@ bool ScMultiSel::HasAnyMarks() const
     return false;
 }
 
-void ScMultiSel::ShiftCols(const ScSheetLimits& rLimits, SCCOL nStartCol, long 
nColOffset)
+void ScMultiSel::ShiftCols(SCCOL nStartCol, long nColOffset)
 {
-    if (nStartCol > rLimits.mnMaxCol)
+    if (nStartCol > mrSheetLimits.mnMaxCol)
         return;
 
     ScMultiSel aNewMultiSel(*this);
@@ -352,11 +366,11 @@ void ScMultiSel::ShiftCols(const ScSheetLimits& rLimits, 
SCCOL nStartCol, long n
             nDestCol += nColOffset;
             if (nDestCol < 0)
                 nDestCol = 0;
-            else if (nDestCol > rLimits.mnMaxCol)
-                nDestCol = rLimits.mnMaxCol;
+            else if (nDestCol > mrSheetLimits.mnMaxCol)
+                nDestCol = mrSheetLimits.mnMaxCol;
         }
         if (nDestCol >= static_cast<SCCOL>(aMultiSelContainer.size()))
-            aMultiSelContainer.resize(nDestCol, ScMarkArray(mnMaxRow));
+            aMultiSelContainer.resize(nDestCol, ScMarkArray(mrSheetLimits));
         aMultiSelContainer[nDestCol] = aSourceArray;
         ++nCol;
     }
@@ -372,7 +386,7 @@ void ScMultiSel::ShiftCols(const ScSheetLimits& rLimits, 
SCCOL nStartCol, long n
         rNewCol = rStartPos;
         rNewCol.Intersect(rPrevPos);
         if (nStartCol + nColOffset >= 
static_cast<SCCOL>(aNewMultiSel.aMultiSelContainer.size()))
-            aNewMultiSel.aMultiSelContainer.resize(nStartCol + nColOffset, 
ScMarkArray(mnMaxRow));
+            aNewMultiSel.aMultiSelContainer.resize(nStartCol + nColOffset, 
ScMarkArray(mrSheetLimits));
         for (long i = 1; i < nColOffset; ++i)
             aMultiSelContainer[nStartCol + i] = rNewCol;
     }
@@ -407,8 +421,8 @@ ScMultiSelIter::ScMultiSelIter( const ScMultiSel& 
rMultiSel, SCCOL nCol ) :
 
     if (bHasMarks1 && bHasMarks2)
     {
-        pRowSegs.reset( new ScFlatBoolRowSegments(rMultiSel.mnMaxRow) );
-        pRowSegs->setFalse( 0, rMultiSel.mnMaxRow );
+        pRowSegs.reset( new 
ScFlatBoolRowSegments(rMultiSel.mrSheetLimits.mnMaxRow) );
+        pRowSegs->setFalse( 0, rMultiSel.mrSheetLimits.mnMaxRow );
         {
             ScMarkArrayIter aMarkIter( &rMultiSel.aRowSel );
             SCROW nTop, nBottom;
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 869d255b2b47..75a4061ef784 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -1454,7 +1454,7 @@ const ScRangeList* ScTable::GetScenarioRanges() const
     if (!pScenarioRanges)
     {
         const_cast<ScTable*>(this)->pScenarioRanges.reset(new ScRangeList);
-        ScMarkData aMark(pDocument->MaxRow(), pDocument->MaxCol());
+        ScMarkData aMark(pDocument->GetSheetLimits());
         MarkScenarioIn( aMark, ScScenarioFlags::NONE );     // always
         aMark.FillRangeListWithMarks( pScenarioRanges.get(), false );
     }
diff --git a/sc/source/core/tool/chgtrack.cxx b/sc/source/core/tool/chgtrack.cxx
index 2e445d0247ed..3a45a5f3be83 100644
--- a/sc/source/core/tool/chgtrack.cxx
+++ b/sc/source/core/tool/chgtrack.cxx
@@ -1834,7 +1834,7 @@ void ScChangeActionContent::PutValueToDoc(
                 aRange.aEnd.IncCol( nC-1 );
             if ( nR > 1 )
                 aRange.aEnd.IncRow( nR-1 );
-            ScMarkData aDestMark(pDoc->MaxRow(), pDoc->MaxCol());
+            ScMarkData aDestMark(pDoc->GetSheetLimits());
             aDestMark.SelectOneTable( aPos.Tab() );
             aDestMark.SetMarkArea( aRange );
             pDoc->InsertMatrixFormula( aPos.Col(), aPos.Row(),
diff --git a/sc/source/filter/excel/xelink.cxx 
b/sc/source/filter/excel/xelink.cxx
index 42375c20d46f..d283d7d099c3 100644
--- a/sc/source/filter/excel/xelink.cxx
+++ b/sc/source/filter/excel/xelink.cxx
@@ -1281,7 +1281,7 @@ XclExpXct::XclExpXct( const XclExpRoot& rRoot, const 
OUString& rTabName,
         sal_uInt16 nSBTab, ScExternalRefCache::TableTypeRef const & 
xCacheTable ) :
     XclExpRoot( rRoot ),
     mxCacheTable( xCacheTable ),
-    maUsedCells( MAXROW, MAXCOL ),
+    maUsedCells( rRoot.GetDoc().GetSheetLimits() ),
     maBoundRange( ScAddress::INITIALIZE_INVALID ),
     maTabName( rTabName ),
     mnSBTab( nSBTab )
diff --git a/sc/source/ui/Accessibility/AccessibleCell.cxx 
b/sc/source/ui/Accessibility/AccessibleCell.cxx
index b26e2b33b6a2..990a296383ff 100644
--- a/sc/source/ui/Accessibility/AccessibleCell.cxx
+++ b/sc/source/ui/Accessibility/AccessibleCell.cxx
@@ -567,7 +567,7 @@ bool ScAccessibleCell::IsDropdown() const
         if ( nTab+1<nTabCount && mpDoc->IsScenario(nTab+1) && 
!mpDoc->IsScenario(nTab) )
         {
             SCTAB i;
-            ScMarkData aMarks(mpDoc->MaxRow(), mpDoc->MaxCol());
+            ScMarkData aMarks(mpDoc->GetSheetLimits());
             for (i=nTab+1; i<nTabCount && mpDoc->IsScenario(i); i++)
                 mpDoc->MarkScenario( i, nTab, aMarks, false, 
ScScenarioFlags::ShowFrame );
             ScRangeList aRanges;
diff --git a/sc/source/ui/app/transobj.cxx b/sc/source/ui/app/transobj.cxx
index 912f956f930f..289217103785 100644
--- a/sc/source/ui/app/transobj.cxx
+++ b/sc/source/ui/app/transobj.cxx
@@ -646,7 +646,7 @@ ScDocShell* ScTransferObj::GetSourceDocShell()
 
 ScMarkData ScTransferObj::GetSourceMarkData() const
 {
-    ScMarkData aMarkData(m_pDoc->MaxRow(), m_pDoc->MaxCol());
+    ScMarkData aMarkData(m_pDoc->GetSheetLimits());
     ScCellRangesBase* pRangesObj = 
comphelper::getUnoTunnelImplementation<ScCellRangesBase>( m_xDragSourceRanges );
     if (pRangesObj)
     {
@@ -671,7 +671,7 @@ void ScTransferObj::InitDocShell(bool bLimitToPageSize)
         pDocSh->DoInitNew();
 
         ScDocument& rDestDoc = pDocSh->GetDocument();
-        ScMarkData aDestMark(rDestDoc.MaxRow(), rDestDoc.MaxCol());
+        ScMarkData aDestMark(rDestDoc.GetSheetLimits());
         aDestMark.SelectTable( 0, true );
 
         rDestDoc.SetDocOptions( m_pDoc->GetDocOptions() );   // #i42666#
diff --git a/sc/source/ui/dataprovider/dataprovider.cxx 
b/sc/source/ui/dataprovider/dataprovider.cxx
index 817ffce44236..8ad2ee0cf38d 100644
--- a/sc/source/ui/dataprovider/dataprovider.cxx
+++ b/sc/source/ui/dataprovider/dataprovider.cxx
@@ -237,7 +237,7 @@ void ScDBDataManager::WriteToDoc(ScDocument& rDoc)
     SCROW nRowSize = std::min<SCROW>(aDestRange.aEnd.Row() - 
aDestRange.aStart.Row(), nEndRow);
     aDestRange.aEnd.SetRow(aDestRange.aStart.Row() + nRowSize);
 
-    ScMarkData aMark(mpDoc->MaxRow(), mpDoc->MaxCol());
+    ScMarkData aMark(mpDoc->GetSheetLimits());
     aMark.SelectTable(0, true);
     mpDoc->CopyFromClip(aDestRange, aMark, InsertDeleteFlags::CONTENTS, 
nullptr, &rDoc);
     ScDocShell* pDocShell = 
static_cast<ScDocShell*>(mpDoc->GetDocumentShell());
diff --git a/sc/source/ui/docshell/arealink.cxx 
b/sc/source/ui/docshell/arealink.cxx
index b0e6c81f6243..a07b5573d8d5 100644
--- a/sc/source/ui/docshell/arealink.cxx
+++ b/sc/source/ui/docshell/arealink.cxx
@@ -375,7 +375,7 @@ bool ScAreaLink::Refresh( const OUString& rNewFile, const 
OUString& rNewFilter,
             {
                 ScRange const & rTokenRange( aSourceRanges[nRange]);
                 SCTAB nSrcTab = rTokenRange.aStart.Tab();
-                ScMarkData aSourceMark(rSrcDoc.MaxRow(), rSrcDoc.MaxCol());
+                ScMarkData aSourceMark(rSrcDoc.GetSheetLimits());
                 aSourceMark.SelectOneTable( nSrcTab );      // selecting for 
CopyToClip
                 aSourceMark.SetMarkArea( rTokenRange );
 
@@ -395,7 +395,7 @@ bool ScAreaLink::Refresh( const OUString& rNewFile, const 
OUString& rNewFilter,
 
                 aNewTokenRange.aEnd.SetCol( aNewTokenRange.aStart.Col() + 
(rTokenRange.aEnd.Col() - rTokenRange.aStart.Col()) );
                 aNewTokenRange.aEnd.SetRow( aNewTokenRange.aStart.Row() + 
(rTokenRange.aEnd.Row() - rTokenRange.aStart.Row()) );
-                ScMarkData aDestMark(rDoc.MaxRow(), rDoc.MaxCol());
+                ScMarkData aDestMark(rDoc.GetSheetLimits());
                 aDestMark.SelectOneTable( nDestTab );
                 aDestMark.SetMarkArea( aNewTokenRange );
                 rDoc.CopyFromClip( aNewTokenRange, aDestMark, 
InsertDeleteFlags::ALL, nullptr, &aClipDoc, false );
diff --git a/sc/source/ui/docshell/dbdocfun.cxx 
b/sc/source/ui/docshell/dbdocfun.cxx
index 352c77f619e9..6247132508d4 100644
--- a/sc/source/ui/docshell/dbdocfun.cxx
+++ b/sc/source/ui/docshell/dbdocfun.cxx
@@ -836,7 +836,7 @@ bool ScDBDocFunc::Query( SCTAB nTab, const ScQueryParam& 
rQueryParam,
                 aOldForm.aEnd.SetRow( aOldDest.aEnd.Row() );
                 rDoc.FitBlock( aOldForm, aNewForm, false );
 
-                ScMarkData aMark(rDoc.MaxRow(), rDoc.MaxCol());
+                ScMarkData aMark(rDoc.GetSheetLimits());
                 aMark.SelectOneTable(nDestTab);
                 SCROW nFStartY = aLocalParam.nRow1 + ( aLocalParam.bHasHeader 
? 1 : 0 );
 
diff --git a/sc/source/ui/docshell/dbdocimp.cxx 
b/sc/source/ui/docshell/dbdocimp.cxx
index 76d8333cdc78..c4960acce7b4 100644
--- a/sc/source/ui/docshell/dbdocimp.cxx
+++ b/sc/source/ui/docshell/dbdocimp.cxx
@@ -471,7 +471,7 @@ bool ScDBDocFunc::DoImport( SCTAB nTab, const 
ScImportParam& rParam,
             pUndoDBData.reset(new ScDBData( *pDBData ));
         }
 
-        ScMarkData aNewMark(rDoc.MaxRow(), rDoc.MaxCol());
+        ScMarkData aNewMark(rDoc.GetSheetLimits());
         aNewMark.SelectOneTable( nTab );
 
         if (bRecord)
@@ -535,7 +535,7 @@ bool ScDBDocFunc::DoImport( SCTAB nTab, const 
ScImportParam& rParam,
                                            nEndCol+nFormulaCols, nEndRow, nTab,
                                            InsertDeleteFlags::ATTRIB, false, 
rDoc);
             // fill formulas
-            ScMarkData aMark(rDoc.MaxRow(), rDoc.MaxCol());
+            ScMarkData aMark(rDoc.GetSheetLimits());
             aMark.SelectOneTable(nTab);
 
             sal_uLong nProgCount = nFormulaCols;
diff --git a/sc/source/ui/docshell/docfunc.cxx 
b/sc/source/ui/docshell/docfunc.cxx
index c66ddeb06a9e..f3a1f3d795ee 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -1188,7 +1188,7 @@ void ScDocFunc::PutData( const ScAddress& rPos, 
ScEditEngineDefaulter& rEngine,
         aPattern.GetItemSet().ClearItem( ATTR_HOR_JUSTIFY );    // wasn't 
removed above if no edit object
         if ( aPattern.GetItemSet().Count() > 0 )
         {
-            ScMarkData aMark(rDoc.MaxRow(), rDoc.MaxCol());
+            ScMarkData aMark(rDoc.GetSheetLimits());
             aMark.SelectTable( rPos.Tab(), true );
             aMark.SetMarkArea( ScRange( rPos ) );
             ApplyAttributes( aMark, aPattern, bApi );
@@ -1762,7 +1762,7 @@ bool ScDocFunc::InsertCells( const ScRange& rRange, const 
ScMarkData* pTabMark,
     if (bRecord && !rDoc.IsUndoEnabled())
         bRecord = false;
 
-    ScMarkData aMark(rDoc.MaxRow(), rDoc.MaxCol());
+    ScMarkData aMark(rDoc.GetSheetLimits());
     if (pTabMark)
         aMark = *pTabMark;
     else
@@ -2267,7 +2267,7 @@ bool ScDocFunc::DeleteCells( const ScRange& rRange, const 
ScMarkData* pTabMark,
     if (!rDoc.IsUndoEnabled())
         bRecord = false;
 
-    ScMarkData aMark(rDoc.MaxRow(), rDoc.MaxCol());
+    ScMarkData aMark(rDoc.GetSheetLimits());
     if (pTabMark)
         aMark = *pTabMark;
     else
@@ -2849,7 +2849,7 @@ bool ScDocFunc::MoveBlock( const ScRange& rSource, const 
ScAddress& rDestPos,
 
     ScDocumentUniquePtr pClipDoc(new ScDocument(SCDOCMODE_CLIP));
 
-    ScMarkData aSourceMark(rDoc.MaxRow(), rDoc.MaxCol());
+    ScMarkData aSourceMark(rDoc.GetSheetLimits());
     for (nTab=nStartTab; nTab<=nEndTab; nTab++)
         aSourceMark.SelectTable( nTab, true );      // select source
     aSourceMark.SetMarkArea( rSource );
@@ -2970,7 +2970,7 @@ bool ScDocFunc::MoveBlock( const ScRange& rSource, const 
ScAddress& rDestPos,
     bool bSourceHeight = false;     // adjust heights?
     if (bCut)
     {
-        ScMarkData aDelMark(rDoc.MaxRow(), rDoc.MaxCol());    // only for 
tables
+        ScMarkData aDelMark(rDoc.GetSheetLimits());    // only for tables
         for (nTab=nStartTab; nTab<=nEndTab; nTab++)
         {
             rDoc.DeleteAreaTab( nStartCol,nStartRow, nOldEndCol,nOldEndRow, 
nTab, InsertDeleteFlags::ALL );
@@ -3005,7 +3005,7 @@ bool ScDocFunc::MoveBlock( const ScRange& rSource, const 
ScAddress& rDestPos,
 
     ScRange aPasteDest( nDestCol, nDestRow, nDestTab, nDestEndCol, 
nDestEndRow, nDestEndTab );
 
-    ScMarkData aDestMark(rDoc.MaxRow(), rDoc.MaxCol());
+    ScMarkData aDestMark(rDoc.GetSheetLimits());
     for (nTab=nDestTab; nTab<=nDestEndTab; nTab++)
         aDestMark.SelectTable( nTab, true );        // select destination
     aDestMark.SetMarkArea( aPasteDest );
@@ -3755,7 +3755,7 @@ bool ScDocFunc::SetWidthOrHeight(
 
     if (bRecord)
     {
-        ScMarkData aMark(rDoc.MaxRow(), rDoc.MaxCol());
+        ScMarkData aMark(rDoc.GetSheetLimits());
         aMark.SelectOneTable( nTab );
         rDocShell.GetUndoManager()->AddUndoAction(
             std::make_unique<ScUndoWidthOrHeight>(
@@ -4191,7 +4191,7 @@ bool ScDocFunc::AutoFormat( const ScRange& rRange, const 
ScMarkData* pTabMark,
     bool bRecord = true;
     if (!rDoc.IsUndoEnabled())
         bRecord = false;
-    ScMarkData aMark(rDoc.MaxRow(), rDoc.MaxCol());
+    ScMarkData aMark(rDoc.GetSheetLimits());
     if (pTabMark)
         aMark = *pTabMark;
     else
@@ -4305,7 +4305,7 @@ bool ScDocFunc::EnterMatrix( const ScRange& rRange, const 
ScMarkData* pTabMark,
     SCROW nEndRow = rRange.aEnd.Row();
     SCTAB nEndTab = rRange.aEnd.Tab();
 
-    ScMarkData aMark(rDoc.MaxRow(), rDoc.MaxCol());
+    ScMarkData aMark(rDoc.GetSheetLimits());
     if (pTabMark)
         aMark = *pTabMark;
     else
@@ -4392,7 +4392,7 @@ bool ScDocFunc::TabOp( const ScRange& rRange, const 
ScMarkData* pTabMark,
     if (bRecord && !rDoc.IsUndoEnabled())
         bRecord = false;
 
-    ScMarkData aMark(rDoc.MaxRow(), rDoc.MaxCol());
+    ScMarkData aMark(rDoc.GetSheetLimits());
     if (pTabMark)
         aMark = *pTabMark;
     else
@@ -4536,7 +4536,7 @@ bool ScDocFunc::FillSimple( const ScRange& rRange, const 
ScMarkData* pTabMark,
     if (!rDoc.IsUndoEnabled())
         bRecord = false;
 
-    ScMarkData aMark(rDoc.MaxRow(), rDoc.MaxCol());
+    ScMarkData aMark(rDoc.GetSheetLimits());
     if (pTabMark)
         aMark = *pTabMark;
     else
@@ -4649,7 +4649,7 @@ bool ScDocFunc::FillSeries( const ScRange& rRange, const 
ScMarkData* pTabMark,
     if (!rDoc.IsUndoEnabled())
         bRecord = false;
 
-    ScMarkData aMark(rDoc.MaxRow(), rDoc.MaxCol());
+    ScMarkData aMark(rDoc.GetSheetLimits());
     if (pTabMark)
         aMark = *pTabMark;
     else
@@ -4782,7 +4782,7 @@ bool ScDocFunc::FillAuto( ScRange& rRange, const 
ScMarkData* pTabMark, FillDir e
     if (bRecord && !rDoc.IsUndoEnabled())
         bRecord = false;
 
-    ScMarkData aMark(rDoc.MaxRow(), rDoc.MaxCol());
+    ScMarkData aMark(rDoc.GetSheetLimits());
     if (pTabMark)
         aMark = *pTabMark;
     else
@@ -5461,7 +5461,7 @@ void ScDocFunc::ResizeMatrix( const ScRange& rOldRange, 
const ScAddress& rNewEnd
 
         aFormula = aFormula.copy(1, aFormula.getLength()-2);
 
-        ScMarkData aMark(rDoc.MaxRow(), rDoc.MaxCol());
+        ScMarkData aMark(rDoc.GetSheetLimits());
         aMark.SetMarkArea( rOldRange );
         aMark.SelectTable( nTab, true );
         ScRange aNewRange( rOldRange.aStart, rNewEnd );
diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index f2d80f1d5bf9..a305a1b5bc12 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -1601,7 +1601,7 @@ bool ScDocShell::ConvertFrom( SfxMedium& rMedium )
             m_aDocument.GetCellArea( nTab, nEndCol, nEndRow );
             aColWidthRange.aEnd.SetCol( nEndCol );
             aColWidthRange.aEnd.SetRow( nEndRow );
-            ScMarkData aMark(m_aDocument.MaxRow(), m_aDocument.MaxCol());
+            ScMarkData aMark(m_aDocument.GetSheetLimits());
             aMark.SetMarkArea( aColWidthRange );
             aMark.MarkToMulti();
 
diff --git a/sc/source/ui/docshell/docsh5.cxx b/sc/source/ui/docshell/docsh5.cxx
index 0e29619f582b..2df6f6ec9b8f 100644
--- a/sc/source/ui/docshell/docsh5.cxx
+++ b/sc/source/ui/docshell/docsh5.cxx
@@ -441,7 +441,7 @@ void ScDocShell::UpdatePendingRowHeights( SCTAB nUpdateTab, 
bool bBefore )
         if ( nUpdateTab >= nTabCount )
             nUpdateTab = nTabCount-1;     // nUpdateTab is inclusive
 
-        ScMarkData aUpdateSheets(m_aDocument.MaxRow(), m_aDocument.MaxCol());
+        ScMarkData aUpdateSheets(m_aDocument.GetSheetLimits());
         SCTAB nTab;
         for (nTab=0; nTab<=nUpdateTab; ++nTab)
             if ( m_aDocument.IsPendingRowHeights( nTab ) )
@@ -680,7 +680,7 @@ void ScDocShell::UseScenario( SCTAB nTab, const OUString& 
rName, bool bRecord )
             if ( m_aDocument.TestCopyScenario( nSrcTab, nTab ) )          // 
test cell protection
             {
                 ScDocShellModificator aModificator( *this );
-                ScMarkData aScenMark(m_aDocument.MaxRow(), 
m_aDocument.MaxCol());
+                ScMarkData aScenMark(m_aDocument.GetSheetLimits());
                 m_aDocument.MarkScenario( nSrcTab, nTab, aScenMark );
                 ScRange aMultiRange;
                 aScenMark.GetMultiMarkArea( aMultiRange );
diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx
index 7912d7ec389a..50ce540eb893 100644
--- a/sc/source/ui/docshell/impex.cxx
+++ b/sc/source/ui/docshell/impex.cxx
@@ -262,7 +262,7 @@ void ScImportExport::EndPaste(bool bAutoRowHeight)
         ScDocumentUniquePtr pRedoDoc(new ScDocument( SCDOCMODE_UNDO ));
         pRedoDoc->InitUndo( pDoc, aRange.aStart.Tab(), aRange.aEnd.Tab() );
         pDoc->CopyToDocument(aRange, InsertDeleteFlags::ALL | 
InsertDeleteFlags::NOCAPTIONS, false, *pRedoDoc);
-        ScMarkData aDestMark(pRedoDoc->MaxRow(), pRedoDoc->MaxCol());
+        ScMarkData aDestMark(pRedoDoc->GetSheetLimits());
         aDestMark.SetMarkArea(aRange);
         pDocSh->GetUndoManager()->AddUndoAction(
             std::make_unique<ScUndoPaste>(pDocSh, aRange, aDestMark, 
std::move(pUndoDoc), std::move(pRedoDoc), InsertDeleteFlags::ALL, nullptr));
@@ -1949,7 +1949,7 @@ bool ScImportExport::Sylk2Doc( SvStream& rStrm )
                             pDoc->CheckLinkFormulaNeedingCheck(*xCode);
                             if ( ch == 'M' )
                             {
-                                ScMarkData aMark(pDoc->MaxRow(), 
pDoc->MaxCol());
+                                ScMarkData aMark(pDoc->GetSheetLimits());
                                 aMark.SelectTable( aPos.Tab(), true );
                                 pDoc->InsertMatrixFormula( nCol, nRow, nRefCol,
                                     nRefRow, aMark, EMPTY_OUSTRING, 
xCode.get() );
diff --git a/sc/source/ui/drawfunc/futext3.cxx 
b/sc/source/ui/drawfunc/futext3.cxx
index 7da2e6128493..a41a64b8a684 100644
--- a/sc/source/ui/drawfunc/futext3.cxx
+++ b/sc/source/ui/drawfunc/futext3.cxx
@@ -160,7 +160,7 @@ void FuText::StopEditMode()
 
                 // Make sure the former area of the note anchor is invalidated.
                 ScRangeList aRangeList(aNotePos);
-                ScMarkData aMarkData(rDoc.MaxRow(), rDoc.MaxCol(), aRangeList);
+                ScMarkData aMarkData(rDoc.GetSheetLimits(), aRangeList);
                 rViewShell.UpdateSelectionArea(aMarkData);
             }
             else if( bNewNote || bDeleteNote )
diff --git a/sc/source/ui/navipi/content.cxx b/sc/source/ui/navipi/content.cxx
index 7feaee017a33..7675f7c93f6a 100644
--- a/sc/source/ui/navipi/content.cxx
+++ b/sc/source/ui/navipi/content.cxx
@@ -1188,7 +1188,7 @@ static bool lcl_DoDragCells( ScDocShell* pSrcShell, const 
ScRange& rRange, ScDra
     bool bDisallow = true;
 
     ScDocument& rSrcDoc = pSrcShell->GetDocument();
-    ScMarkData aMark(rSrcDoc.MaxRow(), rSrcDoc.MaxCol());
+    ScMarkData aMark(rSrcDoc.GetSheetLimits());
     aMark.SelectTable( rRange.aStart.Tab(), true );
     aMark.SetMarkArea( rRange );
 
diff --git a/sc/source/ui/undo/undoblk.cxx b/sc/source/ui/undo/undoblk.cxx
index d9f89078e6e6..b9145c286ecd 100644
--- a/sc/source/ui/undo/undoblk.cxx
+++ b/sc/source/ui/undo/undoblk.cxx
@@ -464,7 +464,7 @@ void ScUndoDeleteCells::DoChange( const bool bUndo )
                     aWorkRange.aEnd.SetCol(rDoc.MaxCol());
                 if ( eCmd==DelCellCmd::Rows || eCmd==DelCellCmd::CellsUp )
                     aWorkRange.aEnd.SetRow(rDoc.MaxRow());
-                ScMarkData aMarkData(rDoc.MaxRow(), rDoc.MaxCol());
+                ScMarkData aMarkData(rDoc.GetSheetLimits());
                 aMarkData.SelectOneTable( aWorkRange.aStart.Tab() );
                 ScPatternAttr aPattern( rDoc.GetPool() );
                 aPattern.GetItemSet().Put( ScMergeFlagAttr() );
@@ -1082,7 +1082,7 @@ void ScUndoPaste::DoChange(bool bUndo)
         ScRange& rDrawRange = aDrawRanges[i];
         rDoc.ExtendMerge(rDrawRange, true);      // only needed for single 
sheet (text/rtf etc.)
         ScRangeList aRangeList(rDrawRange);
-        ScMarkData aData(rDoc.MaxRow(), rDoc.MaxCol(), aRangeList);
+        ScMarkData aData(rDoc.GetSheetLimits(), aRangeList);
         if (bPaintAll)
         {
             rDrawRange.aStart.SetCol(0);
@@ -1407,7 +1407,7 @@ void ScUndoDragDrop::Redo()
         of drawing undo actions. */
 
     SCTAB nTab;
-    ScMarkData aSourceMark(rDoc.MaxRow(), rDoc.MaxCol());
+    ScMarkData aSourceMark(rDoc.GetSheetLimits());
     for (nTab=aSrcRange.aStart.Tab(); nTab<=aSrcRange.aEnd.Tab(); nTab++)
         aSourceMark.SelectTable( nTab, true );
 
@@ -1426,7 +1426,7 @@ void ScUndoDragDrop::Redo()
         PaintArea( aSrcPaintRange, nExtFlags );
     }
 
-    ScMarkData aDestMark(rDoc.MaxRow(), rDoc.MaxCol());
+    ScMarkData aDestMark(rDoc.GetSheetLimits());
     for (nTab=aDestRange.aStart.Tab(); nTab<=aDestRange.aEnd.Tab(); nTab++)
         aDestMark.SelectTable( nTab, true );
 
@@ -1916,7 +1916,7 @@ void ScUndoEnterMatrix::Redo()
 
     ScDocument& rDoc = pDocShell->GetDocument();
 
-    ScMarkData aDestMark(rDoc.MaxRow(), rDoc.MaxCol());
+    ScMarkData aDestMark(rDoc.GetSheetLimits());
     aDestMark.SelectOneTable( aBlockRange.aStart.Tab() );
     aDestMark.SetMarkArea( aBlockRange );
 
@@ -2364,7 +2364,7 @@ void ScUndoBorder::Undo()
     BeginUndo();
 
     ScDocument& rDoc = pDocShell->GetDocument();
-    ScMarkData aMarkData(rDoc.MaxRow(), rDoc.MaxCol());
+    ScMarkData aMarkData(rDoc.GetSheetLimits());
     aMarkData.MarkFromRangeList(*xRanges, false);
     xUndoDoc->CopyToDocument(aBlockRange, InsertDeleteFlags::ATTRIB, true, 
rDoc, &aMarkData);
     pDocShell->PostPaint( aBlockRange, PaintPartFlags::Grid, SC_PF_LINES | 
SC_PF_TESTMERGE );
@@ -2383,7 +2383,7 @@ void ScUndoBorder::Redo()
         ScRange const & rRange = (*xRanges)[i];
         SCTAB nTab = rRange.aStart.Tab();
 
-        ScMarkData aMark(rDoc.MaxRow(), rDoc.MaxCol());
+        ScMarkData aMark(rDoc.GetSheetLimits());
         aMark.SetMarkArea( rRange );
         aMark.SelectTable( nTab, true );
 
diff --git a/sc/source/ui/undo/undoblk3.cxx b/sc/source/ui/undo/undoblk3.cxx
index a386cbd6db0e..f08e420a4ad8 100644
--- a/sc/source/ui/undo/undoblk3.cxx
+++ b/sc/source/ui/undo/undoblk3.cxx
@@ -859,7 +859,7 @@ void ScUndoAutoFormat::Redo()
         sc::RowHeightContext aCxt(rDoc.MaxRow(), nPPTX, nPPTY, aZoomX, aZoomY, 
pVirtDev);
         for (SCTAB nTab=nStartZ; nTab<=nEndZ; nTab++)
         {
-            ScMarkData aDestMark(rDoc.MaxRow(), rDoc.MaxCol());
+            ScMarkData aDestMark(rDoc.GetSheetLimits());
             aDestMark.SelectOneTable( nTab );
             aDestMark.SetMarkArea( ScRange( nStartX, nStartY, nTab, nEndX, 
nEndY, nTab ) );
             aDestMark.MarkToMulti();
diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx
index 856736b275b1..e173c2550910 100644
--- a/sc/source/ui/unoobj/cellsuno.cxx
+++ b/sc/source/ui/unoobj/cellsuno.cxx
@@ -1075,7 +1075,7 @@ void ScHelperFunctions::ApplyBorder( ScDocShell* 
pDocShell, const ScRangeList& r
             rDoc.CopyToDocument(rRange, InsertDeleteFlags::ATTRIB, false, 
*pUndoDoc);
         }
 
-        ScMarkData aMark(rDoc.MaxRow(), rDoc.MaxCol());
+        ScMarkData aMark(rDoc.GetSheetLimits());
         aMark.SetMarkArea( rRange );
         aMark.SelectTable( nTab, true );
 
@@ -1216,7 +1216,7 @@ static bool lcl_PutDataArray( ScDocShell& rDocShell, 
const ScRange& rRange,
 
     if ( pUndoDoc )
     {
-        ScMarkData aDestMark(rDoc.MaxRow(), rDoc.MaxCol());
+        ScMarkData aDestMark(rDoc.GetSheetLimits());
         aDestMark.SelectOneTable( nTab );
         rDocShell.GetUndoManager()->AddUndoAction(
             std::make_unique<ScUndoPaste>(
@@ -1313,7 +1313,7 @@ static bool lcl_PutFormulaArray( ScDocShell& rDocShell, 
const ScRange& rRange,
 
     if ( pUndoDoc )
     {
-        ScMarkData aDestMark(rDoc.MaxRow(), rDoc.MaxCol());
+        ScMarkData aDestMark(rDoc.GetSheetLimits());
         aDestMark.SelectOneTable( nTab );
         rDocShell.GetUndoManager()->AddUndoAction(
             std::make_unique<ScUndoPaste>( &rDocShell,
@@ -1527,7 +1527,7 @@ const ScMarkData* ScCellRangesBase::GetMarkData()
 {
     if (!pMarkData)
     {
-        pMarkData.reset( new ScMarkData(GetDocument()->MaxRow(), 
GetDocument()->MaxCol(), aRanges) );
+        pMarkData.reset( new ScMarkData(GetDocument()->GetSheetLimits(), 
aRanges) );
     }
     return pMarkData.get();
 }
@@ -2455,7 +2455,7 @@ void ScCellRangesBase::GetOnePropertyValue( const 
SfxItemPropertySimpleEntry* pE
                             SvxBoxInfoItem aInner(ATTR_BORDER_INNER);
 
                             ScDocument& rDoc = pDocShell->GetDocument();
-                            ScMarkData aMark(rDoc.MaxRow(), rDoc.MaxCol());
+                            ScMarkData aMark(rDoc.GetSheetLimits());
                             aMark.SetMarkArea( rFirst );
                             aMark.SelectTable( rFirst.aStart.Tab(), true );
                             rDoc.GetSelectionFrame( aMark, aOuter, aInner );
@@ -3417,7 +3417,7 @@ uno::Reference<sheet::XSheetCellRanges> SAL_CALL 
ScCellRangesBase::queryContentC
     {
         ScDocument& rDoc = pDocShell->GetDocument();
 
-        ScMarkData aMarkData(rDoc.MaxRow(), rDoc.MaxCol());
+        ScMarkData aMarkData(rDoc.GetSheetLimits());
 
         //  select matching cells
         for ( size_t i = 0, nCount = aRanges.size(); i < nCount; ++i )
@@ -3506,7 +3506,7 @@ uno::Reference<sheet::XSheetCellRanges> SAL_CALL 
ScCellRangesBase::queryFormulaC
     {
         ScDocument& rDoc = pDocShell->GetDocument();
 
-        ScMarkData aMarkData(rDoc.MaxRow(), rDoc.MaxCol());
+        ScMarkData aMarkData(rDoc.GetSheetLimits());
 
         //  select matching cells
         for ( size_t i = 0, nCount = aRanges.size(); i < nCount; ++i )

... etc. - the rest is truncated
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to