[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]