[GPECODE=vba]
'Hàm này mình mới tham khảo và viết lại, các bạn coi thử nhé :
Option Explicit
Option Base 0
'Author:
thaipv@live.com
'Date: 30/11/2014
'Reference:
http://support.microsoft.com/kb/95640
'More:
http://en.wikipedia.org/wiki/Names_of_large_numbers
Function DOCSOANH(ByVal SOTIEN, Optional VIETHOA As Boolean = True) As String
Dim TENCOSO, TENTEEN, TENCHUC, TENHANG(13), READ1__$, READ_23$, READ123$
Dim NUMBER1 As Byte, NUMBER2 As Byte, NUMBER3 As Byte, X As Byte
TENCOSO = Array("", " one", " two", " three", " four", " five", " six", " seven", " eight", " nine")
TENTEEN = Array(" ten", " elevent", " twelve", " thirteen", " fourteen", " fifteen", " sixteen", " seventeen", " eighteen", " nineteen")
TENCHUC = Array("", "", " twenty", " thirty", " forty", " fifty", " sixty", " seventy", " eighty", " ninety")
TENHANG(1) = " trillion,": TENHANG(4) = " billion,"
TENHANG(7) = " million,": TENHANG(10) = " thousand,"
If Trim$(SOTIEN) = "" Then
DOCSOANH = ""
ElseIf Not IsNumeric(SOTIEN) Then
DOCSOANH = "(ò_ó) Hmm, It is too embarrassing! XA can not read this number: " & "'" & SOTIEN & "'"
ElseIf SOTIEN < -10 ^ 15 Then
DOCSOANH = "(ò_ó) Hmm, It is too embarrassing! This number is too small to read."
ElseIf SOTIEN > 10 ^ 15 Then
DOCSOANH = "(ò_ó) Hmm, It is too embarrassing! This number is too large to read."
ElseIf Round(Abs(SOTIEN), 0) = 0 Then
DOCSOANH = IIf(VIETHOA = True, "Zero", "zero")
Else
'// Doc dau am/duong cua so tien va xy ly so tien truoc khi doc//
DOCSOANH = IIf(Round(SOTIEN, 0) < 0, "minus", "")
SOTIEN = Round(Abs(SOTIEN), 0): SOTIEN = "000000000000000" & SOTIEN
SOTIEN = Replace$(SOTIEN, ",", ""): SOTIEN = Right$(SOTIEN, 15)
'// Bat dau doc so //
For X = 1 To 13 Step 3
NUMBER1 = Mid$(SOTIEN, X, 1)
NUMBER2 = Mid$(SOTIEN, X + 1, 1)
NUMBER3 = Mid$(SOTIEN, X + 2, 1)
READ1__ = IIf(NUMBER1 = 0, "", TENCOSO(NUMBER1) & " hundread" & IIf(NUMBER2 = 0 And NUMBER3 = 0, "", " and"))
Select Case NUMBER2
Case 0: READ_23 = TENCOSO(NUMBER3)
Case 1: READ_23 = TENTEEN(NUMBER3)
Case Else: READ_23 = TENCHUC(NUMBER2) & TENCOSO(NUMBER3)
End Select
READ123 = READ1__ & READ_23
DOCSOANH = Trim$(DOCSOANH & IIf(Len(READ123) = 0, "", READ123 & TENHANG(X)))
Next X
'// Xu ly (nhung) dau phay (",") du thua, thay "one" = "a" o dau cau va VIET HOA chu dau tien //
DOCSOANH = IIf(Right$(DOCSOANH, 1) = ",", Left$(DOCSOANH, Len(DOCSOANH) - 1), DOCSOANH)
DOCSOANH = Replace$(DOCSOANH, "minus one", "minus a")
DOCSOANH = IIf(Left$(DOCSOANH, 3) = "one", "a" & Mid$(DOCSOANH, 4), DOCSOANH)
DOCSOANH = IIf(VIETHOA = True, UCase$(Left$(DOCSOANH, 1)) & Mid$(DOCSOANH, 2), DOCSOANH)
End If
End Function
[/GPECODE]