一个超强的计算式,支持超长计算以及备注等等

Function JC(C As Range) As Double

Dim s As String

Dim regex As Object

Dim tmp0 As String, tmp1 As String

Dim a() As String, b() As String

Dim i As Integer

Dim ST As Integer, ED As Integer

Dim D As Integer

' 获取输入单元格的值

s = C.Value

' 检查输入是否为空,如果为空则返回0

If s = "" Then

JC = 0

Exit Function

End If

' 处理中括号,更改字体颜色为蓝色

For D = 1 To Len(s)

Select Case Mid(s, D, 1)

Case "[", "【": ST = D

Case "]", "】": ED = D

C.Characters(Start:=ST, Length:=ED - ST + 1).Font.ColorIndex = 5 '颜色为蓝色

End Select

Next D

' 初始化正则表达式对象

Set regex = CreateObject("VBScript.RegExp")

regex.Global = True

regex.IgnoreCase = True

' 字符串替换,支持数学运算和函数

tmp0 = "+、-、×、÷、。、(、)、【、】、\[[^\[\]]*\]|【[^【】]*】|(Math\.)(?=\1)、[\u4e00-\u9fa5]+、\s、(sin|cos|tan)\(([0-9.]+)\)、([0-9.]+)\%、([0-9.]+)\‰、([0-9.)]+)\("

tmp1 = "+、-、*、/、.、(、)、[、]、、、、$1($2*3.141592654/180)、($1/100)、($1/1000)、$1*("

a = Split(tmp0, "、")

b = Split(tmp1, "、")

For i = 0 To UBound(a)

regex.Pattern = a(i)

s = regex.Replace(s, b(i))

Next i

' 如果字符串长度小于255,则使用Application.Evaluate计算

If Len(s) < 255 Then

JC = Application.Evaluate(s)

Exit Function

End If

' 更多字符串替换,添加函数支持

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、" & _

"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(、、+、、"

a = Split(tmp0, "、")

b = Split(tmp1, "、")

For i = 0 To UBound(a)

regex.Pattern = a(i)

s = regex.Replace(s, b(i))

Next i

' 使用JavaScript语言计算超长计算式

With CreateObject("htmlfile")

.write "<html><script></script></html>"

JC = CallByName(.parentwindow, "eval", VbMethod, s)

End With

End Function

该函数适用以下书写方式

15【个人】+1个

1+2*(4-6/2)支持四则运算括号

2个人+3个人 支持中文直接注释

35+5 支持注释行

5+5

三月 5个

四月 +6个

五月 +7个

支持空格 换行等书写方式 但请勿使用标点符号 因为容易被误识别

sin(30)支持三角函数 改成角度了

【中括号注释自动变蓝】1[支持各种中括号]

【←单位列输入123可以得到m m2 m3 简单快捷 容易理解】1+1

0 当然 也可以下拉选择

123/41

123÷41 支持全角运算符

20%+30‰ 支持百分号 千分号

1+.2 支持省略小数点前的零

.1+.2 跟按计算器习惯一致

2 数量列也支持计算式 注释

45+5

36+6

15.3*0.33

2+53

15+5

3+5

2+6

05+5

需1+5个

sin(30)

1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1

3+3

[+-*/()中文]0

1+2法官-3/4*5【在】

[+-*/()中文]

广东省
浏览 996
收藏
5
分享
5 +1
1
+1
全部评论 1
 
张俊
张俊

WPS函数专家

大佬的VBA写的是出神入化,虽然没有看懂啥意思,但是依然觉得很厉害!
· 上海
回复