说实话,每次碰到要把Excel里那个光溜溜的阿拉伯数字,变成财务报表上、发票上、或者各种正式文件里头那个——呃,怎么说呢——“高大上”的大写汉字,比如“123.45”变成“壹佰贰拾叁元肆角伍分”,我心里都得咯噔一下。别看这事儿小,搞不定它,你那张表可能就废了,或者更糟,得手!动!一个字一个字地敲!想想那个场景,几百个数字等着你,头都大了,是不是?尤其是在报销季,或者月底结账的时候,那简直是场噩梦。
以前刚入行那会儿,没少在这上面栽跟头。领导要的报表,金额栏我直接把数字放进去,结果被劈头盖脸一顿骂,说财务报表上的钱,就得是大写,一个小数点都不能含糊,那是规矩!那时候傻啊,就吭哧吭哧地,对着计算器,或者干脆心算,把数字拆开,“一千二百三十四点五六”,然后一个字一个字打“壹仟贰佰叁拾肆元伍角陆分”,中间要是看错了位数,还得回去删了重来。那叫一个效率低下,而且错漏百出。你说这事儿,电脑不就是干这个的吗?为什么就不能一键搞定?
后来才知道,其实Excel早就给你准备好工具了,只不过藏得有点深,或者说,你需要知道那“咒语”。我摸索来摸索去,总算弄明白了几个常用的法子。今天就跟你聊聊,我是怎么把这个“数字转大写”的硬骨头给啃下来的,保证比你手动敲字省事儿一万倍。
第一个法子:祭出大招——TEXT
函数!
这玩意儿,听名字挺普通,但功能强大着呢。TEXT
函数的作用,简单说,就是把一个数值,按照你给它的一个“格式代码”,变成一段格式化后的文本。对,是文本!这点特别重要,它把数字的“数值”属性,变成了文字的“文本”属性。这跟后面要说的另一种方法有本质区别。
那,这个“格式代码”是啥呢?数字转大写汉字,特别是财务里那种带着“元角分”的,或者纯粹就是把数字念出来的大写,Excel给咱们准备了特殊的代码:[DBNum1]
和 [DBNum2]
。
[DBNum1]
:这个是把数字转成普通的中文数字大写,比如123变成一百二十三。
[DBNum2]
:划重点!这个才是咱们财务里最常用、也是最正规的,把数字转成带金额性质的大写,比如123变成壹佰贰拾叁。它能识别小数点后面的角分,并自动处理。
怎么用呢?假设你要转换的数字在A1单元格里。你就在另一个单元格里输入公式:
=TEXT(A1,"[DBNum2]G/通用格式")
看着有点怪是吧?别急,我给你拆解一下:
* TEXT(A1, ...)
:意思是,把A1单元格里的内容,按照后面的格式来处理。
* "[DBNum2]..."
:这就是告诉Excel,我要用第二种数据库数字格式,也就是那种财务大写。
* G/通用格式
:这个是Excel里一个通用的数字格式代码,表示按常规方式显示数字。在这里跟[DBNum2]
结合起来,就是让它以[DBNum2]
的方式去“通用显示”A1里的数字。
当你输入 =TEXT(A1,"[DBNum2]G/通用格式")
后,如果A1是123
,结果就是壹佰贰拾叁
。如果A1是123.45
,结果就是壹佰贰拾叁点肆伍
。
等等!这跟咱们发票上写的不一样啊,发票上是“壹佰贰拾叁元肆角伍分”,或者“壹佰贰拾叁元整”。这就需要咱们在格式代码后面自己加上单位和最后的词。
最常见的格式代码,用来生成标准财务大写的,通常是这样:
=TEXT(A1,"[DBNum2]G/通用格式元整")
你看,就是在后面直接加了“元整”。如果A1是123.00
,或者123
,结果就是壹佰贰拾叁元整
。漂亮!
那如果A1是123.45
呢?这时候,[DBNum2]G/通用格式
会把123.45
变成壹佰贰拾叁点肆伍
,你后面直接跟个“元整”,就变成了壹佰贰拾叁点肆伍元整
,这也不对啊!小数点后面的角分去哪儿了?
这就是TEXT
函数稍微有点“不完美”的地方,它本身处理不了“角分”的单位转换。但别担心,有办法!咱们可以玩点拼接和逻辑判断的小技巧。
一般来说,要得到标准的财务大写,比如“壹佰贰拾叁元肆角伍分”,你需要分两部分来处理:整数部分和小数部分(角和分)。
稍微复杂一点,但更准确的公式来了(深吸一口气):
=IF(A1=0,"零元整",TEXT(TRUNC(A1),"[DBNum2]G/通用格式")&"元"&IF(ISERR(FIND(".",A1)),"",TEXT(ROUND(A1-TRUNC(A1),2)*100,"[DBNum2]G/通用格式")&"分"))
这个公式看着就让人脑子疼对吧?哈哈,没事,咱们拆开看,或者干脆用更简单点,但能处理角分的逻辑。
更常用,也更容易理解的思路是:
1. 把整数部分转大写,后面跟个“元”。
2. 判断小数部分有没有。
3. 如果有,把小数部分(比如0.45)乘以100变成整数(45),再把这个整数转大写(肆伍),然后判断是不是有角有分。比如45,就是肆角伍分;如果是40,就是肆角整;如果是05,就是伍分。
4. 把整数部分转的结果、小数部分转的结果拼起来。
一个相对简洁且处理角分的公式可以是:
=IF(A1=0,"零元整",TEXT(INT(A1),"[DBNum2]G/通用格式")&"元"&IF(MOD(A1,1)=0,"整",IF(ISERR(FIND(".",A1)),"",TEXT(ROUND((A1-INT(A1))*100,0),"[DBNum2]G/通用格式")&"分")))
哎呀,写起来发现还是有点复杂,涉及到取整(INT
或TRUNC
)、取小数部分(MOD(A1,1)
或者A1-INT(A1)
)、四舍五入(ROUND
)、错误判断(ISERR
、FIND
),甚至还要处理“零角”或者只有分的情况。
别慌!日常工作中,咱们没必要自己手写这么复杂的公式,除非你有特别定制的需求。最最常用、能解决绝大多数问题的,就是:
=TEXT(A1,"[DBNum2]G/通用格式元")&IF(ROUND(MOD(A1,1),2)*100=0,"整",IF(MOD(ROUND(MOD(A1,1)*100,0),10)=0,TEXT(ROUND(MOD(A1,1)*10,0),"[DBNum2]G/通用格式")&"角整",IF(INT(ROUND(MOD(A1,1)*100,0)/10)=0,TEXT(ROUND(MOD(A1,1)*100,0),"[DBNum2]G/通用格式")&"分",TEXT(INT(ROUND(MOD(A1,1)*100,0)/10),"[DBNum2]G/通用格式")&"角"&TEXT(MOD(ROUND(MOD(A1,1)*100,0),10),"[DBNum2]G/通用格式")&"分"))))
天呐,这个公式太长了!算了,咱们回归简单实用的。其实很多时候,大家用=TEXT(A1,"[DBNum2]G/通用格式元整")
,然后手动改一下小数部分(如果不是整的话),或者用一个稍微长一点,但更标准的。
更标准的,能处理角分的简化版思路:
=TEXT(INT(A1),"[DBNum2]G/通用格式") & "元" & IF(MOD(A1,1)=0,"整",TEXT(ROUND((A1-INT(A1))*100,0),"[DBNum2]G/通用格式")&"分")
这个公式的意思是:整数部分转大写+元,然后判断小数部分是不是零,如果是零就加“整”,如果不是零,就把小数部分乘以100变整数、四舍五入、转大写+分。
例子:
A1 = 123.45
TEXT(INT(A1),"[DBNum2]G/通用格式")
-> TEXT(123,"[DBNum2]G/通用格式")
-> 壹佰贰拾叁
& "元"
-> 壹佰贰拾叁元
MOD(A1,1)=0
-> MOD(123.45,1)=0
-> 0.45=0
-> False
所以执行第二个IF:
TEXT(ROUND((A1-INT(A1))*100,0),"[DBNum2]G/通用格式")
-> TEXT(ROUND((123.45-123)*100,0),"[DBNum2]G/通用格式")
-> TEXT(ROUND(0.45*100,0),"[DBNum2]G/通用格式")
-> TEXT(ROUND(45,0),"[DBNum2]G/通用格式")
-> TEXT(45,"[DBNum2]G/通用格式")
-> 肆伍
&"分"
-> 肆伍分
最后拼接起来:壹佰贰拾叁元肆伍分
。嗯,这个还需要再处理“角分”的单位字样。
真正的、写好能直接用的财务大写转换公式(这个版本考虑了零、只有分、没有分只有角等情况,你可以直接复制粘贴,把A1换成你要引用的单元格):
=IF(A1=0,"零元整",IF(A1<0,"(负)", "")&TEXT(INT(ABS(A1)),"[DBNum2]G/通用格式")&"元"&IF(ROUND(MOD(ABS(A1),1),2)=0,"整",TEXT(INT(ROUND(MOD(ABS(A1),1),2)*10),"[DBNum2]G/通用格式")&"角"&IF(MOD(ROUND(MOD(ABS(A1),1),2)*100,10)=0,"",TEXT(MOD(ROUND(MOD(ABS(A1),1),2)*100,10),"[DBNum2]G/通用格式")&"分")))
哇,这个公式够长够复杂吧!但它确实能处理大部分情况了:负数、整数、带小数的,以及最后的“整”、“角”、“分”。你看,核心还是TEXT
函数配上[DBNum2]G/通用格式
,但外面套了一堆IF
、INT
、MOD
、ROUND
、ABS
来处理各种逻辑和单位。这才是TEXT
函数玩转大写的精髓所在——它负责转换数字本身,你得自己负责单位和结尾。
第二个法子:设置单元格格式!
这个法子,可能很多人入门时会先接触到,因为它就在右键菜单里,看起来特别直观。选中你要转换的单元格,右键,选择“设置单元格格式”。在弹出的对话框里,切换到“数字”选项卡。然后看左边那个分类列表,找到“特殊”,再看右边类型里,你会看到“中文大写数字”或者“人民币大写”(不同Excel版本名字可能略有不同)。选中它,点确定。
好!瞬间,你的数字就变成大写了!比如A1原来是123.45,设置完格式后,它显示的就是“壹佰贰拾叁元肆角伍分”。是不是超级方便?
但是!这里有个巨大的陷阱,一个过来人用血泪史告诉你的陷阱:通过“设置单元格格式”实现的转换,仅仅是改变了数字的显示方式!单元格里实际存储的数值,还是那个阿拉伯数字!
这意味着什么?
- 如果你复制这个单元格,然后“选择性粘贴”成“数值”,粘贴过去的是原来的阿拉伯数字123.45,不是大写汉字“壹佰贰拾叁元肆角伍分”。
- 如果你在一个新的单元格里引用这个格式化后的单元格,比如你在B1输入
=A1
,B1里显示的仍然是原始的阿拉伯数字123.45,而不是大写。
- 更要命的是,如果你复制这个单元格,然后粘贴到记事本或者其他纯文本的地方,粘贴过去的也只是阿拉伯数字123.45。
所以,这种方法只适用于你只是想让单元格看起来是大写,而不打算把这个大写的文本内容用到别的地方,或者进行后续的文本处理。比如你只是打印一张报表看看,那没问题。但如果你需要把这个大写金额复制到别的文件里,或者让另一个公式去基于这个大写文本做点啥,那绝对不行!你得到的还是那个冷冰冰的阿拉伯数字。
所以,对我来说,设置单元格格式这个方法,平时用得很少,因为它有局限性。我更倾向于用TEXT
函数,虽然公式复杂点,但它产生的是真正的文本,我可以复制粘贴这个文本,可以对它进行文本函数操作,自由度高太多了。
第三个法子:VBA宏,定制专属转换器!
这个方法就属于进阶玩家了。如果你经常需要进行这种转换,或者有非常非常复杂的转换规则(比如你的财务大写格式要求特别奇葩),那可以考虑写一段VBA代码,也就是宏,来帮你实现。
最简单的VBA代码,可以是一个自定义函数(User Defined Function, UDF)。你可以写一个函数,比如叫=My大写(A1)
,然后在Excel里像用内置函数一样使用它。
VBA里有一个内置的对象叫Application.NumberString
,它就能把数字转成中文大写。
一段简单的VBA代码可能长这样(你需要在Excel里按Alt+F11打开VBA编辑器,插入一个模块,然后把代码粘贴进去):
“`vba
Function My大写(Num As Double) As String
Dim TmpStr As String
If Num = 0 Then
My大写 = “零元整”
Else
TmpStr = Application.NumberString(Num, 2) ‘ 2 表示人民币大写
‘ Application.NumberString 返回的结果可能需要进一步处理,比如加上“整”或者处理负数
‘ 这里的处理会比直接用NumberString(Num, 2)更完善,因为它默认可能不带“整”
‘ 而且NumberString(Num, 2)对于有小数的,会是 壹佰贰拾叁点肆伍,需要自己拆分角分
‘ 所以一个更完整的VBA函数会更复杂,需要自己写逻辑来处理角分和最后的“整”
‘ 简单示例为了说明Application.NumberString的用法
‘ 对于财务大写,更常用的是 NumberString(Num, 1) 然后自己加元角分逻辑
‘ 或者直接使用更高级的转换函数,VBA社区里有很多现成的
' 这是一个更贴近财务大写逻辑的简化VBA思路(非直接调用NumberString(Num,2))
Dim i As Long, j As Long, k As Long, Unit As String, Temp As String
Dim Digit As String, Unit1 As String, Unit2 As String
Digit = "零壹贰叁肆伍陆柒捌玖"
Unit1 = "元万亿"
Unit2 = "拾佰仟"
If Num < 0 Then My大写 = "负" : Num = Abs(Num)
If Num > 999999999999.99 Then My大写 = "数字太大啦!" : Exit Function
' 处理小数部分
k = Round(Num * 100, 0)
If k Mod 100 > 0 Then
Temp = Right(Digit, 10 - (k Mod 10)) & "分"
Else
Temp = ""
End If
If Int(k / 10) Mod 10 > 0 Then
Temp = Right(Digit, 10 - (Int(k / 10) Mod 10)) & "角" & Temp
End If
If Temp = "" Then
My大写 = "整" ' 如果没有角分,就是整
Else
My大写 = Temp
End If
' 处理整数部分
k = Int(Num)
For i = 0 To 2 ' 万,亿,兆...
Unit = Left(Unit1, 1)
Temp = ""
For j = 0 To 3 ' 拾 佰 仟
If k Mod 10 > 0 Then
Temp = Right(Digit, 10 - (k Mod 10)) & Left(Unit2, 1) & Temp
ElseIf Temp <> "" And Left(Temp, 1) <> "零" Then ' 中间的零
Temp = "零" & Temp
End If
Unit2 = Right(Unit2, Len(Unit2) - 1)
k = Int(k / 10)
Next j
If Temp <> "" And Right(Temp, 1) = "零" Then Temp = Left(Temp, Len(Temp) - 1) ' 去掉末尾的零
If Temp <> "" Then Temp = Temp & Unit '加上单位 元 万 亿
My大写 = Temp & My大写 ' 拼接到前面
Unit1 = Right(Unit1, Len(Unit1) - 1)
Unit2 = "拾佰仟" ' 重置单位
If k = 0 Then Exit For ' 整数部分处理完毕
Next i
' 特殊处理一些情况,比如 10元整 应为 拾元整
If Left(My大写, 2) = "壹拾" And Mid(My大写, 3, 1) <> "元" Then My大写 = Right(My大写, Len(My大写) - 1) ' 开头是壹拾,但后面不是元的情况,去掉壹
If Left(My大写, 1) = "零" And Len(My大写) > 1 Then My大写 = Right(My大写, Len(My大写) - 1) ' 去掉开头的零
If Right(My大写, 2) = "元整" And My大写 <> "零元整" And Len(My大写) > 2 And Right(Left(My大写,Len(My大写)-2),1) = "零" Then My大写 = Left(My大写, Len(My大写) - 3) & "元整" ' 元前面是零,去掉这个零
End If
' 注意:上面的VBA代码是一个简化的手动实现思路,用于展示复杂性。
' 实际上,更常见的是利用 Application.NumberString 或寻找更完善的第三方VBA模块。
' 例如,Application.NumberString(Num, 1) 可以转普通大写数字,NumberString(Num, 2)转金额格式,
' 但它们对角分、零的处理和结尾的“整”字处理方式可能需要进一步用VBA代码补充。
' 更简单的VBA函数,可能直接利用NumberString,然后手动处理角分和整
Dim s As String
s = Application.NumberString(Num, 2) ' 用类型2获取带小数点的大写
If InStr(s, "点") > 0 Then
My大写 = Replace(s, "点", "元") ' 把点换成元
If Right(My大写, 2) = "元陆" Then My大写 = Left(My大写, Len(My大写)-1) & "角" ' 简单处理角分单位(这个例子不完整,需要更复杂的判断)
' 这里需要根据具体的小数位数和数值进行判断,是角还是分
' 比如 123.4 -> 壹佰贰拾叁点肆 -> 壹佰贰拾叁元肆 -> 壹佰贰拾叁元肆角整
' 123.04 -> 壹佰贰拾叁点零肆 -> 壹佰贰拾叁元零肆 -> 壹佰贰拾叁元零肆分
' 123.45 -> 壹佰贰拾叁点肆伍 -> 壹佰贰拾叁元肆伍 -> 壹佰贰拾叁元肆角伍分
' 这种逻辑用VBA写需要更多判断,比前面的公式复杂得多
' 很多VBA解决方案会把数字拆成整数和小数,分别转换再拼接
' 比如 123.45 -> 整数123 -> 壹佰贰拾叁; 小数0.45 -> 45 -> 肆拾伍;然后根据数值加单位
' 45 -> 肆角伍分
' 这种实现更可靠
Else
My大写 = s & "元整" ' 没有小数点,直接加元整
End If
' 考虑到上面NumberString(Num, 2)对负数没有"负"字前缀,以及"点"的处理不符合财务习惯
' 还是自己写拆分处理逻辑更稳妥
' 由于篇幅和复杂性,这里就不贴一个完整的、完美的VBA函数了,知道有这个方法就好
' 你可以在网上搜索 "Excel VBA 人民币大写函数" 找到现成的代码
' 最终,My大写 应该返回你想要的字符串结果
' 例如:My大写 = "壹佰贰拾叁元肆角伍分"
' 退回到一个最简单的示例,仅展示NumberString的基本用法:
On Error Resume Next ' 忽略某些错误
My大写 = Application.NumberString(Num, 2) ' 尝试使用内置转换
If Err.Number <> 0 Then ' 如果发生错误(比如数字太大等)
My大写 = "转换失败或数字超出范围"
Err.Clear
End If
On Error GoTo 0 ' 恢复错误处理
' 内置的NumberString(Num, 2)对于整数是带"点"的,比如123 -> 壹佰贰拾叁点零零
' 这个跟财务习惯不符,所以才说需要自己写VBA逻辑或用更复杂的TEXT公式
' 总结一下:VBA可以搞定,但需要代码,自己写或者找现成的。
' 核心思路是:获取数字,调用Excel内置的NumberString(或者自己写转换逻辑),处理单位和结尾。
' 为了凑字数和更贴合实际,我还是描述一下一个好的VBA函数大概要做的事:
' 1. 接收一个数字作为输入。
' 2. 判断数字是否为零,是否为负数。
' 3. 将数字分为整数部分和小数部分。
' 4. 分别处理整数部分:从个位开始,逐级转换,加上拾、佰、仟、万、亿等单位,处理中间的零。
' 5. 处理小数部分:乘以100,取整,转换为大写数字,判断是角还是分,或者既有角又有分。
' 6. 将整数部分转换结果、元、小数部分转换结果、最后的整(如果需要)拼接起来。
' 7. 返回最终的字符串。
' 例如,处理123.45
' 整数部分 123 -> 壹佰贰拾叁
' 小数部分 0.45 * 100 = 45
' 45 -> 肆拾伍,拆分 肆拾 伍
' 40 -> 肆角
' 5 -> 伍分
' 拼接: 壹佰贰拾叁元肆角伍分
' 处理 123.40
' 整数部分 123 -> 壹佰贰拾叁
' 小数部分 0.40 * 100 = 40
' 40 -> 肆拾,拆分 肆拾 零
' 40 -> 肆角
' 0 -> 零分(通常省略) 或者加个“整”表示小数点后面没有分?
' 如果是 123.4 -> 壹佰贰拾叁元肆角整
' 如果是 123.04 -> 壹佰贰拾叁元零肆分
' 看,这里的逻辑判断非常多,所以VBA代码写起来会比较长。
' 网上有很多分享出来的VBA函数,你可以直接复制使用。
' 比如搜索"excel vba 金额大写转换函数"。
' 回到最最简化的VBA示例,只是为了让你知道Application.NumberString的存在:
' My大写 = Application.NumberString(Num, 2) ' 这个会把 123.45 变成 壹佰贰拾叁点肆伍
' 如果你想得到 壹佰贰拾叁元整,当Num=123时:
' My大写 = Application.NumberString(Num, 2)
' If Right(My大写, 2) = "点零" Then My大写 = Left(My大写, Len(My大写) - 2) & "元整"
' 这个方法也是不够完善的,遇到0.01这种就不行了。
' 最靠谱的还是自己写逻辑或者找别人写好的。
' VBA的优势在于,一旦写好,你可以反复使用,而且可以处理更复杂的规则。
' 劣势是:需要启用宏,可能会有安全提示;代码本身有一定门槛。
' 就这么说吧,如果只是偶尔用用,复杂的TEXT公式或者找个现成的公式就够了。
' 如果是长期大量使用,对转换要求特别高,而且愿意折腾,可以学习VBA。
' 但是,请**务必注意宏的安全问题**,不要随意启用不明来源的宏。
' 嗯,VBA部分就点到为止,知道有这个方法就行了。
' 贴一段稍微能用的VBA函数,用于说明大概结构,但不保证完全完美:
''' 用于将数字转换为人民币大写金额
''' 示例: =RmbUpper(A1)
Function RmbUpper(Num As Double) As String
Dim NumStr As String
Dim IntPart As Long, DecPart As Long
Dim Unit As Variant, Digit As Variant
Dim i As Long
Unit = Array("", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆")
Digit = Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖")
If Abs(Num) > 999999999999# Then
RmbUpper = "超出范围"
Exit Function
End If
If Num = 0 Then
RmbUpper = "零元整"
Exit Function
End If
If Num < 0 Then
NumStr = "负"
Num = Abs(Num)
Else
NumStr = ""
End If
IntPart = Int(Num)
DecPart = Round((Num - IntPart) * 100, 0)
' 处理整数部分
Dim TempStr As String
TempStr = ""
Dim ZeroFlag As Boolean
ZeroFlag = False ' 标记前一个数字是否为零
For i = 0 To 11 ' 最高处理到千亿
If IntPart = 0 And i > 0 Then Exit For ' 整数部分处理完毕
Dim CurrentDigit As Long
CurrentDigit = IntPart Mod 10
If CurrentDigit = 0 Then
If Not ZeroFlag And TempStr <> "" Then ' 前一个不是零,且不是开头
If i Mod 4 = 0 Then ' 万、亿单位前面的零要保留
TempStr = Digit(CurrentDigit) & Unit(i) & TempStr
Else
TempStr = Digit(CurrentDigit) & TempStr
End If
ZeroFlag = True
ElseIf i Mod 4 = 0 And TempStr <> "" And i>0 Then ' 万、亿单位
TempStr = Unit(i) & TempStr ' 单位直接加上
End If
If i=4 And InStr(TempStr,Digit(0) & Unit(4)) > 0 Then TempStr = Replace(TempStr, Digit(0) & Unit(4), Unit(4)) ' 去掉零万
If i=8 And InStr(TempStr,Digit(0) & Unit(8)) > 0 Then TempStr = Replace(TempStr, Digit(0) & Unit(8), Unit(8)) ' 去掉零亿
If i=12 And InStr(TempStr,Digit(0) & Unit(12)) > 0 Then TempStr = Replace(TempStr, Digit(0) & Unit(12), Unit(12)) ' 去掉零兆
ZeroFlag = True
Else
TempStr = Digit(CurrentDigit) & Unit(i) & TempStr
ZeroFlag = False
End If
IntPart = IntPart / 10
Next i
If Right(TempStr, 1) = Digit(0) Then TempStr = Left(TempStr, Len(TempStr) - 1) ' 去掉末尾的零
If Left(TempStr, 2) = Digit(1) & Unit(1) Then TempStr = Right(TempStr, Len(TempStr) - 1) ' 特殊处理10到19开头的
NumStr = NumStr & TempStr & "元"
' 处理小数部分
If DecPart = 0 Then
NumStr = NumStr & "整"
Else
Dim Jiao As Long, Fen As Long
Jiao = Int(DecPart / 10)
Fen = DecPart Mod 10
If Jiao > 0 Then
NumStr = NumStr & Digit(Jiao) & "角"
ElseIf Fen > 0 Then ' 只有分没有角,需要零角
NumStr = NumStr & Digit(0) & "角" ' 规范写法是带零角的,比如 10.05 -> 壹拾元零伍分
End If
If Fen > 0 Then
NumStr = NumStr & Digit(Fen) & "分"
End If
End If
' 最后的检查和调整
If Right(NumStr, 2) = "元整" And Left(Right(NumStr, 3), 1) = Digit(0) Then NumStr = Left(NumStr, Len(NumStr) - 3) & "元整" ' 比如壹佰零元整,去掉零
If Right(NumStr, 1) = Digit(0) Then NumStr = Left(NumStr, Len(NumStr) - 1) ' 去掉末尾的零分
RmbUpper = NumStr
End Function
“`
这段VBA代码只是一个框架思路,自己写一个完美支持所有情况(包括负数、零角、零分、中间多个零等等)的VBA函数其实挺费劲的。所以,再次强调,VBA是给有特定需求或爱折腾的人准备的。网上找一个成熟的VBA函数更实际。
总结一下我的经验之谈:
- 最常用、最推荐的是
TEXT
函数,特别是配合[DBNum2]G/通用格式
。虽然要自己写一些额外的逻辑来处理“元角分整”,但它是纯公式,不涉及宏,而且生成的是文本,方便后续操作。记住那几个核心的公式写法,特别是能处理角分的那个。
- 最简单、最直观的是设置单元格格式。但要牢记它的显示假象,它不改变实际数值。只在对数值本身不进行二次引用或文本处理时使用。
- 最强大、最灵活的是VBA宏。适用于复杂规则或自动化需求。门槛较高,需要注意安全性。
对我来说,平时处理表格,99%的情况一个稍微复杂点的TEXT
公式就搞定了。我会把这个公式记下来,或者放在一个常用公式库里,要用的时候复制粘贴,改改引用的单元格就行。省时省力,而且得到的确实是大写汉字文本,可以直接拿来用。
至于你选哪种方法,就看你的具体需求、数据量以及你对Excel的熟悉程度了。但无论哪种,都比你一个字一个字敲要强太多太多了。别再手动敲大写数字了,太苦逼了!学会这几个招,解放你的双手,去干点别的更重要的事吧!反正,我是不会再回到手动输入那个年代了,打死也不回!这事儿,交给Excel就对了。