ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

一个数字转中文大写的方法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-2-24 17:31 | 显示全部楼层 |阅读模式
用到数字转中文大写功能,查看网上提供的方法,都不太满意,决定自己动手 DIY 一个。

  1. Private CNumber As Variant ' 中文大写数组
  2. Private CUnit As Variant ' 中文单位数组

  3. ' 中文大写与单位数组定义
  4. Private Sub CAPDef()
  5.     If IsEmpty(CNumber) Then CNumber = Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖")
  6.     If IsEmpty(CUnit) Then CUnit = Array("元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰")
  7. End Sub

  8. Public Function CAP(ByVal Number As Double) As String
  9.     Call Application.Volatile ' 强制计算
  10.    
  11.     Select Case Number
  12.     Case Is < 0: Call MsgBox("数字不能小于零"): Exit Function
  13.     Case Is >= 100000000000000#: Call MsgBox("数字必须小于一百万亿"): Exit Function ' 满足双精型数值精度要求
  14.     Case 0: CAP = "零元整": Exit Function
  15.     End Select

  16.     Call CAPDef ' 数组定义
  17.    
  18.     Dim b1 As Boolean, b2 As Boolean, i As Integer, iMod As Integer, iTail As Integer
  19.     Dim iStatus As Long ' 转换控制变量
  20.     Dim dTemp As Double ' 为保证求余和整除运算不溢出而将原数按 1E8 拆分
  21.     Dim asTemp(1 To 17) As String ' 按位寄存数组
  22.    
  23.     iTail = (Number - Int(Number)) * 100: Number = Fix(Number)
  24.     If Number >= 100000000# Then dTemp = Fix(Number / 100000000#): Number = Number - dTemp * 100000000# ' 超过 1E8 时拆分数值
  25.     ' 处理整数部分
  26.     Do
  27.         iMod = Number Mod 10: asTemp(14 - i) = CNumber(LBound(CNumber) + iMod)
  28.         If i Mod 4 = 0 Then ' 位置逻辑
  29.             b1 = False: b2 = False ' 初始化节
  30.             If iMod > 0 Then
  31.                 iStatus = iStatus * 4 + 3
  32.             Else
  33.                 b1 = True: iStatus = iStatus * 4 + 1
  34.             End If
  35.         Else
  36.             If b1 Then
  37.                 If iMod > 0 Then
  38.                     b1 = False: iStatus = iStatus * 4 + 3
  39.                 Else
  40.                     iStatus = iStatus * 4
  41.                 End If
  42.             ElseIf b2 Then
  43.                 If iMod > 0 Then
  44.                     b2 = False: iStatus = iStatus * 4 + 3
  45.                 Else
  46.                     iStatus = iStatus * 4
  47.                 End If
  48.             Else
  49.                 If iMod > 0 Then
  50.                     iStatus = iStatus * 4 + 3
  51.                 Else
  52.                     b2 = True: iStatus = iStatus * 4 + 2
  53.                 End If
  54.             End If
  55.         End If
  56.         Number = Number \ 10: i = i + 1
  57.         If Number = 0 Then
  58.             If dTemp = 0 Then
  59.                 Exit Do ' 完成控制变量计算并退出
  60.             ElseIf i = 8 Then
  61.                 Number = dTemp: dTemp = 0
  62.             End If
  63.         End If
  64.     Loop
  65.     For i = 14 - i + 1 To 14
  66.         Select Case iStatus Mod 4
  67.         Case 3: asTemp(i) = asTemp(i) & CUnit(LBound(CUnit) + 14 - i)
  68.         Case 1: asTemp(i) = CUnit(LBound(CUnit) + 14 - i)
  69.         Case 0: asTemp(i) = ""
  70.         End Select
  71.         iStatus = iStatus \ 4
  72.     Next i
  73.     ' 处理小数部分
  74.     If iTail > 0 Then
  75.         iMod = iTail Mod 10: iTail = iTail \ 10
  76.         If iTail = 0 Then
  77.             asTemp(15) = CNumber(LBound(CNumber))
  78.             asTemp(16) = CNumber(LBound(CNumber) + iMod) & "分"
  79.         ElseIf iMod = 0 Then
  80.             asTemp(15) = CNumber(LBound(CNumber) + iTail) & "角"
  81.             asTemp(17) = "整"
  82.         Else
  83.             asTemp(15) = CNumber(LBound(CNumber) + iTail) & "角"
  84.             asTemp(16) = CNumber(LBound(CNumber) + iMod) & "分"
  85.         End If
  86.     Else
  87.         asTemp(17) = "整"
  88.     End If
  89.    
  90.     CAP = Replace(Join(asTemp, ""), "亿万", "亿") ' 每节(四位一节)均为零时修正
  91. End Function
复制代码
把以上代码放在任意模块上,运行 CAP 方法即可。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-10 05:10 , Processed in 0.016923 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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