diff --git a/src/XLParser.Tests/FormulaAnalysisTest.cs b/src/XLParser.Tests/FormulaAnalysisTest.cs index 7efa6ba..f25dfd6 100644 --- a/src/XLParser.Tests/FormulaAnalysisTest.cs +++ b/src/XLParser.Tests/FormulaAnalysisTest.cs @@ -1212,6 +1212,44 @@ public void AbsoluteRowReference() Assert.AreEqual("$1", references.First().MaxLocation); } + [TestMethod] + public void RefError() + { + List references = new FormulaAnalyzer("#REF!").ParserReferences().ToList(); + + Assert.AreEqual(1, references.Count); + Assert.AreEqual(ReferenceType.RefError, references.First().ReferenceType); + Assert.AreEqual("#REF!", references.First().LocationString); + } + + [TestMethod] + public void RefErrorRange() + { + List references = new FormulaAnalyzer("#REF!:#REF!").ParserReferences().ToList(); + + Assert.AreEqual(2, references.Count); + Assert.AreEqual("#REF!", references.First().LocationString); + Assert.AreEqual("#REF!", references.Last().LocationString); + } + + [TestMethod] + public void RefErrorCellRange() + { + List references = new FormulaAnalyzer("A1:#REF!").ParserReferences().ToList(); + + Assert.AreEqual(2, references.Count); + Assert.AreEqual("A1", references.First().LocationString); + Assert.AreEqual("#REF!", references.Last().LocationString); + } + + [TestMethod] + public void IndirectFunctionRange() + { + List references = new FormulaAnalyzer(@"INDIRECT(""A3""):INDIRECT(""A20000"")").ParserReferences().ToList(); + + Assert.AreEqual(0, references.Count); + } + [TestMethod] public void ReferenceFunctionAsArgument() { diff --git a/src/XLParser/ExcelFormulaParser.cs b/src/XLParser/ExcelFormulaParser.cs index e0bc35c..762731b 100644 --- a/src/XLParser/ExcelFormulaParser.cs +++ b/src/XLParser/ExcelFormulaParser.cs @@ -415,6 +415,7 @@ public static IEnumerable GetParserReferences(this ParseTreeNod case GrammarNames.HorizontalRange: case GrammarNames.VerticalRange: case GrammarNames.StructuredReference: + case GrammarNames.RefError: list.Add(new ParserReference(node)); break; case GrammarNames.Reference: @@ -424,9 +425,9 @@ public static IEnumerable GetParserReferences(this ParseTreeNod default: if (node.IsRange()) { - var rangeStart = GetParserReferences(node.ChildNodes[0].SkipToRelevant()).First(); - var rangeEnd = GetParserReferences(node.ChildNodes[2].SkipToRelevant()).First(); - if (rangeStart.ReferenceType == ReferenceType.Cell && rangeEnd.ReferenceType == ReferenceType.Cell) + var rangeStart = GetParserReferences(node.ChildNodes[0]).FirstOrDefault(); + var rangeEnd = GetParserReferences(node.ChildNodes[2]).FirstOrDefault(); + if (rangeStart?.ReferenceType == ReferenceType.Cell && rangeEnd?.ReferenceType == ReferenceType.Cell) { ParserReference range = rangeStart; range.MaxLocation = rangeEnd.MinLocation; @@ -436,7 +437,7 @@ public static IEnumerable GetParserReferences(this ParseTreeNod list.Add(range); break; } - if (rangeStart.ReferenceType == ReferenceType.Table && rangeEnd.ReferenceType == ReferenceType.Table && rangeStart.Name == rangeEnd.Name && rangeStart.TableColumns.Length == 1 && rangeEnd.TableColumns.Length == 1) + if (rangeStart?.ReferenceType == ReferenceType.Table && rangeEnd?.ReferenceType == ReferenceType.Table && rangeStart.Name == rangeEnd.Name && rangeStart.TableColumns.Length == 1 && rangeEnd.TableColumns.Length == 1) { ParserReference range = rangeStart; range.TableColumns = rangeStart.TableColumns.Concat(rangeEnd.TableColumns).ToArray();