在Excel中如何实现将输入的数字转换为大写的人民币? |
作者: 李登伦 发布时间:2003-11-18 23:37:42 阅读次数:未知 |
在EXCEL97和EXCEL2000中,系统并没有提供将输入的数字直接转换为大写人民币的函数,在这里,我用编程的方式实现了这种转换。为了和系统本身提供的函数RMB()相区别(其功能是将数字转换为加¥的小写人民币格式),我这里取名为cnRMB()。大家可能会问我如何使用?好,下面我一一讲来。 首先将下面的程序代码存为一个文本文件,如“人民币大写.bas”,注意扩展名要用bas,然后打开EXCEL(97和2000都可以),选择“工具->宏->Visual Basic 编辑器(V)”,是不是打开了一个窗口?在打开的窗口中选择“文件->导入文件(I)...”,在对话框中选择我们上面保存的文件(“人民币大写.bas”),OK,关闭这个窗口回到EXCEL。 在最左上的单元格(就是A1了,你不会不知道吧?)中输入数字123,在B1单元格中输入“=cnRMB(A1)”,呵呵,看到结果了吧?就和使用系统自带的函数一样啊。好了,就这么简单,一个函数就搞定了。比用EXCEL自身提供的函数多重嵌套实现起来简单多了吧? 如何一劳永逸? 当然有办法了,把你现在的这个文件存为模板不就得了么!要注意的是在用这个模板新建文件时要“启用宏”哦。 这段程序看起来短,可写了一天半,因为本人VB都忘得差不多了,一边查资料一边写,还真难了我好久。有不完善的地方(如只能实现最多15位数字,不能处理负值等),请大家多多指教。 以下为程序代码: Attribute VB_Name = "人民币大写" Rem ********************************************************************* Rem ** 函数名:getBitMoney() Rem ** Rem ** 功能: 转换一位数字为中文大写 Rem ** Rem ** 参数: moneyInput 输入数字 Rem ** Rem ** 功能: 返回中文大写数字 Rem ** Rem ** 作者: 四川省信息通信学校 李登伦 日期: 2003/3/20 Rem ** Rem *********************************************************************** Function getBitMoney(moneyInput) Select Case moneyInput Case 0 moneyOut = "0" Case 1 moneyOut = "壹" Case 2 moneyOut = "贰" Case 3 moneyOut = "叁" Case 4 moneyOut = "肆" Case 5 moneyOut = "伍" Case 6 moneyOut = "陆" Case 7 moneyOut = "柒" Case 8 moneyOut = "捌" Case 9 moneyOut = "玖" End Select getBitMoney = moneyOut End Function Rem ********************************************************************* Rem ** 函数名:cnRMB() Rem ** Rem ** 参数: money 输入金额 Rem ** Rem ** 功能: 返回中文大写金额 Rem ** Rem ** 作者: 四川省信息通信学校 李登伦 日期: 2003/03/20 Rem ** Rem *********************************************************************** Function cnRMB(money) myMoney = money Rem 由于VB中int型数据长度为16位,EXCEL中超过15位部分会被切断为0,如输入12345670123456会被改为12345670123450。 If Len(myMoney) > 17 Then MsgBox "你输入的数字太大了,长度不能大于15位。---【程序设计:李登伦】", , "出错啦!" cnRMB = "错误:数字太大" Exit Function End If If money <= 0 Then moneyChinese = "错误:不能为负值" Rem负值不用进行处理 cnRMB = moneyChinese Exit Function End If lenMoney = Len(money) Rem取得金额的位数 intMoney = Int(money) Rem用到了int()函数 intLen = Len(intMoney) Rem取得整数金额的位数 deciLen = lenMoney - intLen Rem小数位数 deciMoney = myMoney - intMoney Rem小数 myDeci = deciMoney If deciMoney > 0 Then money = intMoney lenMoney = intLen End If leftMoney = money wan = Null yi = Null For i = 1 To lenMoney leftMoney = Left(leftMoney, lenMoney - i + 1) temp = getBitMoney(Right(leftMoney, 1)) Rem取每一位转换并插入标记 If i > 4 And i < 9 And temp <> "0" And IsNull(wan) Then
Rem设置万位标志 moneyChineseTemp = "w" & moneyChineseTemp wan = 1 End If If i > 8 And temp <> "0" And IsNull(yi) Then
Rem设置亿位标志 moneyChineseTemp = "y" & moneyChineseTemp yi = 1 End If If temp <> "0" Then moneyChineseTemp = temp & i & moneyChineseTemp Else firstOne = Left(moneyChineseTemp, 1) Rem取第一个字元判断 If firstOne <> "0" & fistOne <> "w" & fisrtOne <> "y" And firstOne <> "" Then moneyChineseTemp = temp & moneyChineseTemp End If End If Next
Rem按位置替换以上设置的标志 moneyChineseTemp = Replace(moneyChineseTemp, "16", "仟") moneyChineseTemp = Replace(moneyChineseTemp, "15", "佰") moneyChineseTemp = Replace(moneyChineseTemp, "14", "拾") moneyChineseTemp = Replace(moneyChineseTemp, "13", "万") moneyChineseTemp = Replace(moneyChineseTemp, "12", "仟") moneyChineseTemp = Replace(moneyChineseTemp, "11", "佰") moneyChineseTemp = Replace(moneyChineseTemp, "10", "拾") moneyChineseTemp = Replace(moneyChineseTemp, "9", "") moneyChineseTemp = Replace(moneyChineseTemp, "8", "仟") moneyChineseTemp = Replace(moneyChineseTemp, "7", "佰") moneyChineseTemp = Replace(moneyChineseTemp, "6", "拾") moneyChineseTemp = Replace(moneyChineseTemp, "5", "") moneyChineseTemp = Replace(moneyChineseTemp, "4", "仟") moneyChineseTemp = Replace(moneyChineseTemp, "3", "佰") moneyChineseTemp = Replace(moneyChineseTemp, "2", "拾") moneyChineseTemp = Replace(moneyChineseTemp, "1", "") moneyChineseTemp = Replace(moneyChineseTemp, "0", "零") moneyChineseTemp = Replace(moneyChineseTemp, "w", "万") moneyChineseTemp = Replace(moneyChineseTemp, "y", "亿") moneyChinese = moneyChineseTemp & "元"
Rem处理小数部分,四舍五入。 If deciMoney > 0 Then deciMoney = Round(deciMoney, 5) & "00" deciM = Right(deciMoney, Len(deciMoney) - 1) deciMoney1 = Left(deciM, 3) carry = Val(Right(deciMoney1, 1)) Rem进位 If carry >= 5 Then deciMoney1 = Left(deciMoney1, 2) + 1 & "0" End If deciMoney = FormatNumber(deciMoney1 / 10) / 100 t1 = Right(deciMoney, Len(deciMoney) - 1) t2 = Right(deciMoney, Len(deciMoney) - 2) firstDec = Left(t1, 1) Rem第一位小数 secondDec = Left(t2, 1) Rem第二位小数 If firstDec = 0 Then dec1 = "零" Else dec1 = getBitMoney(firstDec) & "角" End If If secondDec = 0 Or secondDec = "" Then dec2 = "" Else dec2 = getBitMoney(secondDec) & "分" End If dec = dec1 & dec2 If dec1 = "零" And (dec2 = "0" Or dec2 = "") Then dec = "" End If End If If deciMoney = 0 Then moneyChinese = moneyChinese & "正" Else moneyChinese = moneyChinese & dec & "正" End If If myMoney < 1 Then moneyChinese = dec End If
Rem去掉多余的"零" lMoney = moneyChinese For i = 1 To Len(moneyChinese) moneyChinese = Replace(moneyChinese, "零零", "零") Next cnRMB = moneyChinese End Function 通信地址:四川省信息通信学校实验室 李登伦 邮编:618000 QQ:1049707 电子邮件: ldl@scxt.net |