public static string GetFullFormulaOptions([ExcelArgument(AllowReference = true)] object arg, bool replaceRef = false, bool resolveName = false, int decimalPlaces = 5) { try { //this removes the volatile flag XlCall.Excel(XlCall.xlfVolatile, false); ExcelReference theRef = (ExcelReference)arg; Excel.Range rng = ReferenceToRange(theRef); Debug.Print("Get formula for {0}", rng.Address); ws = rng.Parent as Excel.Worksheet; var parser = GetParser(rng); var root = parser.Root; var newFormula = GetFormulaForFunc(root, replaceRef, resolveName, -1); Debug.Print(newFormula); //remove the SUMs var noSumVersion = GetFormulaWithoutSum(new XLParser.FormulaAnalyzer(newFormula).Root); var cleanFormula = Infix.Format(Infix.ParseOrThrow(noSumVersion)); Debug.Print(cleanFormula); var finalFormula = cleanFormula; if (decimalPlaces > -1) { Debug.Print("Going back through a 2nd time"); cleanFormula = CleanUpSqrtAbs(cleanFormula); parser = GetParser(cleanFormula); var secondParserResult = GetFormulaForFunc(parser.Root, replaceRef, resolveName, decimalPlaces); finalFormula = Infix.Format(Infix.ParseOrThrow(secondParserResult)); } //see if a short version of the formula is available var algFormula = Infix.Format(Algebraic.Expand(Infix.ParseOrThrow(finalFormula))); var ratFormula = Infix.Format(Rational.Expand(Infix.ParseOrThrow(finalFormula))); var shortFormula = new[] { algFormula, ratFormula, finalFormula }.OrderBy(c => c.Length).First(); //go through formula and search for |..| to replace with ABS(..) shortFormula = CleanUpSqrtAbs(shortFormula); return(shortFormula); } catch (Exception e) { Debug.Print(e.ToString()); return(e.ToString()); } }