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;
+ });
+ }
+ }
}
}