diff -urp sc.r1c1/source/core/tool/interpr1.cxx sc/source/core/tool/interpr1.cxx --- sc.r1c1/source/core/tool/interpr1.cxx 2007-11-14 10:22:17.000000000 -0500 +++ sc/source/core/tool/interpr1.cxx 2007-11-14 11:34:30.000000000 -0500 @@ -71,6 +71,7 @@ #include "jumpmatrix.hxx" #include "cellkeytranslator.hxx" #include "lookupcache.hxx" +#include "rangenam.hxx" #define SC_DOUBLE_MAXVALUE 1.7e307 @@ -5686,7 +5687,7 @@ void ScInterpreter::ScIndirectXL() conv = ScAddress::CONV_XL_R1C1; if ( MustHaveParamCount( nParamCount, 1, 2 ) ) - { + { ScAddress::Details const details( conv, aPos ); SCTAB nTab = aPos.Tab(); String sRefStr( GetString() ); @@ -5697,7 +5698,40 @@ void ScInterpreter::ScIndirectXL() else if ( ConvertSingleRef ( pDok, sRefStr, nTab, aRefAd, details ) ) PushSingleRef( aRefAd.Col(), aRefAd.Row(), aRefAd.Tab() ); else - SetIllegalArgument(); + { + do + { + ScRangeName* pNames = pDok->GetRangeName(); + if (!pNames) + break; + + USHORT nPos = 0; + if (!pNames->SearchName(sRefStr, nPos)) + break; + + ScRangeData* rData = (*pNames)[nPos]; + if (!rData) + break; + + rData->ValidateTabRefs(); + + ScRange aRange; + if (!rData->IsReference(aRange)) + break; + + if ( aRange.aStart == aRange.aEnd ) + PushSingleRef(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aStart.Tab()); + else + PushDoubleRef(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aStart.Tab(), + aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aEnd.Tab()); + + // success! + return; + } + while (false); + + SetIllegalArgument(); + } } } @@ -5719,7 +5753,41 @@ void ScInterpreter::ScIndirect() else if ( ConvertSingleRef( pDok, sRefStr, nTab, aRefAd ) ) PushSingleRef( aRefAd.Col(), aRefAd.Row(), aRefAd.Tab() ); else - SetIllegalArgument(); + { + do + { + ScRangeName* pNames = pDok->GetRangeName(); + if (!pNames) + break; + + USHORT nPos = 0; + if (!pNames->SearchName(sRefStr, nPos)) + break; + + ScRangeData* rData = (*pNames)[nPos]; + if (!rData) + break; + + // we need this in order to obtain good range + rData->ValidateTabRefs(); + + ScRange aRange; + if (!rData->IsReference(aRange)) + break; + + if ( aRange.aStart == aRange.aEnd ) + PushSingleRef(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aStart.Tab()); + else + PushDoubleRef(aRange.aStart.Col(), aRange.aStart.Row(), aRange.aStart.Tab(), + aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aEnd.Tab()); + + // success! + return; + } + while (false); + + SetIllegalArgument(); + } } } Only in sc: unxlngi6.pro