ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 表达式求值自定义函数突破255字符限制并兼容64位office

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2019-7-31 18:38 | 显示全部楼层
本帖已被收录到知识树中,索引项:自定义函数开发
如何移值到新的excel表格中,麻烦写个教程,谢谢!

TA的精华主题

TA的得分主题

发表于 2019-7-31 18:45 | 显示全部楼层
怎样才能使计算式的单元格是空白的时候,计算结果的单元格也是空白的,而不是显示为0

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-8 13:20 | 显示全部楼层
本帖最后由 ggmmlol 于 2019-9-18 12:08 编辑

更新:
1、修正幂运算的幂不能为小数的Bug
2、修正计算式中不能出现连续加减运算符的Bug
3、修正Ceiling、Floor、Round三个函数与Excel内置函数不符的Bug,但请注意以下特别提示:

特别提醒:
为了“兼容”Excel内置工作表函数Ceiling、Floor、Round的习惯写法,这三个函数用了Js语言的Round函数为基础写成的衍生函数,当工作簿中包含这些函数的表达式在关闭后重新打开时,它们在EEVAL函数中的计算结果都会被取整。为了使它们得到精确结果,必须把公式重新编辑一下或删除重新填写,特别是在打印最终结果之前,应当手动重算一遍,或利用工作簿打印事件以VBA自动宏强制重新填写公式,使得公式重新计算。


更新后的代码如下:
  1. Option Explicit
  2. Public oReg As New RegExp, Initialized As Boolean '需引用Microsoft VBScript Regular Expressions 5.5
  3. Sub Auto_Open()
  4.     With oReg
  5.         .Global = True
  6.         .IgnoreCase = True
  7.     End With
  8.     Initialized = True
  9. End Sub

  10. Function EEVAL(ByVal s$)  '计算复杂文本描述型表达式的值 利用正则消除注释字符(以成对的半角或全角方括号[]【】包含的内容)
  11.     Dim a$(), b$(), i%, strJS$, tmp0$, tmp1$, oDom As Object, oWin As Object
  12.     '支持基本数学函数和两个重要常数(圆周率和自然常数)支持Int函数,支持全角四则运算符和幂运算符,支持全角圆括号。同时支持常用对数函数LOG和自然对数函数LN,并与Excel的工作表函数LOG、LN函数保持一致。
  13.     tmp0 = "\blog10e\b、\bln(?=10\b|2\b)、\blog\(、+、-、×、÷、(、)、(\d*\.?\d+|\w*\([^\(\)]*\)|\w+)\^(-?\d*\.?\d+|\w*\([^\(\)]*\)|\w+)、" & _
  14.             "\bTRUNC\b、\bInt\b、\b(sqrt|round|random|pow(er)?|PI|min|max|log(10E)?|ln(2|10)|exp|E|abs|a?tan2?|a?sin|a?cos)\b、" & _
  15.             "\[[^\[\]]*\]|【[^【】]*】|(Math\.)(?=\1)、power\b、Math.e\b、\.pi(\(\))?、\b(Math\.)?ln\(、(-\+*-|\+)+(?=[\+\-])|[\+\-]+$、--"
  16.             
  17.     tmp1 = "LOG10E、LN、LOG10E*log(、+、-、*、/、(、)、pow($1,$2)、" & _
  18.             "parseInt、Math.floor、Math.$1、、pow、Math.E、.PI、Math.log(、、+"
  19.     If Not Initialized Then Auto_Open
  20.     a = Split(tmp0, "、")
  21.     b = Split(tmp1, "、")
  22.     s = VBA.LCase(s)
  23.     With oReg
  24.         For i = 0 To UBound(a)
  25.             .Pattern = a(i)
  26.             s = .Replace(s, b(i))
  27.         Next
  28.         If Len(s) = 0 Then EEVAL = VBA.vbNullString: Exit Function
  29.     End With
  30.     Set oDom = CreateObject("htmlfile")
  31.     Set oWin = oDom.parentWindow
  32.     oDom.write Replace("<script Language = JavaScript> function EEVAL(){return eexp} </script>", "eexp", s)
  33.     EEVAL = oWin.eval("EEVAL()")
  34. End Function
复制代码


应用样例: jss.rar (17.86 KB, 下载次数: 119)

TA的精华主题

TA的得分主题

发表于 2019-8-8 14:03 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-9-2 21:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼主你好  用你23楼的代码和附件计算为错误值,不知道是什么原因,使用3楼的代码则没有问题,烦请楼主有空看一下,

TA的精华主题

TA的得分主题

发表于 2019-9-2 22:35 | 显示全部楼层
不错!谢谢楼主分享

TA的精华主题

TA的得分主题

发表于 2019-9-3 18:28 | 显示全部楼层
高人就是高人,现在感觉离完美就差一点点了,这一点点就是我的表格目前只有100行左右的计算式,运行过程中运算时能感觉到卡顿,目前暂不影响感受,但是后面还有差不多2000行呢,届时会不会卡的失去耐性还不知道,曾经考虑过在选项内将自动计算改为手动计算,但改过后由于习惯了自动计算而在一次没有手动计算更新时直接打印上交,结果~~。
最后P个S:最新版增加支持的三个函数不知是否影响运行效率,若是,建议割爱,感觉可用INT代替
祝越来越完善

TA的精华主题

TA的得分主题

发表于 2019-9-4 10:35 | 显示全部楼层
younger001 发表于 2019-9-3 18:28
高人就是高人,现在感觉离完美就差一点点了,这一点点就是我的表格目前只有100行左右的计算式,运行过程中 ...

兄台,你用的最新代码吗?只开是一楼的代码比较卡顿,后面3楼的运行效率要高一点,但是多了计算要等待

TA的精华主题

TA的得分主题

发表于 2019-9-4 12:48 | 显示全部楼层
lu6200 发表于 2019-9-4 10:35
兄台,你用的最新代码吗?只开是一楼的代码比较卡顿,后面3楼的运行效率要高一点,但是多了计算要等待

是啊,就是用的三楼的代码呀,只是我的这个工作薄另两张工作表也有函数,不过都是内置函数,把这张用楼主函数的表删除后,运算感觉不到顿,但加上后有感觉,最新的23楼的倒是没用,我的理解是多个正则式,就会慢一分,不知理解是否正确,当然主要是新增的三个函数我用不上~~

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-9-4 15:27 | 显示全部楼层
本帖最后由 ggmmlol 于 2019-9-18 12:11 编辑

根据上面两位坛友反馈,修改代码,把Round、Ceiling和Floor这3个不常用的函数从支持的函数清单中移除,同时,把正则对象的Global和Ignorecase两项都改为在Auto_Open过程中统一赋值,避免在函数中重复执行。这样,函数的效率应当略有提升,继续测试反馈:
2019-9-8补充:对连续出现的"+"、"-" 运算符的化简,放在最后进行,避免遗漏。)
2019-9-9补充修正Int函数对负数取整的错误;增加对TRUNC函数的支持。)
  1. Option Explicit
  2. Public oReg As New RegExp, Initialized As Boolean '需引用Microsoft VBScript Regular Expressions 5.5
  3. Sub Auto_Open()
  4.     With oReg
  5.         .Global = True
  6.         .IgnoreCase = True
  7.     End With
  8.     Initialized = True
  9. End Sub

  10. Function EEVAL(ByVal s$)  '计算复杂文本描述型表达式的值 利用正则消除注释字符(以成对的半角或全角方括号[]【】包含的内容)
  11.     Dim a$(), b$(), i%, strJS$, tmp0$, tmp1$, oDom As Object, oWin As Object
  12.     '支持基本数学函数和两个重要常数(圆周率和自然常数)支持Int函数,支持全角四则运算符和幂运算符,支持全角圆括号。同时支持常用对数函数LOG和自然对数函数LN,并与Excel的工作表函数LOG、LN函数保持一致。
  13.     tmp0 = "\blog10e\b、\bln(?=10\b|2\b)、\blog\(、+、-、×、÷、(、)、(\d*\.?\d+|\w*\([^\(\)]*\)|\w+)\^(-?\d*\.?\d+|\w*\([^\(\)]*\)|\w+)、" & _
  14.             "\bTRUNC\b、\bInt\b、\b(sqrt|round|random|pow(er)?|PI|min|max|log(10E)?|ln(2|10)|exp|E|abs|a?tan2?|a?sin|a?cos)\b、" & _
  15.             "\[[^\[\]]*\]|【[^【】]*】|(Math\.)(?=\1)、power\b、Math.e\b、\.pi(\(\))?、\b(Math\.)?ln\(、(-\+*-|\+)+(?=[\+\-])|[\+\-]+$、--"
  16.             
  17.     tmp1 = "LOG10E、LN、LOG10E*log(、+、-、*、/、(、)、pow($1,$2)、" & _
  18.             "parseInt、Math.floor、Math.$1、、pow、Math.E、.PI、Math.log(、、+"
  19.     If Not Initialized Then Auto_Open
  20.     a = Split(tmp0, "、")
  21.     b = Split(tmp1, "、")
  22.     s = VBA.LCase(s)
  23.     With oReg
  24.         For i = 0 To UBound(a)
  25.             .Pattern = a(i)
  26.             s = .Replace(s, b(i))
  27.         Next
  28.         If Len(s) = 0 Then EEVAL = VBA.vbNullString: Exit Function
  29.     End With
  30.     Set oDom = CreateObject("htmlfile")
  31.     Set oWin = oDom.parentWindow
  32.     oDom.write Replace("<script Language = JavaScript> function EEVAL(){return eexp} </script>", "eexp", s)
  33.     EEVAL = oWin.eval("EEVAL()")
  34. End Function
复制代码

评分

2

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 22:00 , Processed in 0.038076 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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