各位朋友,你们好。(本文文字较多。绝大部分文字可以直接一带而过,看动图演示即可)
今天和大家分享个不是所有人都需要(比如我的行业是工程造价,在用excel计算工程量的时候,就会经常用到)的功能:将表达式转化为结果(如下图所示)
表达式转结果
对于这个问题。我们有三种方式可以实现:
1、基础操作;2、函数公式;3、VBA自定义函数。
接下来我分别给大家演示这三种方法:
一、基础操作
基础操作是利用分列功能实现的,有两种方式可以实现效果,大家直接看动图演示:
1、使用【转换Lotus 1-2-3公式】
转换Lotus 1-2-3公式
2、通过添加等号的方式
表达式前添加等号,然后分列
二、函数公式
这里需要给大家介绍一个函数【EVALUATE】:
这个函数在微软的Excel中,是宏表函数,要在工作表中使用,就必须先把函数定义成名称;
这个函数在WPS中,是工作表函数,直接在工作表中就可以使用。
所以,有些朋友收到别人用WPS做的文件时,如果对方在工作表中用了这个函数,就会造成结果错误。
接下来我们还是用动图给大家演示效果:
1、用EVALUATE函数
定义名称方式实现
2、计算式中有注释的情况
计算式中带注释
遇到上图中的情况,我们也可以用EVALUATE函数实现,只是公式变复杂了:
=EVALUATE(SUBSTITUTE(SUBSTITUTE($A1,"【","*ISTEXT(""【"),"】","】"")"))
我们根据公式使用的三个函数,来分解这个很长的公式组合(从里往外分解):
1、结果1 =SUBSTITUTE($A1,"【","*ISTEXT(""【")="198*ISTEXT(""【长】*138*ISTEXT(""【宽】"
目的:将左边的“【”,用SUBStitute函数替换成"*ISTEXT(""【",即添加一个ISTEXT函数在注释符号前面;
2、结果2=SUBSTITUTE(结果1,"】","】"")")="198*ISTEXT(""【长】"")*138*ISTEXT(""【宽】"")"
目的:在后面的“】”后,添加一个括号,这个括号是ISTEXT函数的括号。从第2步的分解可以看出来,通过替换,将注释内容放到了ISTEXT函数里面了。
3、结果3=EVALUATE(结果2)=198*ISTEXT(""【长】"")*138*ISTEXT(""【宽】"")=198*1*238*1
目的:通过ISTEXT函数判断被分离出来的注释部分,判断出是文本格式,得到结果TRUE,转换为数值即为1。
我们用动图演示下效果:
定义复杂的公式
三、VBA方式
看到这里 ,有人会有疑问:既然通过函数公式完美解决了带注释的计算式计算的问题。还有必要用VBA吗?
我大答案是:很有必要,原因有以下几点:
- 定义名称对表格的位置要求限制得很紧,修改表格的布局,有可能导致重新修改定义名称中的公式;
- 此处一张工作表定义了一个名称,如果有多张工作表都是这样的数据要执行计算,那么定义的名称会非常多,不仅不便于管理,还会在使用中造成混乱;
所以,给各位普及下用VBA自己写一个函数:
1、定义一个解决不带注释计算式的函数,代码如下(代码要放在模块中):
Function Value1(Rng As Range, i As Integer)
Dim a As Double, Str As String '申明变量
Str = "(" & Rng & ")" '将表达式用括号括起来
a = Application.Evaluate(Str) '用EVALUATE函数计算结果
Value1 = Application.Round(a, i) '设置小数位数
End Function
这个代码包含以下信息:
定义的函数名称为:Value1,
这个函数包含两个参数:Rng是引用的单元格,i是要保留的小数位数
初级自定义函数
通过几句简单的代码 ,我们就多了一个可以使用的函数,是不是很神奇?其实,微软内置的函数也是这样一个一个用代码写出来的。只是内置的函数代码更复杂,且代码是经过封装的。
2、计算带注释的计算式,代码怎么写呢?
从上面动图可以看出来,简单的自定义函数,就像简单的定义名称公式一样,不能进行更复杂的判断,所以,要计算带注释的计算式,还需要添加几句处理注释信息的代码:
增加了几句用于判断【】符号的代码,大家从动图直接看效果:
升级版自定义函数
设置自定义函数的优势:
- 操作方便,就像使用内置函数一样 ,可以在此工作薄的任意工作表使用,不受表格设计上的限制;
- 将函数代码放在了文件的模块里面,把文件复制给其他人的时候,也能正常打开并使用这个函数;
四、复杂情况下的计算式
在有些时候,计算比较复杂内容时,会造成计算式特别长,EXCEL中,如果计算式长度达到255字符时,就无法再执行计算了,这时,我们就需要一个更高级的自定义函数,不受计算式长度的影响。
刚好,我在工作中写过这么一个自定义函数,可以实现。
由于函数代码较多,有150余行,不方便贴在文章里面,有需要的朋友,关注我,然后私信发送关键字【表达式计算】获取代码,代码中有注释,大家可以参考。我给大家演示效果:
可以计算3万多字符计算式的函数
这个函数可以计算超级长的计算式。演示中字符串长度到3万多,提示错误,并不是函数不支持那么多的计算,而是计算式的字符数超过了单元格容量的限制了。由于计算式出错,导致公式计算结果的错误。
最后再说下:需要代码的朋友,可以关注我后,私信发送关键字【表达式计算】获取文件和代码。
好了,今天就到这里,感谢各位朋友的关注和支持。
如果你喜欢我分享的内容,请点个赞支持下;
如果你觉得我分享的内容对你有帮助,可以关注我;
如果要看我以前分享过的好玩的内容,大家可以去我的主页查看历史文章。
,