Related: tdf#127293 Fix function XLOOKUP with nested XLOOKUP functions

to return reference of cells what other functions can use (e.g.:SUM):
=SUM(XLOOKUP(B3,B6:B10,E6:E10):XLOOKUP(C3,B6:B10,E6:E10))

XLOOKUP function returns a reference to a range of cell(s).

Change-Id: I06007aba7017315fc02a92b120f842244b7cc3c8
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163129
Tested-by: Jenkins
Reviewed-by: Balazs Varga <balazs.varga.extern@allotropia.de>
diff --git a/sc/qa/unit/data/functions/spreadsheet/fods/xlookup.fods b/sc/qa/unit/data/functions/spreadsheet/fods/xlookup.fods
index 49ecf573..fb464e0 100644
--- a/sc/qa/unit/data/functions/spreadsheet/fods/xlookup.fods
+++ b/sc/qa/unit/data/functions/spreadsheet/fods/xlookup.fods
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>

<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.spreadsheet">
 <office:meta><meta:creation-date>2024-01-16T18:30:06.278000000</meta:creation-date><meta:editing-duration>PT1H12M</meta:editing-duration><meta:editing-cycles>22</meta:editing-cycles><meta:generator>LibreOfficeDev/24.8.0.0.alpha0$Windows_X86_64 LibreOffice_project/2b1f5fa987f02ec8014dbf6837c6b090faf11f2d</meta:generator><dc:date>2024-02-01T11:50:13.789000000</dc:date><meta:document-statistic meta:table-count="2" meta:cell-count="858" meta:object-count="0"/></office:meta>
 <office:meta><meta:creation-date>2024-01-16T18:30:06.278000000</meta:creation-date><meta:editing-duration>PT1H14M20S</meta:editing-duration><meta:editing-cycles>23</meta:editing-cycles><meta:generator>LibreOfficeDev/24.8.0.0.alpha0$Windows_X86_64 LibreOffice_project/578d9be50413a4bdc809f8b5f58cc177458f8325</meta:generator><dc:date>2024-02-08T21:37:48.969000000</dc:date><meta:document-statistic meta:table-count="2" meta:cell-count="858" meta:object-count="0"/></office:meta>
 <office:settings>
  <config:config-item-set config:name="ooo:view-settings">
   <config:config-item config:name="VisibleAreaTop" config:type="int">0</config:config-item>
@@ -13,8 +13,8 @@
     <config:config-item config:name="ViewId" config:type="string">view1</config:config-item>
     <config:config-item-map-named config:name="Tables">
      <config:config-item-map-entry config:name="Sheet1">
       <config:config-item config:name="CursorPositionX" config:type="int">2</config:config-item>
       <config:config-item config:name="CursorPositionY" config:type="int">0</config:config-item>
       <config:config-item config:name="CursorPositionX" config:type="int">4</config:config-item>
       <config:config-item config:name="CursorPositionY" config:type="int">17</config:config-item>
       <config:config-item config:name="ActiveSplitRange" config:type="short">2</config:config-item>
       <config:config-item config:name="PositionLeft" config:type="int">0</config:config-item>
       <config:config-item config:name="PositionRight" config:type="int">0</config:config-item>
@@ -30,13 +30,13 @@
       <config:config-item config:name="IgnoreBreakAfterMultilineField" config:type="boolean">false</config:config-item>
      </config:config-item-map-entry>
      <config:config-item-map-entry config:name="Sheet2">
       <config:config-item config:name="CursorPositionX" config:type="int">1</config:config-item>
       <config:config-item config:name="CursorPositionY" config:type="int">115</config:config-item>
       <config:config-item config:name="CursorPositionX" config:type="int">4</config:config-item>
       <config:config-item config:name="CursorPositionY" config:type="int">43</config:config-item>
       <config:config-item config:name="ActiveSplitRange" config:type="short">2</config:config-item>
       <config:config-item config:name="PositionLeft" config:type="int">0</config:config-item>
       <config:config-item config:name="PositionRight" config:type="int">0</config:config-item>
       <config:config-item config:name="PositionTop" config:type="int">0</config:config-item>
       <config:config-item config:name="PositionBottom" config:type="int">0</config:config-item>
       <config:config-item config:name="PositionBottom" config:type="int">24</config:config-item>
       <config:config-item config:name="ZoomType" config:type="short">0</config:config-item>
       <config:config-item config:name="ZoomValue" config:type="int">65</config:config-item>
       <config:config-item config:name="PageViewZoomValue" config:type="int">60</config:config-item>
@@ -48,7 +48,7 @@
      </config:config-item-map-entry>
     </config:config-item-map-named>
     <config:config-item config:name="ActiveTable" config:type="string">Sheet1</config:config-item>
     <config:config-item config:name="HorizontalScrollbarWidth" config:type="int">1837</config:config-item>
     <config:config-item config:name="HorizontalScrollbarWidth" config:type="int">1851</config:config-item>
     <config:config-item config:name="ZoomType" config:type="short">0</config:config-item>
     <config:config-item config:name="ZoomValue" config:type="int">65</config:config-item>
     <config:config-item config:name="PageViewZoomValue" config:type="int">60</config:config-item>
@@ -126,7 +126,7 @@
   <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item>
   <config:config-item-map-named config:name="ScriptConfiguration">
    <config:config-item-map-entry config:name="Sheet1">
     <config:config-item config:name="CodeName" config:type="string">Munkalap1</config:config-item>
     <config:config-item config:name="CodeName" config:type="string">Sheet1</config:config-item>
    </config:config-item-map-entry>
    <config:config-item-map-entry config:name="Sheet2">
     <config:config-item config:name="CodeName" config:type="string">Sheet2</config:config-item>
@@ -1612,9 +1612,6 @@
  <style:style style:name="ro4" style:family="table-row">
   <style:table-row-properties style:row-height="0.529cm" fo:break-before="auto" style:use-optimal-row-height="true"/>
  </style:style>
  <style:style style:name="ro5" style:family="table-row">
   <style:table-row-properties style:row-height="1.632cm" fo:break-before="auto" style:use-optimal-row-height="true"/>
  </style:style>
  <style:style style:name="ta1" style:family="table" style:master-page-name="Default">
   <style:table-properties table:display="true" style:writing-mode="lr-tb"/>
  </style:style>
@@ -1719,7 +1716,7 @@
     <text:p><text:sheet-name>???</text:sheet-name><text:s/>(<text:title>???</text:title>)</text:p>
    </style:region-left>
    <style:region-right>
     <text:p><text:date style:data-style-name="N2" text:date-value="2024-02-01">0000.00.00</text:date>, <text:time style:data-style-name="N2" text:time-value="14:12:01.197000000">00:00:00</text:time></text:p>
     <text:p><text:date style:data-style-name="N2" text:date-value="2024-02-08">0000.00.00</text:date>, <text:time style:data-style-name="N2" text:time-value="21:35:29.191000000">00:00:00</text:time></text:p>
    </style:region-right>
   </style:header>
   <style:header-left style:display="false"/>
@@ -1998,10 +1995,10 @@
    </table:table-row>
    <table:table-row table:style-name="ro2">
     <table:table-cell table:formula="of:=COM.MICROSOFT.XLOOKUP(&quot;Ireland&quot;;[.H2:.H11];[.J2:.J11])" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>#HIÁNYZIK</text:p>
      <text:p>#N/A</text:p>
     </table:table-cell>
     <table:table-cell table:formula="of:=#N/A" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>#HIÁNYZIK</text:p>
      <text:p>#N/A</text:p>
     </table:table-cell>
     <table:table-cell table:style-name="ce18" table:formula="of:=ISNA([.A5])" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean">
      <text:p>IGAZ</text:p>
@@ -2161,10 +2158,10 @@
    </table:table-row>
    <table:table-row table:style-name="ro2">
     <table:table-cell table:formula="of:=COM.MICROSOFT.XLOOKUP(&quot;&quot;;[.H2:.H11];[.J2:.J11])" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>#HIÁNYZIK</text:p>
      <text:p>#N/A</text:p>
     </table:table-cell>
     <table:table-cell table:formula="of:=#N/A" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>#HIÁNYZIK</text:p>
      <text:p>#N/A</text:p>
     </table:table-cell>
     <table:table-cell table:style-name="ce18" table:formula="of:=ISNA([.A9])" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean">
      <text:p>IGAZ</text:p>
@@ -2509,10 +2506,10 @@
    </table:table-row>
    <table:table-row table:style-name="ro2">
     <table:table-cell table:number-matrix-columns-spanned="1" table:number-matrix-rows-spanned="2" table:formula="of:=COM.MICROSOFT.XLOOKUP(&quot;&quot;;[.I14:.R14];[.I15:.R16])" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>#HIÁNYZIK</text:p>
      <text:p>#N/A</text:p>
     </table:table-cell>
     <table:table-cell table:formula="of:=#N/A" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>#HIÁNYZIK</text:p>
      <text:p>#N/A</text:p>
     </table:table-cell>
     <table:table-cell table:style-name="ce18" table:formula="of:=ISNA([.A20])" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean">
      <text:p>IGAZ</text:p>
@@ -2524,10 +2521,10 @@
    </table:table-row>
    <table:table-row table:style-name="ro2">
     <table:table-cell office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>#HIÁNYZIK</text:p>
      <text:p>#N/A</text:p>
     </table:table-cell>
     <table:table-cell table:formula="of:=#N/A" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>#HIÁNYZIK</text:p>
      <text:p>#N/A</text:p>
     </table:table-cell>
     <table:table-cell table:style-name="ce18" table:formula="of:=ISNA([.A21])" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean">
      <text:p>IGAZ</text:p>
@@ -2712,7 +2709,7 @@
    </table:table-row>
    <table:table-row table:style-name="ro2">
     <table:table-cell table:formula="of:=COM.MICROSOFT.XLOOKUP([.G29];[.I30:.I35];[.H30:.H35];;2;2)" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>#HIÁNYZIK</text:p>
      <text:p>#N/A</text:p>
     </table:table-cell>
     <table:table-cell office:value-type="string" calcext:value-type="string">
      <text:p>#N/A</text:p>
@@ -3059,20 +3056,20 @@
     <table:table-cell table:style-name="ce18"/>
     <table:table-cell table:number-columns-repeated="17"/>
    </table:table-row>
    <table:table-row table:style-name="ro5">
     <table:table-cell table:formula="of:=SUM(COM.MICROSOFT.XLOOKUP([.G44];[.H45:.H49];[.K45:.K49]):COM.MICROSOFT.XLOOKUP([.G45];[.H45:.H49];[.K45:.K49]))" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>Hiba:502</text:p>
    <table:table-row table:style-name="ro2">
     <table:table-cell table:formula="of:=SUM(COM.MICROSOFT.XLOOKUP([.G44];[.H45:.H49];[.K45:.K49]):COM.MICROSOFT.XLOOKUP([.G45];[.H45:.H49];[.K45:.K49]))" office:value-type="float" office:value="110.56" calcext:value-type="float">
      <text:p>110,56</text:p>
     </table:table-cell>
     <table:table-cell office:value-type="float" office:value="11070" calcext:value-type="float">
      <text:p>11070</text:p>
     <table:table-cell office:value-type="float" office:value="110.56" calcext:value-type="float">
      <text:p>110,56</text:p>
     </table:table-cell>
     <table:table-cell table:style-name="ce18"/>
     <table:table-cell table:formula="of:=FORMULA([.A44])" office:value-type="string" office:string-value="=SZUM(XLOOKUP(G44;H45:H49;K45:K49):XLOOKUP(G45;H45:H49;K45:K49))" calcext:value-type="string">
      <text:p>=SZUM(XLOOKUP(G44;H45:H49;K45:K49):XLOOKUP(G45;H45:H49;K45:K49))</text:p>
     <table:table-cell table:style-name="ce18" table:formula="of:=[.A44]=[.B44]" office:value-type="boolean" office:boolean-value="true" calcext:value-type="boolean">
      <text:p>IGAZ</text:p>
     </table:table-cell>
     <table:table-cell table:style-name="ce12" office:value-type="string" calcext:value-type="string">
      <text:p>XLOOKUP should (in this case) return a range (TODO: Missing feature from Calc: Evaluate Formula)</text:p>
     <table:table-cell table:formula="of:=FORMULA([.A44])" office:value-type="string" office:string-value="=SUM(XLOOKUP(G44;H45:H49;K45:K49):XLOOKUP(G45;H45:H49;K45:K49))" calcext:value-type="string">
      <text:p>=SUM(XLOOKUP(G44;H45:H49;K45:K49):XLOOKUP(G45;H45:H49;K45:K49))</text:p>
     </table:table-cell>
     <table:table-cell table:style-name="ce12"/>
     <table:table-cell/>
     <table:table-cell office:value-type="string" calcext:value-type="string">
      <text:p>Grape</text:p>
@@ -3191,7 +3188,7 @@
    </table:table-row>
    <table:table-row table:style-name="ro2">
     <table:table-cell table:formula="of:=COM.MICROSOFT.XLOOKUP(&quot;B&quot;;[.H51:.H53];[.K51:.K52])" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>Hiba:504</text:p>
      <text:p>Err:504</text:p>
     </table:table-cell>
     <table:table-cell office:value-type="string" calcext:value-type="string">
      <text:p>err:504</text:p>
@@ -3224,7 +3221,7 @@
    </table:table-row>
    <table:table-row table:style-name="ro2">
     <table:table-cell table:formula="of:=COM.MICROSOFT.XLOOKUP(&quot;C&quot;;[.H51:.H53];[.K51:.K52])" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>Hiba:504</text:p>
      <text:p>Err:504</text:p>
     </table:table-cell>
     <table:table-cell office:value-type="string" calcext:value-type="string">
      <text:p>err:504</text:p>
@@ -3257,7 +3254,7 @@
    </table:table-row>
    <table:table-row table:style-name="ro2">
     <table:table-cell table:formula="of:=COM.MICROSOFT.XLOOKUP(&quot;E&quot;;[.H51:.I53];[.K51:.L53])" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>Hiba:504</text:p>
      <text:p>Err:504</text:p>
     </table:table-cell>
     <table:table-cell office:value-type="string" calcext:value-type="string">
      <text:p>err:504</text:p>
@@ -3290,7 +3287,7 @@
    </table:table-row>
    <table:table-row table:style-name="ro2">
     <table:table-cell table:formula="of:=COM.MICROSOFT.XLOOKUP(&quot;E&quot;;[.H51:.I53];[.K51:.K53])" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>Hiba:504</text:p>
      <text:p>Err:504</text:p>
     </table:table-cell>
     <table:table-cell office:value-type="string" calcext:value-type="string">
      <text:p>err:504</text:p>
@@ -3309,7 +3306,7 @@
    </table:table-row>
    <table:table-row table:style-name="ro2">
     <table:table-cell table:formula="of:=COM.MICROSOFT.XLOOKUP(&quot;C&quot;;[.H51:.I53];[.K51:.K53])" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>Hiba:504</text:p>
      <text:p>Err:504</text:p>
     </table:table-cell>
     <table:table-cell office:value-type="string" calcext:value-type="string">
      <text:p>err:504</text:p>
@@ -4321,7 +4318,7 @@
    </table:table-row>
    <table:table-row table:style-name="ro2">
     <table:table-cell table:formula="of:=COM.MICROSOFT.XLOOKUP(&quot;C?&quot;;[.H$95:.L$95];[.H$96:.L$96];;2;1)" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>#HIÁNYZIK</text:p>
      <text:p>#N/A</text:p>
     </table:table-cell>
     <table:table-cell office:value-type="string" calcext:value-type="string">
      <text:p>#N/A</text:p>
@@ -4470,7 +4467,7 @@
    </table:table-row>
    <table:table-row table:style-name="ro2">
     <table:table-cell table:formula="of:=COM.MICROSOFT.XLOOKUP(&quot;f?&quot;;[.I$79:.I$83];[.L$79:.L$83];;2;1)" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>#HIÁNYZIK</text:p>
      <text:p>#N/A</text:p>
     </table:table-cell>
     <table:table-cell office:value-type="string" calcext:value-type="string">
      <text:p>#N/A</text:p>
@@ -4639,7 +4636,7 @@
    </table:table-row>
    <table:table-row table:style-name="ro2">
     <table:table-cell table:formula="of:=COM.MICROSOFT.XLOOKUP([.M1];[.K$1:.K$12];[.I$1:.I$12];;0;2)" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>#HIÁNYZIK</text:p>
      <text:p>#N/A</text:p>
     </table:table-cell>
     <table:table-cell office:value-type="string" calcext:value-type="string">
      <text:p>#N/A</text:p>
@@ -4659,7 +4656,7 @@
    </table:table-row>
    <table:table-row table:style-name="ro2">
     <table:table-cell table:formula="of:=COM.MICROSOFT.XLOOKUP([.$O$1];[.P$1:.P$11];[.T$1:.T$11];;0;2)" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>#HIÁNYZIK</text:p>
      <text:p>#N/A</text:p>
     </table:table-cell>
     <table:table-cell office:value-type="string" calcext:value-type="string">
      <text:p>#N/A</text:p>
@@ -4754,7 +4751,7 @@
    </table:table-row>
    <table:table-row table:style-name="ro2">
     <table:table-cell table:formula="of:=COM.MICROSOFT.XLOOKUP([.$O$1];[.R$1:.R$11];[.T$1:.T$11];;0;-2)" office:value-type="string" office:string-value="" calcext:value-type="error">
      <text:p>#HIÁNYZIK</text:p>
      <text:p>#N/A</text:p>
     </table:table-cell>
     <table:table-cell office:value-type="string" calcext:value-type="string">
      <text:p>#N/A</text:p>
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 22fc30c..960516d 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -7674,24 +7674,51 @@ void ScInterpreter::ScXLookup()

    // 3rd argument is return value array
    ScMatrixRef prMat = nullptr;
    SCCOL nSearchCol1 = 0;
    SCROW nSearchRow1 = 0;
    SCTAB nSearchTab1 = 0;
    SCCOL nSearchCol2 = 0;
    SCROW nSearchRow2 = 0;
    SCTAB nSearchTab2 = 0;
    SCSIZE nrC = 0, nrR = 0;
    StackVar eType = GetStackType();
    switch ( eType )

    switch ( GetStackType() )
    {
        case svDoubleRef :
        case svSingleRef :
        case svExternalDoubleRef :
        case svExternalSingleRef :
        case svMatrix :
            prMat = GetMatrix();
            if ( prMat )
                prMat->GetDimensions( nrC, nrR );
            else
            PopSingleRef(nSearchCol1, nSearchRow1, nSearchTab1);
            nSearchCol2 = nSearchCol1;
            nSearchRow2 = nSearchRow1;
            nrC = nSearchCol2 - nSearchCol1 + 1;
            nrR = nSearchRow2 - nSearchRow1 + 1;
        break;
        case svDoubleRef:
        {
            PopDoubleRef(nSearchCol1, nSearchRow1, nSearchTab1, nSearchCol2, nSearchRow2, nSearchTab2);
            if (nSearchTab1 != nSearchTab2)
            {
                PushIllegalParameter();
                return;
            }
            break;
            nrC = nSearchCol2 - nSearchCol1 + 1;
            nrR = nSearchRow2 - nSearchRow1 + 1;
        }
        break;
        case svMatrix :
        case svExternalDoubleRef :
        {
            if (GetStackType() == svMatrix)
                prMat = PopMatrix();
            else
                PopExternalDoubleRef(prMat);

            if (!prMat)
            {
                PushIllegalParameter();
                return;
            }
            prMat->GetDimensions(nrC, nrR);
        }
        break;

        default :
            PushIllegalParameter();
@@ -7857,50 +7884,56 @@ void ScInterpreter::ScXLookup()
            nResCols = 1;
            nResRows = nrR;
        }
        // if result matrix has more than one row or column push matrix else push single value
        // if result has more than one row or column push double ref or matrix, else push single ref
        if ( nResCols > 1 || nResRows > 1 )
        {
            // result is matrix, make/fill matrix with output and push that
            ScMatrixRef pResMat = GetNewMat( nResCols, nResRows, /*bEmpty*/true );
            if ( pResMat )
            if (prMat)
            {
                for ( SCSIZE i = 0; i < nResCols; i++ )
                // result is matrix, make / fill matrix with output and push that
                ScMatrixRef pResMat = GetNewMat(nResCols, nResRows, /*bEmpty*/true);
                if (pResMat)
                {
                    for ( SCSIZE j = 0; j < nResRows; j++ )
                    for (SCSIZE i = 0; i < nResCols; i++)
                    {
                        SCSIZE ri;
                        SCSIZE rj;
                        if ( vsa.bVLookup )
                        for (SCSIZE j = 0; j < nResRows; j++)
                        {
                            ri = nX + i;
                            rj = nY;
                            SCSIZE ri;
                            SCSIZE rj;
                            if (vsa.bVLookup)
                            {
                                ri = nX + i;
                                rj = nY;
                            }
                            else
                            {
                                ri = nX;
                                rj = nY + j;
                            }
                            if (prMat->IsStringOrEmpty(ri, rj))
                                pResMat->PutString(prMat->GetString(ri, rj), i, j);
                            else
                                pResMat->PutDouble(prMat->GetDouble(ri, rj), i, j);
                        }
                        else
                        {
                            ri = nX;
                            rj = nY + j;
                        }
                        if ( prMat->IsStringOrEmpty( ri, rj ) )
                            pResMat->PutString( prMat->GetString( ri, rj ), i, j );
                        else
                            pResMat->PutDouble( prMat->GetDouble( ri, rj ), i, j );
                    }
                    PushMatrix(pResMat);
                }
                PushMatrix( pResMat );
                else
                {
                    PushIllegalParameter();
                    return;
                }
            }
            else
            {
                PushIllegalParameter();
                return;
                // result is a double ref
                PushDoubleRef(nSearchCol1 + nX, nSearchRow1 + nY, nSearchTab1,
                    nSearchCol1 + (nResCols - 1) + nX, nSearchRow1 + (nResRows - 1) + nY, nSearchTab1);
            }
        }
        else
        {
            // result is a single value
            if ( prMat->IsStringOrEmpty( nX, nY) )
                PushString( prMat->GetString( nX, nY ).getString() );
            else
                PushDouble( prMat->GetDouble( nX, nY ) );
            // result is a single ref
            PushSingleRef(nSearchCol1 + nX, nSearchRow1 + nY, nSearchTab1);
        }
    }
    else