Function N2RMB(M)
y = Int(Round(100 * Abs(M)) / 100) j = Round(100 * Abs(M) + 0.00001) - y * 100 f = (j / 10 - Int(j / 10)) * 10 A = IIf(y < 1, "", Application.Text(y, "[DBNum2]") & "元") b = IIf(j > 9.5, Application.Text(Int(j / 10), "[DBNum2]") & "角", IIf(y < 1, "", IIf(f > 1, "零", ""))) c = IIf(f < 1, "整", Application.Text(Round(f, 0), "[DBNum2]") & "分") N2RMB = IIf(Abs(M) < 0.005, "", IIf(M < 0, "负" & A & b & c, A & b & c)) End Function 另外一个函数: Function dx(M) '一条语句163个字符
dx = Replace(Replace(Replace(Join(Application.Text(Split(Format(M, " 0. 0 0;负 0. 0 0; ")), ["[DBnum2]"&{0,"","元0角;;元零","0分;;整"}]), a), "零元零", a), "零元", a), "零整", "整") End Function 代码解析:
代码中使用了Replace()、Join()、Split()、Format()等4个VBA函数,以及1个工作表函数Text()。 Join()函数:返回一个字符串,该字符串是通过连接某个数组中的多个子字符串而创建的。这与Split函数的作用完全相反。 格式:Join(list[,delimiter]) list:必需的。包含被连接子字符串的一维数组。 delimiter:可选的。在返回字符串中用于分隔子字符串的字符。如果忽略该项,则使用空格来分隔子字符串。如果该项是零长度字符串(""),则返回的字符串中,各子串之间没有分隔符。 代码中用变量a代替Join()的第二参数。因a的初始值为空,故此参数为空字符(""),表明返回的字符串中,各子串间无分隔。 例如: Join([{"Join","using","spaces"}]) 返回结果是:"Join using spaces" Join([{"Join","using","emptys"}], a) 返回结果是:"Joinusingemptys" Split()函数:返回一个下标从零开始的一维数组,它包含指定数目的子字符串。 格式:Split(expression[,delimiter[,limit[,compare]]]) expression:必需的。包含子字符串和分隔符的字符串表达式 。如果expression是一个长度为零的字符串(""),Split则返回一个空数组,即没有元素和数据的数组。 delimiter:可选的。用于标识子字符串边界的字符串字符。如果忽略,则使用空格字符(" ")作为分隔符。如果delimiter是一个长度为零的字符串,则返回的数组仅包含一个元素,即完整的expression字符串。 limit:可选的。要返回的子字符串数,忽略则默认-1,表示返回所有的子字符串。 compare:可选的。数字值,表示判别子字符串时使用的比较方式。忽略则默认1,执行文字比较。 Format()函数:根据有效的命名表达式来对指定的表达式进行格式化。 格式:Format(expression[, format[, firstdayofweek[, firstweekofyear]]]) 各参数含义如下: expression:必要参数。任何有效的表达式。 format:可选参数。有效的命名表达式或用户自定义格式表达式。 firstdayofweek:可选参数。常数,表示一星期的第一天。 firstweekofyear:可选参数。常数,表示一年的第一周。 代码中format函数的第二参数是" 0. 0 0;负 0. 0 0; ",格式中的0为占位符,每个0前边都有一个空格,第二个分号(;)后边有三个空格。第一个0表示整数部分的数字,第二个0表示小数十分位数字,第三个0表示小数百分位数字。第一个0前边的空格,表示这个空格前边还有一个空字符chr(0),换句话说,也就是空字符与整数数字之间有一个空格;第二个0前边的空格,表示整数数字与十分位数字之间有一个空格;第三个0前边的空格,表示十分位数字与百分位数字之间有一个空格。格式字串由分号(;)分成3段,第一段为M>0时的格式,第二段为M<0时的格式,比如-10.2将被格式化为“负 10. 2 0”;第三段为M=0时的格式,这里用3个空格代替,其目的是将四个空字符(由这3个空格分隔的)送到数字数组中。这里,Format 函数的参数居然和Text函数类似,也可以体现“正负零”3种状态(text是“正负零文本”4种状态),但不支持条件参数。 例如: 若M=123.09,则: format(M," 0. 0 0;负 0. 0 0; ")=" 123. 0 9" Split(Format(M, " 0. 0 0;负 0. 0 0; "))={"",123,0,9} 上式中,因各子串之间是由空格分隔的,所以Split()的第二参数可省略,即默认分隔符为空格。 若M=-123.09,则: format(M," 0. 0 0;负 0. 0 0; ")="负 123. 0 9" Split(Format(M, " 0. 0 0;负 0. 0 0; "))={"负",123,0,9} 代码中工作表函数Text()第一参数是数组,第二参数(即格式参数)也是数组。两个数组中的元素是逐一对应的关系。花括号{}表示工作表常量数组,方括号[]在这里表示VBA的常量数组。实际上,表达式["[DBnum2]"&{0, "", "元0角;;元零", "0分;;整"}]的计算结果即为{"[DBnum2]0", "[DBnum2]", "[DBnum2]元0角;;元零", "[DBnum2]0分;;整"}。 表达式Text(Split(Format(M, " 0. 0 0;负 0. 0 0; ")), ["[DBnum2]"&{0,"","元0角;;元零","0分;;整"}]) 属于Text()函数的高级应用, 可用3列纵向数组表示如下: 若M = 123.09 若M = ─0.05 数字数组 格式数组 Text()返回结果数组 数字数组 格式数组 Text()返回结果数组 (空字符) "[DBnum2]0" (空字符) 负 "[DBnum2]0" 负 123 "[DBnum2]" 壹佰贰拾叁 0 "[DBnum2]" 零 0 "[DBnum2]元0角;;元零" 元零 0 "[DBnum2]元0角;;元零" 元零 9 "[DBnum2]0分;;整" 玖分 5 "[DBnum2]0分;;整" 伍分 然后用Join()函数将结果数组连接起来。Join()的第二参数用变量a代替,变量a的初始值为空,表示子串之间无分隔。 当M=123.09,则Join后的大写金额为“壹佰贰拾叁元零玖分”, 当M=─0.05,则Join后的大写金额为“负零元零伍分”。 最后,将不符合大写规则的“零元零”、“零元”替换为空,将“零整”替换为“整”。 若源数据M=0,则大写结果显示为空白。 |
|