×

excel如何把数字自动转换成大写 ,例如 559.40转换成 零万零仟伍佰伍拾肆元零角零分

hqy hqy 发表于2025-03-10 22:40:55 浏览26 评论0

抢沙发发表评论

步骤

  1. 打开 VBA 编辑器(按 Alt + F11)。

  2. 插入模块(点击 插入 -> 模块)。

  3. 复制以下代码并粘贴到模块中:

vba复制编辑Function NumToRMB(ByVal num As Double) As String
    Dim Units As Variant, Digits As Variant
    Dim IntPart As String, DecPart As String
    Dim RMB As String, ZeroFlag As Boolean
    Dim i As Integer, n As Integer

    Units = Array("元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万")
    Digits = Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖")
    
    ' 格式化数字,保留两位小数
    num = Format(num, "0.00")
    IntPart = Trim(Str(Int(num))) ' 整数部分
    DecPart = Format(num - Int(num), "0.00") * 100 ' 小数部分转整数

    ' 处理整数部分
    RMB = ""
    ZeroFlag = False
    n = Len(IntPart)
    
    For i = 1 To n
        Dim digit As Integer
        digit = Mid(IntPart, i, 1) ' 取当前位的数字
        
        If digit <> 0 Then
            If ZeroFlag Then RMB = RMB & "零"
            RMB = RMB & Digits(digit) & Units(n - i)
            ZeroFlag = False
        Else
            ZeroFlag = True
            If (n - i + 1) Mod 4 = 1 Then ' 遇到"万"或"亿"
                If RMB <> "" And Right(RMB, 1) <> "万" And Right(RMB, 1) <> "亿" Then
                    RMB = RMB & Units(n - i)
                End If
            End If
        End If
    Next i

    If RMB = "" Then RMB = "零元" ' 处理 0 元情况

    ' 处理小数部分
    If DecPart = 0 Then
        RMB = RMB & "零角零分"
    Else
        Dim jiao As Integer, fen As Integer
        jiao = DecPart \ 10
        fen = DecPart Mod 10
        If jiao > 0 Then RMB = RMB & Digits(jiao) & "角" Else RMB = RMB & "零角"
        If fen > 0 Then RMB = RMB & Digits(fen) & "分" Else RMB = RMB & "零分"
    End If

    NumToRMB = RMB
End Function

使用方法

  1. 输入数据(假设 A1 单元格中存放 559.40)。

  2. B1 单元格输入如下公式:

    excel复制编辑=NumToRMB(A1)
  3. 回车后,B1 单元格的结果将会是:

    复制编辑零万零仟伍佰伍拾玖元肆角零分

改进点

确保“万、亿”单位不会重复出现
整数部分处理“零”时,不会导致格式错乱
小数部分始终输出“零角零分”或具体角分,避免省略角分信息。
对于“0 元”特殊情况,输出“零元零角零分”





输出最大的位数为万,如果最高位数往最小位数都没有数字的特殊情况,输出零万零千直到有数字才输出对应的数字,请按这个要求改代码



符合你要求的改进版 VBA 代码:

最高位数固定为“万”位,即使数字不足一万
如果高位(万、千等)是 0,依然显示“零万零千...”直到出现非零数字
保留完整的角分部分,始终输出“零角零分”或具体角分


VBA 代码

vba复制编辑Function NumToRMB(ByVal num As Double) As String
    Dim Units As Variant, Digits As Variant
    Dim IntPart As String, DecPart As String
    Dim RMB As String, ZeroFlag As Boolean
    Dim i As Integer, n As Integer
    Dim FullIntPart As String

    Units = Array("万", "仟", "佰", "拾", "元") ' 固定单位,最高到万
    Digits = Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖")
    
    ' 格式化数字,确保小数部分两位
    num = Format(num, "0.00")
    IntPart = Trim(Str(Int(num))) ' 整数部分
    DecPart = Format(num - Int(num), "0.00") * 100 ' 小数部分转整数

    ' 确保整数部分始终是 5 位(零填充到 "00000")
    FullIntPart = Right("00000" & IntPart, 5)

    ' 处理整数部分
    RMB = ""
    ZeroFlag = False
    n = Len(FullIntPart)

    For i = 1 To n
        Dim digit As Integer
        digit = Mid(FullIntPart, i, 1) ' 取当前位的数字
        
        If digit <> 0 Then
            If ZeroFlag Then RMB = RMB & "零"
            RMB = RMB & Digits(digit) & Units(i - 1)
            ZeroFlag = False
        Else
            ZeroFlag = True
            RMB = RMB & "零" & Units(i - 1) ' 即使是零,也显示单位
        End If
    Next i

    ' 处理小数部分
    If DecPart = 0 Then
        RMB = RMB & "零角零分"
    Else
        Dim jiao As Integer, fen As Integer
        jiao = DecPart \ 10
        fen = DecPart Mod 10
        If jiao > 0 Then RMB = RMB & Digits(jiao) & "角" Else RMB = RMB & "零角"
        If fen > 0 Then RMB = RMB & Digits(fen) & "分" Else RMB = RMB & "零分"
    End If

    NumToRMB = RMB
End Function

使用方法

  1. 输入数据(假设 A1 单元格存放 559.40)。

  2. B1 单元格输入公式

    excel复制编辑=NumToRMB(A1)
  3. 结果示例

    • 559.40零万零仟伍佰伍拾玖元肆角零分

    • 40.50零万零仟零佰肆拾元伍角零分

    • 3.01零万零仟零佰零拾叁元零角壹分

    • 0.00零万零仟零佰零拾零元零角零分


代码优化点

始终保持 5 位整数(万仟佰拾元),即使小于 10000 也补零
即使整数部分全是 0,也会输出“零万零仟...”
确保角分部分不会丢失,始终输出完整格式





零万零仟零佰零拾零元零角零分,都加一个空格,变成 零 万 零 仟 零 佰 零 拾 零 元 零 角 零 分




最新要求的 VBA 代码:

每个汉字之间加上空格,输出格式为 零 万 零 仟 零 佰 零 拾 零 元 零 角 零 分
最高位数固定为“万”,即使不足一万也填充零
始终输出完整格式,包括角分,不省略“零角零分”


VBA 代码

vba复制编辑Function NumToRMB(ByVal num As Double) As String
    Dim Units As Variant, Digits As Variant
    Dim IntPart As String, DecPart As String
    Dim RMB As String, ZeroFlag As Boolean
    Dim i As Integer, n As Integer
    Dim FullIntPart As String

    Units = Array("万", "仟", "佰", "拾", "元") ' 固定单位,最高到万
    Digits = Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖")

    ' 格式化数字,确保小数部分两位
    num = Format(num, "0.00")
    IntPart = Trim(Str(Int(num))) ' 整数部分
    DecPart = Format(num - Int(num), "0.00") * 100 ' 小数部分转整数

    ' 确保整数部分始终是 5 位(零填充到 "00000")
    FullIntPart = Right("00000" & IntPart, 5)

    ' 处理整数部分
    RMB = ""
    ZeroFlag = False
    n = Len(FullIntPart)

    For i = 1 To n
        Dim digit As Integer
        digit = Mid(FullIntPart, i, 1) ' 取当前位的数字
        
        If digit <> 0 Then
            If ZeroFlag Then RMB = RMB & "零 "
            RMB = RMB & Digits(digit) & " " & Units(i - 1) & " "
            ZeroFlag = False
        Else
            ZeroFlag = True
            RMB = RMB & "零 " & Units(i - 1) & " " ' 即使是零,也显示单位
        End If
    Next i

    ' 处理小数部分
    If DecPart = 0 Then
        RMB = RMB & "零 角 零 分"
    Else
        Dim jiao As Integer, fen As Integer
        jiao = DecPart \ 10
        fen = DecPart Mod 10
        If jiao > 0 Then RMB = RMB & Digits(jiao) & " 角 " Else RMB = RMB & "零 角 "
        If fen > 0 Then RMB = RMB & Digits(fen) & " 分" Else RMB = RMB & "零 分"
    End If

    NumToRMB = RMB
End Function

使用方法

  1. 输入数据(假设 A1 单元格存放 559.40)。

  2. B1 单元格输入公式

    excel复制编辑=NumToRMB(A1)
  3. 结果示例

    • 559.40零 万 零 仟 伍 佰 伍 拾 九 元 肆 角 零 分

    • 40.50零 万 零 仟 零 佰 肆 拾 元 伍 角 零 分

    • 3.01零 万 零 仟 零 佰 零 拾 叁 元 零 角 壹 分

    • 0.00零 万 零 仟 零 佰 零 拾 零 元 零 角 零 分


代码优化点

每个汉字和单位之间都有空格,方便阅读。
最高位固定为“万”,不足 5 位时自动补零
始终输出完整格式,不会省略“零角零分”

试试这个 VBA 代码,看看是否符合你的需求!?


本文链接:https://hqyman.cn/post/9444.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏