diff --git a/ClosedXML/Excel/CalcEngine/XLCalcEngine.cs b/ClosedXML/Excel/CalcEngine/XLCalcEngine.cs index 108ea40..33bfb7f 100644 --- a/ClosedXML/Excel/CalcEngine/XLCalcEngine.cs +++ b/ClosedXML/Excel/CalcEngine/XLCalcEngine.cs @@ -90,9 +90,9 @@ // ** implementation private object GetValue(IXLCell cell) { - if (_evaluating) + if (_evaluating || (cell as XLCell).IsEvaluating) { - throw new InvalidOperationException("Circular Reference"); + throw new InvalidOperationException($"Circular Reference occured during evaluation. Cell: {cell.Address.ToString(XLReferenceStyle.Default, true)}"); } try { diff --git a/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/Excel/Cells/XLCell.cs index 97086c1..b0e368c 100644 --- a/ClosedXML/Excel/Cells/XLCell.cs +++ b/ClosedXML/Excel/Cells/XLCell.cs @@ -356,6 +356,11 @@ return cValue; } + /// + /// Flag showing that the cell is in formula evaluation state. + /// + internal bool IsEvaluating { get; private set; } + public object Value { get @@ -394,7 +399,17 @@ return referenceCell.Value; } - var retVal = Worksheet.Evaluate(fA1); + object retVal; + try + { + IsEvaluating = true; + retVal = Worksheet.Evaluate(fA1); + } + finally + { + IsEvaluating = false; + } + var retValEnumerable = retVal as IEnumerable; if (retValEnumerable != null && !(retVal is String)) diff --git a/ClosedXML_Tests/Excel/Cells/XLCellTests.cs b/ClosedXML_Tests/Excel/Cells/XLCellTests.cs index a6daf62..deab706 100644 --- a/ClosedXML_Tests/Excel/Cells/XLCellTests.cs +++ b/ClosedXML_Tests/Excel/Cells/XLCellTests.cs @@ -524,6 +524,7 @@ { Assert.AreEqual("B1:E3", c.CurrentRegion.RangeAddress.ToString()); } + Assert.AreEqual("B1:E4", ws.Cell("E4").CurrentRegion.RangeAddress.ToString()); //// SECOND REGION @@ -531,6 +532,7 @@ { Assert.AreEqual("F1:H4", c.CurrentRegion.RangeAddress.ToString()); } + Assert.AreEqual("F1:H5", ws.Cell("F5").CurrentRegion.RangeAddress.ToString()); //// DIAGONAL @@ -613,5 +615,27 @@ Assert.AreEqual("B2", cell.FormulaA1); } } + + [Test] + public void FormulaWithCircularReferenceFails() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var A1 = ws.Cell("A1"); + var A2 = ws.Cell("A2"); + A1.FormulaA1 = "A2 + 1"; + A2.FormulaA1 = "A1 + 1"; + + Assert.Throws(() => + { + var _ = A1.Value; + }); + Assert.Throws(() => + { + var _ = A2.Value; + }); + } + } } }