TEXT学废了!带分数(5又2分之1)的妙用!
具体案例
感兴趣的小伙伴可以先自己思考下怎么做,思考3分钟。
……
函数解析
=SUBSTITUTE(TEXT(SUMPRODUCT(--SUBSTITUTE(SUBSTITUTE("0 "&B3:H3,"箱","/1"),"盒","/16")),"#箱#盒/16箱"),"/16箱",)
"0 "&B3:H3这部分用0空格连接上B3:H3,结果为{"0 9盒","0 3箱","0 8盒","0 3箱","0 4盒","0 2盒","0 4箱"}。至于为什么要在B3:H3前连接0空格,等下就知道了。
SUBSTITUTE("0 "&B3:H3,"箱","/1")这部分将上一步结果中的"箱"字替换为"/1",得到的结果为{"0 9盒","0 3/1","0 8盒","0 3/1","0 4盒","0 2盒","0 4/1"}。这样原来是"3箱"的就变成了"0 3/1",这是带分数的形式,表示0又1分之3,还是3。
通过上面3步,实际上是把"箱"和"盒"的单位全部统一成以"箱"为单位,只不过用到了带分数的转化方法。
到这里相信大家都是可以理解的,下面用sumproduct将转化后的箱数加起来,也就是这部分SUMPRODUCT(--SUBSTITUTE(SUBSTITUTE("0 "&B3:H3,"箱","/1"),"盒","/16")),最后的结果为11.4375。
那如何将11.4375箱转化为"11箱7盒"呢?这部分才是关键。这里还是用到带分数,而且要结合text函数,也就是在text中使用带分数。公式为TEXT(11.4375,"#箱#盒/16箱"),得到的结果为"11箱7盒/16箱"。
这里text的第2参数"#箱#盒/16箱"中使用的就是带分数的格式代码,我们可以先把其中的文本去掉,这样方便理解。代码就简化为"# #/16",表示几又16分之几。第1个"#"表示整数部分,第2个"#"表示分子,"/16" 表示分母。这里要注意的地方是在第1个#和第2个#之间必须有一个空格或者是一些其他的文本字符,否则,2个#连在一起的话共同表示分子。
#在text的第2参数中代表数字占位符,当然也可以用0来表示占位符,但在本题中我们使用#,因为它有很大的好处,后面就知道了。
TEXT(11.4375,"# #/16")得到的结果为"11 7/16",也就是将11.4375转化为11又16分之7。然后我们可以在带分数的格式代码中插入一些文本,也就是刚开始"#箱#盒/16箱"这个代码。在整数部分后加个"箱",分子后加个"盒",分母后也加个"箱",分母后为什么也要加"箱",后面会说明的。
虽然结果得到了,但还有2个问题?当sumproduct求和的结果为整箱或整盒时,text得到的结果很令人费解。请看下面的2个公式。当text的第1参数为5时,返回的结果为"5箱",把后面的内容省去了;当text的第1参数为0.5时,返回的结果为"8盒/16箱",把前面的箱省去了。是不是很难理解?
2)当text的第1参数为小于1的小数时,"#箱#盒/16箱"这串格式代码中只会保留带分数的分子和分母,它会把整数省去,相当于把整数到分子前的部分给省去了,"#箱#盒/16箱",也就是把标绿色的那一截省略了,相当于只剩下了"#盒/16箱"。
=SUBSTITUTE(TEXT(SUMPRODUCT(IMREAL(IMDIV(SUBSTITUTE(SUBSTITUTE(0&B3:H3,"箱",),"盒","j"),{1;"16j"}))),"#箱#盒/16箱"),"/16箱",)
今天的文章有点长,慢慢消化,相信定会对你有所帮助。
https://pan.baidu.com/s/1h6tldxMkGGnN1aSDbsruBg