对于做财务的同学应该经常会遇到要求把金额用大写的方式展示吧,如下图这样。
今天小编就和大家分享如何把数字金额转换为大写金额。
1、单元格格式Excel本身自带了中文大写数字格式,但是实际使用不仅容易,下面我们一起来看看吧。
不知道大家还记不记得在单元格格式中数字类别类别下有个特殊格式,这个格式下就有中文大写数字格式。
我们直接用开头的数据来试试,看看效果,也好做个对比。
看到结果应该知道小编为什么说不尽如意了吧。这种方式有几个问题:①没有元角分单位;②有小数点;③没有包含整字。
2、NUMBERSTRING函数NUMBERSTRING函数是Excel中的一个隐藏函数,就是在函数列表里查不到的,我们也就不去研究Excel出于什么原因没有公开这个函数了。
函数格式:「=NUMBERSTRING(VALUE,TYPE)」;
函数作用;处理小写数字转大写数字;
说明:VALUE表示要转换的数字;TYPE有三种类型可选为「1、2、3」,每种类型对应一种展示大写方式。
注意点:这个函数只支持正整数,不支持小数。
我们来看看三种类型的效果对比:
从结果上来看类型参数为2的是我们需要的,并且我们发现也是没有单位没有整字的,而且函数不能处理小数。我们可以看下效果:
而且我们还发现如果直接使用小数,结果会被四舍五入。
不过这些都不是问题,因为是函数所有操作空间就很多,我们可以进行加工得到我们想要的。
我们先来解决四舍五入的问题。今天我们来学习一个新函数TRUNC。这个函数很简单,主要作用是把数字的小数部分截掉,保留整数部分,语法:TRUNC(数字)。
然后我们来解决小数部分。既然NUMBERSTRING函数只能处理整数,那么如果我们把小数部分转为整数不就行了吗?而且我们只需要处理角和分也就是两个字。
小编第一个想到的是截取函数,然后定位到角分,方案是可以的,就是公式写出来很长很繁琐。
如下图,如一个两位小数,我们首先把这个两位小数乘以10,然后对结果截取整数部分得到金额1,那么十分位就变成个位了;然后对这个两位小数直接截取整数部分再乘以10得到金额2,并且金额2的个位一定是0,而且金额1和金额2位数也一定相等,只要把金额1减金额2就可得到角了。
同理「=TRUNC(A5*100)-TRUNC(A5*10)*10」可得分。
现在四舍五入,角,分问题都解决了,我们把公式拼接一下就可以了。最终得到公式:「=NUMBERSTRING(TRUNC(B5),2)&"元"&NUMBERSTRING(TRUNC(B5*10)-TRUNC(B5)*10,2)&"角"&NUMBERSTRING(TRUNC(B5*100)-TRUNC(B5*10)*10,2)&"分"」,我们看看效果:
看到结果还是不是很理想,还是有很多问题,整数结尾应该是"元整",角为有值分位没值的结尾应该是"角整",分位有值的且角位为0的应该是"零玖分"这样,后面不应该有"零分"。当然这些问题也可通过IF函数在处理,但是这就会导致公式很长。
小编发现主要问题就是在小数部分的处理上,因此我们可以选择把小数部分复杂的处理交给VBA处理,代码如下:
'获取小数部分大写金额
Function GetDecimal(cell)
Dim arrResult() As String
'截取小数点
arrResult = VBA.Split(cell, ".")
Dim iArr As Integer
iArr = UBound(arrResult)
'没有小数部分直接返回"元整"
If iArr = 0 Then
GetDecimal = GetDecimal & "元整"
'有小数部分且是格式正确
ElseIf iArr = 1 Then
Dim strSmall As String
strSmall = arrResult(1)
Dim iSmall As Integer
Dim strJiao, strFen As String
'获取小数位数
iSmall = Len(strSmall)
'一位小数则为分
If iSmall = 1 Then
strJiao = getUpperCase(strSmall)
'两位小数则为分角
ElseIf iSmall = 2 Then
strJiao = getUpperCase(Left(strSmall, 1))
strFen = getUpperCase(Right(strSmall, 1))
'大于两位小数只取前两位分角
Else
strJiao = getUpperCase(Left(strSmall, 1))
strFen = getUpperCase(Mid(strSmall, 2, 1))
End If
'如 1.00 为 壹元整
If (strFen = "" Or strFen = "零") And strJiao = "零" Then
GetDecimal = GetDecimal & "元整"
'如 1.10 为 壹元壹角整
ElseIf (strFen = "" Or strFen = "零") And strJiao <> "零" Then
GetDecimal = GetDecimal & "元" & strJiao & "角整"
'如 1.01 为 壹元零壹分
ElseIf strFen <> "" And strFen <> "零" And strJiao = "零" Then
GetDecimal = GetDecimal & "元" & "零" & strFen & "分"
'如 1.11 为 壹元壹角壹分
ElseIf strFen <> "" And strFen <> "零" And strJiao <> "零" Then
GetDecimal = GetDecimal & "元" & strJiao & "角" & strFen & "分"
End If
'有小数部分但是格式不正确
Else
GetDecimal = GetDecimal & "数据格式有问题"
End If
End Function
'数字转大写
Private Function getUpperCase(str) As String
Dim strWord As String
Select Case str
Case "0": strWord = "零"
Case "1": strWord = "壹"
Case "2": strWord = "贰"
Case "3": strWord = "叁"
Case "4": strWord = "肆"
Case "5": strWord = "伍"
Case "6": strWord = "陆"
Case "7": strWord = "柒"
Case "8": strWord = "捌"
Case "9": strWord = "玖"
Case Else: strWord = str
End Select
getUpperCase = strWord
End Function
代码中也有解释,小编注解应该还算清楚,不清楚的可以和小编一起探讨。
最后把整数部分和小数部分结合起来,使用公式:「=NUMBERSTRING(TRUNC(B5),2)&GetDecimal(B5)」即可得到最终效果。
,