不是的。SUMM是我自定义的一个公式。 第一次手动输入的时候,是可以计算出正确的数据的。
class SUMM : Function
{
public SUMM() : base("SUMM", 3, 3, GrapeCity.CalcEngine.FunctionAttributes.Number) { }
protected override void Evaluate(IArguments arguments, IValue result)
{
IValue range = arguments[0];
//确认第一个参数是否是引用类型,不是的话返回错误值类型
if (range.ValueType != GrapeCity.CalcEngine.ValueType.AdjustableReference)
{
arguments.EvaluationContext.Error = GrapeCity.CalcEngine.CalcError.Value;
result.SetValue(GrapeCity.CalcEngine.CalcError.Value);
}
else
{
IEvaluationContext evaluationContext = arguments.EvaluationContext;
IReferenceSource referenceSource = range.GetReferenceSource(evaluationContext);
//获取第一个参数,这个即是你目前需要的一个范围,调用的时候需要写"$C$4C$9"这种
RangeReference rangeRef = range.GetReference(evaluationContext, 0);
//获取第二个参数
double criteria = arguments[1].GetNumber(evaluationContext);
string range3 = arguments[2].GetText(evaluationContext);
double Amt = 0;
for (int r = rangeRef.Row; r <= rangeRef.Row2; r++)
{
for (int c = rangeRef.Column; c <= rangeRef.Column2; c++)
{
referenceSource.GetValue(evaluationContext, r, c, result);
Amt += result.GetNumber(evaluationContext);
}
}
Amt = Amt / criteria;
string Len = "";
if (range3.ToString().Contains("."))
Len = range3.Substring(range3.IndexOf(".") + 1, range3.Length - range3.IndexOf(".") - 1);
string Value = Amt.ToString("F" + Len.Length.ToString());
result.SetValue(evaluationContext, Value);
}
}
} |