對于做财務的同學應該經常會遇到要求把金額用大寫的方式展示吧,如下圖這樣。
今天小編就和大家分享如何把數字金額轉換為大寫金額。
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)」即可得到最終效果。
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!