1以此图为事例2 公式一、人民币大写规则的函数公式:=substitute(substitute(if(a1>-0.5%,,"负")&text(int(abs(a1)+0.5%),"[dbnum2]g/通用格式元;;")&text(right(fixed(a1),2),"[dbnum2]0角0分;;"&if(abs(a1)>1%,"整",)),"零角",if(abs(a1)<1,,"零")),"零分","整")3 公式二、人民币求和大写规则函数公式:="人民币(含税17%):"&if((sum(d2:d5)-int(sum(d2:d5)))=0,text(sum(d2:d5),"[dbnum2]")&"元整",if(int(sum(d2:d5)*10)-sum(d2:d5)*10=0,text(int(sum(d2:d5)),"[dbnum2]")&"元"&text((int(sum(d2:d5)*10)-int(sum(d2:d5))*10),"[dbnum2]")&"角整",text(int(sum(d2:d5)),"[dbnum2]")&"元"&if(int(sum(d2:d5)*10)-int(sum(d2:d5))*10=0,"零",text(int(sum(d2:d5)*10)-int(sum(d2:d5))*10,"[dbnum2]")&"角")&text(right(sum(d2:d5),1),"[dbnum2]")&"分"))&"(¥"&sum(d2:d5)&"元)"4以上公式分解如下: 1、这个公式中用了substitute()、if()、text()、int()、abs()、right()、fixed()七个函数,其中text()函数的两次使用都是运用了高级应用,这也是本公式最难看懂的地方,另个为了符合人民币的读数规则;两次使用了substitute()对出现不符合读数规定的字符用有效字符替换,这一点也很重要。 2、本题的基本思路是:一是用if函数判断需要转换数据的正、负(如果是正数就不用在数值前显示“正”,负则必须显示“负”字);二是用abs函数对数据源数值进行求绝对值,然后用ind函数对这个绝对值截取整数部分的数值,再把整数部分的数值交由text函数转换成中文大写;三是对小数部分的数值处理,通过用fixed函数对源数据进行四舍五入保留2位有效数字并用文本显示,然后用right函数将显示的文本从右边截取两位数值(即保留的小数位数据),再把这两位数交由text函数转换成中文大写;四是人民币大写最后有个“整”字也补上。最后把一至四的结果用“&”连接成一个完整的文本内容,把这个连接的文本交由substitute函数替换两次,第一次让其把连接文本中出现不合规读法字“零角”用“零”替换,第二次“零分”用“整”替换。最终实现小写到大写的完整转换。 3、细节疑问解释: ①、if(a1>-0.5%,,"负")。因为-0.5%=-0.005(即5厘钱或半分,但人民币只保留分位),a1>-0.5%即是a1的值小于5厘,会被四舍五入舍去,如果a1>-0.5%为真,也就是a1是大于或等于0时,显示“空白”,否则显示“负”字; ②、为什么int(abs(a1)+0.5%)中要加0.5%?这是为了把数据源a1的千分位上大于或等于5(即5厘钱)及时进位,便于int函数截取整数的数据正确(即是四舍五入后的整数); ③、text函数的第二个参数"[dbnum2]g/通用格式元;;"和"[dbnum2]0角0分;;" 。这是对text函数的高级应用,第二个参数是使用了“条件格式”。基本形式是:text(数据源,"[条件1]显示格式;[条件2]显示格式;否则显示格式;文本显示格式")。对照两个第二个参数可知,都是用了条件1且条件都是[dbnum2](即小写转为中文大写)。但是显示格式不同,前一个是“g/通用格式”并且加了个“元”字,相当于单元格设置中的“常规”并对转换后数字补添整数位单位“元”;后一个是“0角0分”,这个0在这里不是数字0,而是占位符,由两位小数数字依顺序对应填入,这点菜鸟最容易弄错!还有就是显示格里的两个分号(;;)。根据text函数高级的基本形式,第二个参数有4个显示格式,是用“;”分隔的(共三个;),例中都是用了条件1,本来后面应有三个“;”,为何只有两个而少一个呢?原来仅用条件1时,它包含了大于和等于0两个条件(即包含条件1和条件3)。5下面再提供一个符合人民币大写规则的函数公式:=substitute(substitute(substitute(if(-rmb(a1,2),text(a1,";负")&text(int(abs(a1)+0.5%),"[dbnum2]g/通用格式元;;")&text(right(rmb(a1,2),2),"[dbnum2]0角0分;;整"),),"零角",if(a1^2<1,,"零")),"万",if(and(mod(abs(a1%),1000)<100,mod(abs(a1%),1000)>=10),"万零","万")),"零分","整")end 20210311