Skip to content

Commit bf0281b

Browse files
authored
Merge pull request #4096 from oleibman/issue296
Reference to Defined Name Specifying Worksheet Name
2 parents 64b02b0 + 1c333d1 commit bf0281b

File tree

2 files changed

+57
-4
lines changed

2 files changed

+57
-4
lines changed

src/PhpSpreadsheet/Calculation/Calculation.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5087,9 +5087,10 @@ private function processTokenStack(mixed $tokens, ?string $cellID = null, ?Cell
50875087
if ($cell === null || $pCellWorksheet === null) {
50885088
return $this->raiseFormulaError("undefined name '$token'");
50895089
}
5090+
$specifiedWorksheet = trim($matches[2], "'");
50905091

50915092
$this->debugLog->writeDebugLog('Evaluating Defined Name %s', $definedName);
5092-
$namedRange = DefinedName::resolveName($definedName, $pCellWorksheet);
5093+
$namedRange = DefinedName::resolveName($definedName, $pCellWorksheet, $specifiedWorksheet);
50935094
// If not Defined Name, try as Table.
50945095
if ($namedRange === null && $this->spreadsheet !== null) {
50955096
$table = $this->spreadsheet->getTableByName($definedName);
@@ -5114,7 +5115,7 @@ private function processTokenStack(mixed $tokens, ?string $cellID = null, ?Cell
51145115
return $this->raiseFormulaError("undefined name '$definedName'");
51155116
}
51165117

5117-
$result = $this->evaluateDefinedName($cell, $namedRange, $pCellWorksheet, $stack);
5118+
$result = $this->evaluateDefinedName($cell, $namedRange, $pCellWorksheet, $stack, $specifiedWorksheet !== '');
51185119
if (isset($storeKey)) {
51195120
$branchStore[$storeKey] = $result;
51205121
}
@@ -5593,10 +5594,10 @@ private function addCellReference(array $args, bool $passCellReference, array|st
55935594
return $args;
55945595
}
55955596

5596-
private function evaluateDefinedName(Cell $cell, DefinedName $namedRange, Worksheet $cellWorksheet, Stack $stack): mixed
5597+
private function evaluateDefinedName(Cell $cell, DefinedName $namedRange, Worksheet $cellWorksheet, Stack $stack, bool $ignoreScope = false): mixed
55975598
{
55985599
$definedNameScope = $namedRange->getScope();
5599-
if ($definedNameScope !== null && $definedNameScope !== $cellWorksheet) {
5600+
if ($definedNameScope !== null && $definedNameScope !== $cellWorksheet && !$ignoreScope) {
56005601
// The defined name isn't in our current scope, so #REF
56015602
$result = ExcelError::REF();
56025603
$stack->push('Error', $result, $namedRange->getName());
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpOffice\PhpSpreadsheetTests;
6+
7+
use PhpOffice\PhpSpreadsheet\NamedRange;
8+
use PhpOffice\PhpSpreadsheet\Spreadsheet;
9+
use PHPUnit\Framework\TestCase;
10+
11+
class NamedRange3Test extends TestCase
12+
{
13+
public function testSheetNamePlusDefinedName(): void
14+
{
15+
$spreadsheet = new Spreadsheet();
16+
$sheet1 = $spreadsheet->getActiveSheet();
17+
$sheet1->setTitle('sheet1');
18+
$sheet1->setCellValue('B1', 100);
19+
$sheet1->setCellValue('B2', 200);
20+
$sheet1->setCellValue('B3', 300);
21+
$sheet1->setCellValue('B4', 400);
22+
$sheet1->setCellValue('B5', 500);
23+
24+
$sheet2 = $spreadsheet->createsheet();
25+
$sheet2->setTitle('sheet2');
26+
$sheet2->setCellValue('A1', 10);
27+
$sheet2->setCellValue('A2', 20);
28+
$sheet2->setCellValue('A3', 30);
29+
$sheet2->setCellValue('A4', 40);
30+
$sheet2->setCellValue('A5', 50);
31+
32+
$spreadsheet->addNamedRange(
33+
new NamedRange('somecells', $sheet2, '$A$1:$A$5', true)
34+
);
35+
$spreadsheet->addNamedRange(
36+
new NamedRange('cellsonsheet1', $sheet1, '$B$1:$B$5')
37+
);
38+
39+
$sheet1->getCell('G1')->setValue('=SUM(cellsonsheet1)');
40+
self::assertSame(1500, $sheet1->getCell('G1')->getCalculatedValue());
41+
$sheet1->getCell('G2')->setValue('=SUM(sheet2!somecells)');
42+
self::assertSame(150, $sheet1->getCell('G2')->getCalculatedValue());
43+
$sheet1->getCell('G3')->setValue('=SUM(somecells)');
44+
self::assertSame('#NAME?', $sheet1->getCell('G3')->getCalculatedValue());
45+
$sheet1->getCell('G4')->setValue('=SUM(sheet2!cellsonsheet1)');
46+
self::assertSame(1500, $sheet1->getCell('G4')->getCalculatedValue());
47+
$sheet1->getCell('G5')->setValue('=SUM(sheet2xxx!cellsonsheet1)');
48+
self::assertSame('#NAME?', $sheet1->getCell('G5')->getCalculatedValue());
49+
50+
$spreadsheet->disconnectWorksheets();
51+
}
52+
}

0 commit comments

Comments
 (0)