从最早讨论人民币大写到现在,早已超出了其实用性的范畴,早几年前就有完善的代码和公式了。 研究最短的写法,兴趣、记录和自我挑战是更加重要的因素,同时也能发掘出不少技巧,增加对一些函数、方法的了解。 Format(M, " 0. 0 0;负 0. 0 0; ") 和 IF(A1^2<1,,"零") 这两种写法就是代表。 Function dx(M) dx = Replace(Replace(Join(Application.Text(Split(Format(M, " 0. 0 0;; ")), ["[DBnum2]"&{0,"","圆0角;;圆零","0分;;整"}]), a), "零圆", a), "零整", "整") '136字符 缺陷:零伍分 End Function
Function dx(M) dx = Replace(Join(Application.Text(Split(Format(M, " 0. 0 0;; ")), ["[DBnum2]"&{0,"","圆0角;;圆","0分;;整"}]), ""), "零圆", a) '115 字符 错误:伍圆伍分 圆分之间 没有零,虽然最短但根据规则 这是错误的! 这个规则让人郁闷,但规则就是规则。 End Function Function dx(M) dx = Replace(Replace(Replace(Join(Application.Text(Split(Format(M, " 0. 0 0;; ")), ["[DBnum2]"&{0,"","圆0角;;圆零","0分;;整"}]), a), "零圆零", a), "零圆", a), "零整", "整") '155字符 A 无缺陷 负数显示 “-” -伍圆陆角伍分 写法A 圆角间 无零 End Function Function dx(M) dx = Replace(Replace(Replace(Join(Application.Text(Split(Format(M, " 0. 0 0;; ")), ["[DBnum2]"&{0,"","圆0角;;圆","0分;;整"}]), a), "零圆", a), "圆", "圆零"), "零整", "整") '155字符 B 无缺陷 负数显示 “-” 伍圆零陆角伍分 写法B 圆角间 有零 End Function 仔细阅读了一下规则(8 楼),圆角之间的零可有可无。 但圆分之间必须有零。 但规则没指明 0.03 (只有分)的情况下, 叁分 或 零叁分哪 一种写法正确,通常的习惯 是叁分 规则中也没指出 负数的情况 是是显示 - 还是 负,通常的习惯 是 负, 但个人认为出现负值时 有个明显标识即可,- 与 负 都可以。 Text函数处理负数 也只显示 - 。 =Text(-123,"[DBnum2]") --> = -壹贰叁 如果确定要显示 - 为 负 , 上面的155A 和155B 也用不着增加一个replace(.....,"-","负") 的嵌套。 这也许算是个新发现,因为之前没见过这样的用法: Format函数的参数 居然和 Text 类似 也可以体现 正负零 3 种状态(text是正负零文本4 种状态),但不支持条件参数。 所以155A 或 155B 的formart的参数 改为 Format(M, " 0. 0 0;负 0. 0 0; "),增加8个字符 即可解决 - 变负的问题 Function dx(M) dx = Replace(Replace(Replace(Join(Application.Text(Split(Format(M, " 0. 0 0;负 0. 0 0; ")), ["[DBnum2]"&{0,"","圆0角;;圆零","0分;;整"}]), a), "零圆零", a), "零圆", a), "零整", "整") '163字符A 无缺陷 负数显示 “负” 负伍圆陆角伍分 End Function 虽然以上几个函数都相当短,但调用Text数组函数后进行数组到字符串的转换,效率较低。对追求效率的人来说未免有些遗憾。 如果要提高效率,则必须减少对Text函数的调用,VBA中调用Text函数 不能用 "[dbnum2]G/通用格式元;;" 这种在公式中有效方法。 只能想个方法变通。 Function dx(M) dx = Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Application.Text(Format(M, ".012034;;0"), "[=]g;[DBnum2]"), "叁肆", "分"), "壹贰", "角"), "零分", "整"), "零角", "零"), "零.零", a), "零.", a), "零整", "整"), ".", "元") '214字符 无缺陷 负数显示 “-” -伍圆陆角伍分 写法A :圆角间 无零,如需显示“负”则要增加一个replace(.....,"-","负") 的嵌套 End Function Function dx(M) dx = Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Application.Text(Format(M, ".012034;;0"), "[=]g;[DBnum2]"), ".", "元零"), "叁肆", "分"), "壹贰", "角"), "零分", "整"), "零角", a), "零元零", a), "零元", a), "零整", "整") '213字符 无缺陷 负数显示 “-” -伍圆零陆角伍分 写法B: 圆角间 有零 End Function 看看这两个 213 和 214 字符 用了8个Replace函数进行替换,虽然多了50多字符,但速度快了几乎10倍,与用纯VB代码(不使用Application.Text函数)编写函数比也不差。 Format(M, ".012034;;0") 这个用法也属于第一次使用。用 12 代替角,34代替 分,然后替换 Text后的结果,注意,必须是不含0的4个不重复的数字。 ------------------------------------------------------------------------------------------------------------------------------ 顺便在 附上两个 目前最短的 公式 167字符A =SUBSTITUTE(SUBSTITUTE(IF(-RMB(A1),IF(A1<0,"负",)&TEXT(INT(ABS(A1)+0.5%),"[dbnum2]G/通用格式元;;")&TEXT(RIGHT(RMB(A1),2),"[dbnum2]0角0分;;整"),),"零角",IF(A1^2<1,,"零")),"零分","整")
IF(A1<0,"负",) 不能有效处理A1单元格属性是文本(或 =-123&"")的的情况 用 TEXT(A1,";负") 代替 IF(A1<0,"负",) 进行负值判断 可以增加处理文本单元格的功能 167字符B =SUBSTITUTE(SUBSTITUTE(IF(-RMB(A1),TEXT(A1,";负")&TEXT(INT(ABS(A1)+0.5%),"[dbnum2]G/通用格式元;;")&TEXT(RIGHT(RMB(A1),2),"[dbnum2]0角0分;;整"),),"零角",IF(A1^2<1,,"零")),"零分","整") 出自 wshcw网友、百度Excel吧 161字符:显示负数为 - ,这个161字符函数是在与wshcw的交流中学习所得。
=TEXT(RMB(A1),"[=]g;"&TEXT(INT(ABS(A1)+0.5%),"[dbnum2]G/通用格式元;;")&SUBSTITUTE(SUBSTITUTE(TEXT(RIGHT(RMB(A1),2),"[dbnum2]0角0分;;整"),"零角",IF(A1^2<1,,"零")),"零分","整")) |