diff options
-rw-r--r-- | sc/source/core/tool/refupdat.cxx | 4 | ||||
-rw-r--r-- | sc/source/core/tool/token.cxx | 21 |
2 files changed, 21 insertions, 4 deletions
diff --git a/sc/source/core/tool/refupdat.cxx b/sc/source/core/tool/refupdat.cxx index 602a636c6118..300dd1dce7b1 100644 --- a/sc/source/core/tool/refupdat.cxx +++ b/sc/source/core/tool/refupdat.cxx @@ -235,6 +235,8 @@ ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eUpdateRefMo { // End was sticky, but start may have been moved. Only on range. theCol2 = oldCol2; + if (eRet == UR_NOTHING) + eRet = UR_STICKY; } // Else, if (bCut2 && theCol2 == MAXCOL) then end becomes sticky, // but currently there's nothing to do. @@ -267,6 +269,8 @@ ScRefUpdateRes ScRefUpdate::Update( ScDocument* pDoc, UpdateRefMode eUpdateRefMo { // End was sticky, but start may have been moved. Only on range. theRow2 = oldRow2; + if (eRet == UR_NOTHING) + eRet = UR_STICKY; } // Else, if (bCut2 && theRow2 == MAXROW) then end becomes sticky, // but currently there's nothing to do. diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx index fd390a47d6e6..ffb9a297923b 100644 --- a/sc/source/core/tool/token.cxx +++ b/sc/source/core/tool/token.cxx @@ -2974,10 +2974,23 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnShift( const sc::RefUpdateCon if (rCxt.maRange.In(aAbs)) { - ScRange aErrorRange( ScAddress::UNINITIALIZED ); - if (!aAbs.MoveSticky(rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta, aErrorRange)) - aAbs = aErrorRange; - aRes.mbReferenceModified = true; + // We shift either by column or by row, not both, + // so moving the reference has only to be done in + // the non-sticky case. + if ((rCxt.mnRowDelta && rRef.IsEntireCol()) || (rCxt.mnColDelta && rRef.IsEntireRow())) + { + // In entire col/row, values are shifted within + // the reference, which affects all positional + // results like in MATCH or matrix positions. + aRes.mbValueChanged = true; + } + else + { + ScRange aErrorRange( ScAddress::UNINITIALIZED ); + if (!aAbs.MoveSticky(rCxt.mnColDelta, rCxt.mnRowDelta, rCxt.mnTabDelta, aErrorRange)) + aAbs = aErrorRange; + aRes.mbReferenceModified = true; + } } else if (rCxt.maRange.Intersects(aAbs)) { |