ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1213|回复: 1

[求助] 自定义函数触发SheetCalculate事件操作单元格值后,原cell的各属性获取不到

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-6-3 16:44 | 显示全部楼层 |阅读模式
本帖最后由 yizckzhou 于 2020-6-3 16:48 编辑

1.png 场景:自定义函数所在单元格显示标题字符串,触发事件后在该单元格下展示数据(如图)
问题:数据展示成功后,在函数单元格再次回车,获取不到cell的formulaArray等各属性,即再次调用该方法后,string lsFormula = xlRange.FormulaArray.ToString();//此处获取不到内容了,希望能人指教,谢谢

C#代码如下:


        /// <summary>
        /// 计算时触发
        /// </summary>
        /// <param name="thesh"></param>
        private void OnCalculate(Worksheet thesh)
        {
            try
            {
                if (Globals.ThisAddIn.Application.ActiveCell == null) return;//初始未有单元格,忽略
                Range xlRange = (Globals.ThisAddIn.Application.ActiveCell as Range).CurrentRegion;//获取当前单元格
                string lsFormula = xlRange.FormulaArray.ToString();//函数内容
                if (lsFormula.Contains("Pms"))
                {
                    if (!CheckLogin())
                    {
                        xlRange.Value = string.Empty;
                        return;
                    }
                    //定位此时的单元格位置
                    int lsCurrentR = xlRange.Row;
                    int lsCurrentC = xlRange.Column;
                    string lsMsg = string.Empty;
                    //函数信息截取
                    string lsFuncName = lsFormula.Substring(0, lsFormula.IndexOf("(")).TrimStart('=');
                    string lsParamAll = lsFormula.Substring(lsFormula.IndexOf("(") + 1).TrimEnd(")".ToArray());
                    //参数截取
                    string[] lisParams;
                    PmsData pdTmp = new PmsData();
                    bool isNeedParm = pdTmp.IsNeedParm(lsFuncName, out lsMsg);//判断是否需要参数
                    if (lsMsg.Length > 0)
                    {
                        MessageUtil.ShowTips(lsMsg);
                        return;
                    }
                    if (lsParamAll.Trim().Length > 0 && isNeedParm)//获取函数的参数集合
                        lisParams = GetParams(lsParamAll.Split(','), thesh);
                    else
                        lisParams = lsParamAll.Split(',');
                    //数据调用
                    System.Data.DataTable dtResult = pdTmp.GetPmsData(lsFuncName, out lsMsg, lisParams);
                    if ((dtResult == null || dtResult.Rows.Count == 0) && lsMsg.Length > 0)
                    {
                        MessageUtil.ShowTips(lsMsg);
                        return;
                    }
                    for (int i = 0; i < dtResult.Rows.Count; i++)
                    {
                        for (int j = 0; j < dtResult.Columns.Count; j++)
                        {
                            if (i == 0)//赋值表格标题
                                thesh.Cells[i + lsCurrentR + 1, j + lsCurrentC] = dtResult.Columns[j].Caption;
                            //赋值表格数据
                            thesh.Cells[i + lsCurrentR + 2, j + lsCurrentC].Value = dtResult.Rows[j].ToString();
                            //单元格样式,值调整
                            fsc.SetRangeStyle(lsFuncName, dtResult.Columns[j].ColumnName, thesh.Cells[i + lsCurrentR + 2, j + lsCurrentC], dtResult.Rows[j]);
                        }
                    }
                    lsFormula = xlRange.FormulaArray.ToString();//赋值操作后,此处就已经无法再次获取到
                }
            }
            catch (Exception ex)
            {
                string error = ex.Message;
            }
        }




TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-4 15:48 | 显示全部楼层
该问题已处理,听说vsto坑蛮多的,不小心就踩了个。。。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-21 23:51 , Processed in 0.030533 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表