ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 16034|回复: 32

[原创]最简短的人民币大写自定函数(11行),附由浅到更浅解说

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-1-1 23:14 | 显示全部楼层 |阅读模式
我是新手,网上很多人都写过人民币大写自定函数,用的公式又长,多则40多行少则20多行,而且有金额限制, 我看不懂。 可能真正的高手不屑于做这么简单的函数,所以我决定做一个简洁明了的,还没有限制,让比我还新的新手能看懂,由此迈进VBA。 只用了 if then , int , round, text , abs(不考虑负数可不用)共5 个 最简单常用语句。 虽然我是新手但我知道,有时思路比技术更重要。 请高手看看,试做一个更短的,让我们新手学习。 Function rmbb(M) y = Int(Abs(M)) j = Round(Abs(M) - y, 2) f = (j * 10 - Int(j * 10)) / 10 a = Application.Text(y, "[DBNum2]") d = "元" If j < 0.1 Then e = "" Else e = "角" If f < 0.01 Then g = "整" Else g = "分" If f < 0.01 Then c = "" Else c = Application.Text(Round(f * 100, 0), "[DBNum2]") If j = 0 Then b = "" Else b = Application.Text(Int(j * 10), "[DBNum2]") If M < 0 Then z = "负" Else z = "" rmbb = z & a & d & b & e & c & g End Function 更好的大写函数只有7 行,也是我写的,指教、指教 [em02] http://club.excelhome.net/dispbbs.asp?boardid=2&id=143867&star=1#143867
[此贴子已经被作者于2006-1-3 17:02:03编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-1-1 23:17 | 显示全部楼层

以下是由浅到更浅解说

为了看的更清楚,把11行 拆成15行, Function rmbb(M) 'Function:固定格式,不可改。rmbb:自定义函数的名称,可改 m:指要算的数字,可以是引用 以 12.34为例
y = Int(Abs(M)) 'y:指元 12.34截尾 得到 12
j = Round(Abs(M) - y, 2) 'j:指角 12.34-12 得到 0.34 因BUG,有时应为0.90时却得到0.899999987所以加上round
f = (j * 10 - Int(j * 10)) / 10 'f:指分 j*10=3.4 j*10截尾后=3 (3.4-3)/10=0.04 因要截尾操作所以先*10再/10

a = Application.Text(y, "[DBNum2]") 'a:指元的大写 Text是工作表函数,在此引用要加"Application." 得到 壹拾贰
b = Application.Text(Int(j * 10), "[DBNum2]") 'b:指角的大写 *10后再截尾 得到 叁
c = Application.Text(Round(f * 100, 0), "[DBNum2]") 'c:指分的大写 *100后再截尾,因BUG有时应为1时却得到0.9999999,
'所以加上round,得到 肆

d = "元" 'd、e、g 在正常情况下分别= 元、角、分
e = "角" '正常情况是指 元、角、分都有,例:12.34
g = "分"

If j < 0.1 Then e = "" '非正常情况:无角无分(12.00)、有角无分(12.30)、无角有分(12.04) c、b、e、g对应显示的字符
If f < 0.01 Then g = "整" '理论上应写做 f=0 还是BUG原因 有时会得到0.000000014056 所以写做 f<0.01
If f < 0.01 Then c = ""
If j = 0 Then b = ""
If M < 0 Then z = "负" Else z = "" '正负判断,个人认为这条无所谓,删了就行,好像没人会写负多少多少钱
rmbb = z & a & d & b & e & c & g '这就好理解了,把这些合起来得到 壹拾贰元叁角肆分


'使用方法:把这串代码复制到模块中就行了,说明文字会变绿色,可以删除的。例:A1格中有数字12.34,在B1格中输入"=rmbb(a1)"
'rmbb,y,j,f,a,b,c,d,e,g 这些都是自设的代码,可根据习惯修改
End Function

新手试作一下,1,如何把15行,改成11行 2,此函数输入0.34 显示 零元叁角肆分 如何改成 叁角肆分 能把它搞定,可说是入门了
[此贴子已经被作者于2006-1-2 0:28:55编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-1-2 05:01 | 显示全部楼层

因没考虑到要输入3位以上的小数,上面公式输入1.999 会出错,

把第二行 j = Round(Abs(M) - y, 2) 改为

j = Round(Int(Abs(100 * M)) / 100 - y, 2) 即可。作用:分以下舍去不计

如要分以下四舍五入,可用下面方式,注宏名是rmbc,以示区别

Function rmbc(M)
y = Int(Round(100 * Abs(M)) / 100)
j = Round(100 * Abs(M)) - y * 100
f = (j / 10 - Int(j / 10)) * 10
a = Application.Text(y, "[DBNum2]")
d = "元"
If j < 10 Then e = "" Else e = "角"
If f < 1 Then g = "整" Else g = "分"
If f < 1 Then c = "" Else c = Application.Text(Round(f, 0), "[DBNum2]")
If j = 0 Then b = "" Else b = Application.Text(Int(j / 10), "[DBNum2]")
If M < 0 Then z = "负" Else z = ""
rmbc = z & a & d & b & e & c & g
End Function

[此贴子已经被作者于2006-1-2 19:31:14编辑过]

TA的精华主题

TA的得分主题

发表于 2006-1-2 08:32 | 显示全部楼层
谢谢分享,楼主的精神值得嘉奖。

TA的精华主题

TA的得分主题

发表于 2006-1-2 09:29 | 显示全部楼层
unction rmbb(M)
y = Int(Abs(M))
j = Round(Abs(M) - y, 2)
f = (j * 10 - Int(j * 10)) / 10
a = Application.Text(y, "[DBNum2]")
d = "元"
If j < 0.1 Then e = "" Else e = "角"
If f < 0.01 Then g = "整" Else g = "分"
If f < 0.01 Then c = "" Else c = Application.Text(Round(f * 100, 0), "[DBNum2]")
If j = 0 Then b = "" Else b = Application.Text(Int(j * 10), "[DBNum2]")
If M < 0 Then z = "负" Else z = ""
If Val(a) < 1 Then
If Val(b) < 1 Then
rmbb = z & c & g
Else
rmbb = z & b & e & c & g
End If
Else
rmbb = z & a & d & b & e & c & g
End If
End Function
上面如果是0.202的值时,不对,请看为什么?

TA的精华主题

TA的得分主题

发表于 2006-1-2 09:40 | 显示全部楼层

Function rmbb(M)
y = Int(Abs(M))
j = Round(Abs(M) - y, 2)
f = (j * 10 - Int(j * 10)) / 10
a = Application.Text(y, "[DBNum2]")
d = "元"
If j < 0.1 Then e = "" Else e = "角"
If f < 0.01 Then g = "整" Else g = "分"
If f < 0.01 Then c = "" Else c = Application.Text(Round(f * 100, 0), "[DBNum2]")
If j = 0 Then b = "" Else b = Application.Text(Int(j * 10), "[DBNum2]")
If M < 0 Then z = "负" Else z = ""
If Int(Abs(M)) < 1 Then
If Abs(M * 10) - Abs(Int(M) * 10) < 1 Then
rmbb = z & c & g
Else
rmbb = z & b & e & c & g
End If
Else
rmbb = z & a & d & b & e & c & g
End If
End Function

改称上面的就可以了。呵呵,我学会了!

TA的精华主题

TA的得分主题

发表于 2006-1-2 10:54 | 显示全部楼层

很好,学习

不过从数学角度讲:

f = (j / 10 - Int(j / 10)) * 10
可以简写为:

f=j-int(j)

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-1-2 12:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

konggs兄:

不能改,改后输入 2.36 得 贰元叁角叁拾陆分

这玩意和数学还是有不同的。

TA的精华主题

TA的得分主题

发表于 2006-1-2 14:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
y = Int(Abs(M))
j = int(Abs(M)*10 mod 10)
f = int(Abs(M)*100 mod 10)

TA的精华主题

TA的得分主题

发表于 2006-1-2 14:54 | 显示全部楼层

楼主的代码输入0.10转换为零元壹角整

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-10-20 21:02 , Processed in 0.037806 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表