private static IEnumerable <ParseTreeNode> CellContainedInRanges(ParseTreeNode fqcellref, ParseTreeNode formula, Context CtxF) { var cell = new Location(fqcellref.ChildNodes[1].Print()); // Select all references and qualify them var references = formula.GetReferenceNodes().Select(CtxF.Qualify).ToList(); // Check the different types of ranges var ranges = formula.AllNodes().Where(reference => reference.MatchFunction(":")); var rangesc = ranges.Where(range => { var args = range.GetFunctionArguments().Select(ExcelFormulaParser.Print).ToList(); var start = new Location(args[0]); var end = new Location(args[1]); return(cell.Row >= start.Row && cell.Row <= end.Row && cell.Column >= start.Column && cell.Column <= end.Column); }); var vranges = references.Where(reference => reference.ChildNodes[0].Is(GrammarNames.Prefix) && reference.ChildNodes[1].Is(GrammarNames.VerticalRange) ); var vrangesc = vranges.Where(reference => { var vrange = reference.ChildNodes[1]; var pieces = vrange.Print().Replace("$", "").Split(':'); return(cell.Column >= AuxConverter.ColToInt(pieces[0]) && cell.Column <= AuxConverter.ColToInt(pieces[1])); }); var hranges = references.Where(reference => reference.ChildNodes[0].Is(GrammarNames.Prefix) && reference.ChildNodes[1].Is(GrammarNames.HorizontalRange) ); var hrangesc = hranges.Where(reference => { var hrange = reference.ChildNodes[1]; var pieces = hrange.Print().Replace("$", "").Split(':'); return(cell.Row >= (int.Parse(pieces[0]) - 1) && cell.Row <= (int.Parse(pieces[1]) - 1)); }); var combined = new[] { rangesc, vrangesc, hrangesc }.SelectMany(x => x); return(combined); }