ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 金额大写转小写的宏函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-11-1 09:33 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
可能由于中文表示法的博大精深,论坛上解决金额大写转小写的方法与小写转大写相比十分稀少,找到几个发现对大金额(兆以上)无法转换
由于工作需要,参考众家所长写了以下宏函数,欢迎测试,同时还有一个问题未解决: 单写元,万,亿,兆,转换为0,不能直接转换为1,10000等,望集大家智慧能完美解决
Function 金额转换(Optional ByVal InString As String = "-0.00", Optional ByVal Flag As String = "小写转大写") As String
On Error Resume Next
Err.Clear
Dim Ll1 As Long
Dim Ss1 As String
Dim Ss2 As String
金额转换 = ""
If InString = "-0.00" Then
  Flag = InputBox("请输入处理方式:" & vbCrLf & "小写转大写" & vbCrLf & "大写转小写(支持非规范写法)", "金额转换", "小写转大写")
  InString = InputBox("请输入需转换的内容", "金额转换", "0.00")
  Ss2 = "1"
End If
Select Case Flag
  Case "小写转大写"
   Ss1 = Replace(Application.Text(Round(CCur(InString) + 0.00001, 2), "[DBnum2]"), ".", "元")
   Ss1 = IIf(Left(Right(Ss1, 3), 1) = "元", Left(Ss1, Len(Ss1) - 1) & "角" & Right(Ss1, 1) & "分", IIf(Left(Right(Ss1, 2), 1) = "元", Ss1 & "角整", IIf(Ss1 = "零", "", Ss1 & "元整")))
   Ss1 = Replace(Replace(Replace(Replace(Ss1, "零元零角", ""), "零元", ""), "零角", "零"), "-", "负")
   If Ss1 = "" Then Ss1 = "零元整"
   If Er Then Ss1 = "Error"
  Case "大写转小写" '单写元,万,亿,兆,转换为0
   InString = Replace(Replace(InString, "零", "0"), "○", "0")
   InString = Replace(Replace(InString, "壹", "1"), "一", "1")
   InString = Replace(Replace(Replace(InString, "贰", "2"), "二", "2"), "弍", "2")
   InString = Replace(Replace(InString, "叁", "3"), "三", "3")
   InString = Replace(Replace(InString, "肆", "4"), "四", "4")
   InString = Replace(Replace(InString, "伍", "5"), "五", "5")
   InString = Replace(Replace(InString, "陆", "6"), "六", "6")
   InString = Replace(Replace(InString, "柒", "7"), "七", "7")
   InString = Replace(Replace(InString, "捌", "8"), "八", "8")
   InString = Replace(Replace(InString, "玖", "9"), "九", "9")
   InString = Replace(Replace(Replace(Replace(Replace(Replace(InString, "点", ""), "正", "整"), "整", ""), "元", "圆"), "块", "圆"), "毛", "角")
   InString = Replace(Replace(Replace(InString, "十", "拾"), "百", "佰"), "千", "仟")
   For Ll1 = 1 To Len(InString)
    Select Case Mid(InString, Ll1, 1)
     Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
      Select Case Mid(InString, Ll1 + 1, 1)
       Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
        If Mid(InString, Ll1, 1) = "0" Then
         InString = Left(InString, Ll1 - 1) & Right(InString, Len(InString) - Ll1)
         Ll1 = Ll1 - 1
        Else
         Ss1 = "Error"
         GoTo E1:
        End If
      End Select
    End Select
   Next
   If Mid(InString, Len(InString), 1) <> "分" Then InString = InString & "0分"
   If Mid(InString, Len(InString) - 2, 1) <> "角" Then InString = Left(InString, Len(InString) - 2) & "0角" & Right(InString, 2)
   If Mid(InString, Len(InString) - 4, 1) <> "圆" Then InString = Left(InString, Len(InString) - 4) & "0圆" & Right(InString, 4)
   If InStr("012356789", Mid(InString, Len(InString) - 5, 1)) = 0 Then InString = Left(InString, Len(InString) - 5) & "0圆" & Right(InString, 4)
   If Mid(InString, Len(InString) - 6, 1) <> "拾" Then InString = Left(InString, Len(InString) - 6) & "0拾" & Right(InString, 6)
   If InStr("012356789", Mid(InString, Len(InString) - 7, 1)) = 0 Then InString = Left(InString, Len(InString) - 7) & "1拾" & Right(InString, 6)
   If Mid(InString, Len(InString) - 8, 1) <> "佰" Then InString = Left(InString, Len(InString) - 8) & "0佰" & Right(InString, 8)
   If InStr("012356789", Mid(InString, Len(InString) - 9, 1)) = 0 Then InString = Left(InString, Len(InString) - 9) & "1佰" & Right(InString, 8)
   If Mid(InString, Len(InString) - 10, 1) <> "仟" Then InString = Left(InString, Len(InString) - 10) & "0仟" & Right(InString, 10)
   If InStr("012356789", Mid(InString, Len(InString) - 11, 1)) = 0 Then InString = Left(InString, Len(InString) - 11) & "1仟" & Right(InString, 10)
   If Mid(InString, Len(InString) - 12, 1) <> "万" Then InString = Left(InString, Len(InString) - 12) & "0万" & Right(InString, 12)
   If InStr("012356789", Mid(InString, Len(InString) - 13, 1)) = 0 Then InString = Left(InString, Len(InString) - 13) & "0万" & Right(InString, 12)
   If Mid(InString, Len(InString) - 14, 1) <> "拾" Then InString = Left(InString, Len(InString) - 14) & "0拾" & Right(InString, 14)
   If InStr("012356789", Mid(InString, Len(InString) - 15, 1)) = 0 Then InString = Left(InString, Len(InString) - 15) & "1拾" & Right(InString, 14)
   If Mid(InString, Len(InString) - 16, 1) <> "佰" Then InString = Left(InString, Len(InString) - 16) & "0佰" & Right(InString, 16)
   If InStr("012356789", Mid(InString, Len(InString) - 17, 1)) = 0 Then InString = Left(InString, Len(InString) - 17) & "1佰" & Right(InString, 16)
   If Mid(InString, Len(InString) - 18, 1) <> "仟" Then InString = Left(InString, Len(InString) - 18) & "0仟" & Right(InString, 18)
   If InStr("012356789", Mid(InString, Len(InString) - 19, 1)) = 0 Then InString = Left(InString, Len(InString) - 19) & "1仟" & Right(InString, 18)
   If Mid(InString, Len(InString) - 20, 1) <> "亿" Then InString = Left(InString, Len(InString) - 20) & "0亿" & Right(InString, 20)
   If InStr("012356789", Mid(InString, Len(InString) - 21, 1)) = 0 Then InString = Left(InString, Len(InString) - 21) & "0亿" & Right(InString, 20)
   If Mid(InString, Len(InString) - 22, 1) <> "拾" Then InString = Left(InString, Len(InString) - 22) & "0拾" & Right(InString, 22)
   If InStr("012356789", Mid(InString, Len(InString) - 23, 1)) = 0 Then InString = Left(InString, Len(InString) - 23) & "1拾" & Right(InString, 22)
   If Mid(InString, Len(InString) - 24, 1) <> "佰" Then InString = Left(InString, Len(InString) - 24) & "0佰" & Right(InString, 24)
   If InStr("012356789", Mid(InString, Len(InString) - 25, 1)) = 0 Then InString = Left(InString, Len(InString) - 25) & "1佰" & Right(InString, 24)
   If Mid(InString, Len(InString) - 26, 1) <> "仟" Then InString = Left(InString, Len(InString) - 26) & "0仟" & Right(InString, 26)
   If InStr("012356789", Mid(InString, Len(InString) - 27, 1)) = 0 Then InString = Left(InString, Len(InString) - 27) & "1仟" & Right(InString, 26)
   If Mid(InString, Len(InString) - 28, 1) <> "兆" Then InString = Left(InString, Len(InString) - 28) & "0兆" & Right(InString, 28)
   If InStr("012356789", Mid(InString, Len(InString) - 29, 1)) = 0 Then InString = Left(InString, Len(InString) - 29) & "0兆" & Right(InString, 28)
   If Mid(InString, Len(InString) - 30, 1) <> "拾" Then InString = Left(InString, Len(InString) - 30) & "0拾" & Right(InString, 30)
   If InStr("012356789", Mid(InString, Len(InString) - 31, 1)) = 0 Then InString = Left(InString, Len(InString) - 31) & "1拾" & Right(InString, 30)
   If Mid(InString, Len(InString) - 32, 1) <> "佰" Then InString = Left(InString, Len(InString) - 32) & "0佰" & Right(InString, 32)
   If InStr("012356789", Mid(InString, Len(InString) - 33, 1)) = 0 Then InString = Left(InString, Len(InString) - 33) & "1佰" & Right(InString, 32)
   If Len(Replace(InString, "负", "")) <> 34 Then
    Ss1 = "Error"
    GoTo E1:
   End If
   For Ll1 = 1 To Len(InString)
    Select Case Mid(InString, Ll1, 1)
     Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "负"
      Ss1 = Ss1 & Mid(InString, Ll1, 1)
     Case Else
    End Select
   Next
   Ss1 = Replace(Left(Ss1, Len(Ss1) - 2) & "." & Right(Ss1, 2), "负", "-")
   Ss1 = CStr(CCur(Ss1))
   If Ss1 = "" Then Ss1 = "Error"
End Select
E1:
If Ss2 = "1" Then MsgBox Ss1
金额转换 = Ss1
End Function

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-11-1 09:49 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
LDY版主有精简代码:
Function DxToN(ss)
For i% = 1 To 9
ss = Replace(ss, Mid("壹贰叁肆伍陆柒捌玖", i, 1), i)
ss = Replace(ss, Mid("一二三四五六七八九", i, 1), i)
Next
For i% = Len(ss) To 1 Step -1
s$ = Mid$(ss, i, 1)
X% = InStr("分角圆拾佰仟万拾佰仟亿拾佰仟兆", s)
If X = 0 Then X% = InStr("分毛元十百千万十百千亿十百千兆", s)
If X = 0 Then X% = InStr("分毛块十百千万十百千亿十百千兆", s)
If X Then j% = IIf(j% < X, X, ((j - 3) \ 4) * 4 + X)
If Val(s) Then m# = m# + (s & String(j - 1, "0")) / 100
Next
DxToN = Round(m, 2)
If InStr(ss, "-") Or InStr(ss, "负") Then DxToN = -DxToN
End Functi

TA的精华主题

TA的得分主题

发表于 2012-12-10 11:47 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-6-24 21:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这个太厉害了

TA的精华主题

TA的得分主题

发表于 2017-6-26 23:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
大写转小写数字原来这么难!

TA的精华主题

TA的得分主题

发表于 2017-6-26 23:36 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
先留下记号。以前用的是函数

TA的精华主题

TA的得分主题

发表于 2017-6-27 11:33 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-20 06:11 , Processed in 0.051666 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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