找回密码
 立即注册

QQ登录

只需一步,快速开始

bingdaoice

中级会员

44

主题

208

帖子

608

积分

中级会员

积分
608
bingdaoice
中级会员   /  发表于:2020-7-1 10:51  /   查看:4159  /  回复:4
1金币
本帖最后由 bingdaoice 于 2020-7-1 10:53 编辑

使用自定义公式后,第一次能正常计算并显示,第二次打开时显示#NAME? 请问怎么处理,才可以一直正确的显示并计算?

image.png763587951.png


最佳答案

查看完整内容

问题是由于将自定义公式添加的代码,位置放错了导致的。版主已经解决, 此贴关闭

4 个回复

倒序浏览
最佳答案
最佳答案
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-7-1 10:51:22
来自 5#
本帖最后由 Richard.Ma 于 2020-9-15 10:07 编辑

问题是由于将自定义公式添加的代码,位置放错了导致的。版主已经解决,



此贴关闭


回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-7-1 11:39:07
2#
应该是公式名称错了,你是要用SUM求和公式吧
回复 使用道具 举报
bingdaoice
中级会员   /  发表于:2020-7-1 11:45:56
3#
不是的。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);                 
                }
            }
        }
回复 使用道具 举报
bingdaoice
中级会员   /  发表于:2020-7-1 12:14:52
4#
不好意思。是我将自定义公式添加的代码,位置放错了导致的。
此贴可以结了。谢谢版主的解答!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部