|
楼主 |
发表于 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自动宏强制重新填写公式,使得公式重新计算。
更新后的代码如下:
- Option Explicit
- Public oReg As New RegExp, Initialized As Boolean '需引用Microsoft VBScript Regular Expressions 5.5
- Sub Auto_Open()
- With oReg
- .Global = True
- .IgnoreCase = True
- End With
- Initialized = True
- End Sub
- Function EEVAL(ByVal s$) '计算复杂文本描述型表达式的值 利用正则消除注释字符(以成对的半角或全角方括号[]【】包含的内容)
- Dim a$(), b$(), i%, strJS$, tmp0$, tmp1$, oDom As Object, oWin As Object
- '支持基本数学函数和两个重要常数(圆周率和自然常数)支持Int函数,支持全角四则运算符和幂运算符,支持全角圆括号。同时支持常用对数函数LOG和自然对数函数LN,并与Excel的工作表函数LOG、LN函数保持一致。
- tmp0 = "\blog10e\b、\bln(?=10\b|2\b)、\blog\(、+、-、×、÷、(、)、(\d*\.?\d+|\w*\([^\(\)]*\)|\w+)\^(-?\d*\.?\d+|\w*\([^\(\)]*\)|\w+)、" & _
- "\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、" & _
- "\[[^\[\]]*\]|【[^【】]*】|(Math\.)(?=\1)、power\b、Math.e\b、\.pi(\(\))?、\b(Math\.)?ln\(、(-\+*-|\+)+(?=[\+\-])|[\+\-]+$、--"
-
- tmp1 = "LOG10E、LN、LOG10E*log(、+、-、*、/、(、)、pow($1,$2)、" & _
- "parseInt、Math.floor、Math.$1、、pow、Math.E、.PI、Math.log(、、+"
- If Not Initialized Then Auto_Open
- a = Split(tmp0, "、")
- b = Split(tmp1, "、")
- s = VBA.LCase(s)
- With oReg
- For i = 0 To UBound(a)
- .Pattern = a(i)
- s = .Replace(s, b(i))
- Next
- If Len(s) = 0 Then EEVAL = VBA.vbNullString: Exit Function
- End With
- Set oDom = CreateObject("htmlfile")
- Set oWin = oDom.parentWindow
- oDom.write Replace("<script Language = JavaScript> function EEVAL(){return eexp} </script>", "eexp", s)
- EEVAL = oWin.eval("EEVAL()")
- End Function
复制代码
应用样例:
jss.rar
(17.86 KB, 下载次数: 119)
|
|