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, "負(fù)" & A & b & c, A & b & c)) End Function 另外一個(gè)函數(shù): Function dx(M) '一條語(yǔ)句163個(gè)字符
dx = Replace(Replace(Replace(Join(Application.Text(Split(Format(M, " 0. 0 0;負(fù) 0. 0 0; ")), ["[DBnum2]"&{0,"","元0角;;元零","0分;;整"}]), a), "零元零", a), "零元", a), "零整", "整") End Function 代碼解析:
代碼中使用了Replace()、Join()、Split()、Format()等4個(gè)VBA函數(shù),以及1個(gè)工作表函數(shù)Text()。 Join()函數(shù):返回一個(gè)字符串,該字符串是通過(guò)連接某個(gè)數(shù)組中的多個(gè)子字符串而創(chuàng)建的。這與Split函數(shù)的作用完全相反。 格式:Join(list[,delimiter]) list:必需的。包含被連接子字符串的一維數(shù)組。 delimiter:可選的。在返回字符串中用于分隔子字符串的字符。如果忽略該項(xiàng),則使用空格來(lái)分隔子字符串。如果該項(xiàng)是零長(zhǎng)度字符串(""),則返回的字符串中,各子串之間沒(méi)有分隔符。 代碼中用變量a代替Join()的第二參數(shù)。因a的初始值為空,故此參數(shù)為空字符(""),表明返回的字符串中,各子串間無(wú)分隔。 例如: Join([{"Join","using","spaces"}]) 返回結(jié)果是:"Join using spaces" Join([{"Join","using","emptys"}], a) 返回結(jié)果是:"Joinusingemptys" Split()函數(shù):返回一個(gè)下標(biāo)從零開(kāi)始的一維數(shù)組,它包含指定數(shù)目的子字符串。 格式:Split(expression[,delimiter[,limit[,compare]]]) expression:必需的。包含子字符串和分隔符的字符串表達(dá)式 。如果expression是一個(gè)長(zhǎng)度為零的字符串(""),Split則返回一個(gè)空數(shù)組,即沒(méi)有元素和數(shù)據(jù)的數(shù)組。 delimiter:可選的。用于標(biāo)識(shí)子字符串邊界的字符串字符。如果忽略,則使用空格字符(" ")作為分隔符。如果delimiter是一個(gè)長(zhǎng)度為零的字符串,則返回的數(shù)組僅包含一個(gè)元素,即完整的expression字符串。 limit:可選的。要返回的子字符串?dāng)?shù),忽略則默認(rèn)-1,表示返回所有的子字符串。 compare:可選的。數(shù)字值,表示判別子字符串時(shí)使用的比較方式。忽略則默認(rèn)1,執(zhí)行文字比較。 Format()函數(shù):根據(jù)有效的命名表達(dá)式來(lái)對(duì)指定的表達(dá)式進(jìn)行格式化。 格式:Format(expression[, format[, firstdayofweek[, firstweekofyear]]]) 各參數(shù)含義如下: expression:必要參數(shù)。任何有效的表達(dá)式。 format:可選參數(shù)。有效的命名表達(dá)式或用戶自定義格式表達(dá)式。 firstdayofweek:可選參數(shù)。常數(shù),表示一星期的第一天。 firstweekofyear:可選參數(shù)。常數(shù),表示一年的第一周。 代碼中format函數(shù)的第二參數(shù)是" 0. 0 0;負(fù) 0. 0 0; ",格式中的0為占位符,每個(gè)0前邊都有一個(gè)空格,第二個(gè)分號(hào)(;)后邊有三個(gè)空格。第一個(gè)0表示整數(shù)部分的數(shù)字,第二個(gè)0表示小數(shù)十分位數(shù)字,第三個(gè)0表示小數(shù)百分位數(shù)字。第一個(gè)0前邊的空格,表示這個(gè)空格前邊還有一個(gè)空字符chr(0),換句話說(shuō),也就是空字符與整數(shù)數(shù)字之間有一個(gè)空格;第二個(gè)0前邊的空格,表示整數(shù)數(shù)字與十分位數(shù)字之間有一個(gè)空格;第三個(gè)0前邊的空格,表示十分位數(shù)字與百分位數(shù)字之間有一個(gè)空格。格式字串由分號(hào)(;)分成3段,第一段為M>0時(shí)的格式,第二段為M<0時(shí)的格式,比如-10.2將被格式化為“負(fù) 10. 2 0”;第三段為M=0時(shí)的格式,這里用3個(gè)空格代替,其目的是將四個(gè)空字符(由這3個(gè)空格分隔的)送到數(shù)字?jǐn)?shù)組中。這里,F(xiàn)ormat 函數(shù)的參數(shù)居然和Text函數(shù)類(lèi)似,也可以體現(xiàn)“正負(fù)零”3種狀態(tài)(text是“正負(fù)零文本”4種狀態(tài)),但不支持條件參數(shù)。 例如: 若M=123.09,則: format(M," 0. 0 0;負(fù) 0. 0 0; ")=" 123. 0 9" Split(Format(M, " 0. 0 0;負(fù) 0. 0 0; "))={"",123,0,9} 上式中,因各子串之間是由空格分隔的,所以Split()的第二參數(shù)可省略,即默認(rèn)分隔符為空格。 若M=-123.09,則: format(M," 0. 0 0;負(fù) 0. 0 0; ")="負(fù) 123. 0 9" Split(Format(M, " 0. 0 0;負(fù) 0. 0 0; "))={"負(fù)",123,0,9} 代碼中工作表函數(shù)Text()第一參數(shù)是數(shù)組,第二參數(shù)(即格式參數(shù))也是數(shù)組。兩個(gè)數(shù)組中的元素是逐一對(duì)應(yīng)的關(guān)系?;ɡㄌ?hào){}表示工作表常量數(shù)組,方括號(hào)[]在這里表示VBA的常量數(shù)組。實(shí)際上,表達(dá)式["[DBnum2]"&{0, "", "元0角;;元零", "0分;;整"}]的計(jì)算結(jié)果即為{"[DBnum2]0", "[DBnum2]", "[DBnum2]元0角;;元零", "[DBnum2]0分;;整"}。 表達(dá)式Text(Split(Format(M, " 0. 0 0;負(fù) 0. 0 0; ")), ["[DBnum2]"&{0,"","元0角;;元零","0分;;整"}]) 屬于Text()函數(shù)的高級(jí)應(yīng)用, 可用3列縱向數(shù)組表示如下: 若M = 123.09 若M = ─0.05 數(shù)字?jǐn)?shù)組 格式數(shù)組 Text()返回結(jié)果數(shù)組 數(shù)字?jǐn)?shù)組 格式數(shù)組 Text()返回結(jié)果數(shù)組 (空字符) "[DBnum2]0" (空字符) 負(fù) "[DBnum2]0" 負(fù) 123 "[DBnum2]" 壹佰貳拾叁 0 "[DBnum2]" 零 0 "[DBnum2]元0角;;元零" 元零 0 "[DBnum2]元0角;;元零" 元零 9 "[DBnum2]0分;;整" 玖分 5 "[DBnum2]0分;;整" 伍分 然后用Join()函數(shù)將結(jié)果數(shù)組連接起來(lái)。Join()的第二參數(shù)用變量a代替,變量a的初始值為空,表示子串之間無(wú)分隔。 當(dāng)M=123.09,則Join后的大寫(xiě)金額為“壹佰貳拾叁元零玖分”, 當(dāng)M=─0.05,則Join后的大寫(xiě)金額為“負(fù)零元零伍分”。 最后,將不符合大寫(xiě)規(guī)則的“零元零”、“零元”替換為空,將“零整”替換為“整”。 若源數(shù)據(jù)M=0,則大寫(xiě)結(jié)果顯示為空白。 |
|