Hàm chuyển số thành chữ

Liên hệ QC

handung107

Thành viên gắn bó
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,630
Được thích
17,436
Nghề nghiệp
Bác sĩ
Đã có rất nhiều hàm chuyển số thành chữ trên các diễn đàn, nhưng hôm nay, tôi xin giới thiệu với các bạn hàm chuyển số thành chữ hoàn chỉnh nhất của Paulsteigel trên diễn đàn Webketoan
Mã:
Option Explicit
'
Function CountValue(ByVal Target As Range, ByVal Criteria As Long, ByVal isGreater As Boolean) As Variant
Dim i As Long, j As Long
Dim k As Long
With Target
For i = 1 To .Rows.Count
For j = 1 To .Columns.Count
If Not IsEmpty(.Cells(i, j)) Then
If isGreater Then
If Val(.Cells(i, j)) >= Criteria Then k = k + 1
Else
If Val(.Cells(i, j)) <= Criteria Then k = k + 1
End If
End If
Next
Next
End With
CountValue = k + 1
End Function
 
 
Public Function NumtoWordExl(ByVal Target As Range, Optional IsToUnicode As Boolean = False) As String
Dim iStr As String, i As Long
Dim retVal As String
If isBigRange(Target) Then
NumtoWordExl = ""
GoTo tExitFunction
End If
' this is a trick to keep excel doesnt set the value to somewhat like 1.22e12+19
iStr = Format(Target.Value, "#000")
retVal = NumtoWord(iStr)
' Now we have to convert the result to unicode if neccessary
If retVal <> "" And IsToUnicode Then retVal = ToUnicode(retVal)
NumtoWordExl = retVal
tExitFunction:
End Function
 
Function NumtoWord(InTxt As String) As String
' Concert any length number to word
' The mentor is: break a number to 9 characters length and do the conversion
' for the rest .... increment the billion counter
' the main function for the conversion is at anywhere in the net and I took this one from anonimity
' My onwed function work similarly - but i failed in searching for it - it dumbed...
' so take this one in replacement
Dim i As Integer, j As Integer
Dim OutString As String
Dim ProcArr() As String
ReDim ProcArr(10)
While Len(InTxt) > 9
' break the input string to group of 9 digit
ProcArr(i) = Right(InTxt, 9)
InTxt = Left(InTxt, Len(InTxt) - 9)
i = i + 1
Wend
ProcArr(i) = InTxt
ReDim Preserve ProcArr(i)
' Now convert the group to value
i = UBound(ProcArr)
While i > 0
' add with "w" as billion word...
OutString = OutString & IIf(Val(ProcArr(i)) > 0, ReadBilGroup(ProcArr(i)) & String(i, "w"), "")
i = i - 1
Wend
OutString = Replace(OutString, "w", " tû") & ReadBilGroup(ProcArr(0))
NumtoWord = Trim(OutString)
End Function
 
Private Function ReadBilGroup(s As String) As String
Dim l As Integer, i As Integer, j As Integer
Dim dk As Boolean
Dim A(11) As Integer
Dim C As String
 
' Variant array to quick convert the number to word
Dim iArr As Variant
iArr = Array("kh«ng", "mét", "hai", "ba", "bèn", "n¨m", "s¸u", "b¶y", "t¸m", "chÝn")
 
C = ""
l = Len(s)
 
' break number to single string
For i = 1 To l
A(i) = CInt(Mid(s, i, 1))
Next i
 
For i = 1 To l '
 
Select Case A(i)
Case 1:
If (i > 1 And (l - i + 1) Mod 3 = 1 And A(i - 1) > 1) Then
C = C & " mèt"
ElseIf ((l - i + 1) Mod 3 <> 2 And A(i) = 1) Then
C = C & " mét"
End If
Case 5:
If (i > 0 And (l - i + 1) Mod 3 = 1 And A(i - 1) <> 0) Then
C = C & " l¨m"
Else
C = C & " n¨m"
End If
Case 0:
If (l - i + 1) Mod 3 = 0 And (A(i + 1) <> 0 Or A(i + 2) <> 0) Then C = C & " kh«ng"
If (l - i + 1) Mod 3 = 2 And A(i + 1) <> 0 Then C = C & " linh"
Case Else
If i = l And A(i) = 4 Then
C = C & " t&shy;"
Else
C = C & " " & iArr(A(i))
End If
End Select
 
If ((l - i + 1) Mod 3 = 2 And A(i) <> 0 And A(i) <> 1) Then
C = C & " m&shy;¬i"
ElseIf ((l - i + 1) Mod 3 = 2 And A(i) <> 0) Then
C = C & " m&shy;êi"
End If
 
If ((l - i + 1) Mod 3 = 0 And (A(i + 1) <> 0 Or A(i + 2) <> 0)) Then
C = C & " tr¨m"
ElseIf (l - i + 1) Mod 3 = 0 And A(i) <> 0 Then
C = C & " tr¨m"
End If
 
If ((l - i + 1) = 4) Then C = C & " ngµn"
If ((l - i + 1) = 7) Then C = C & " triÖu"
 
If ((l - i + 1) Mod 3 = 0 And A(i) = 0 And A(i + 1) = 0 And A(i + 2) = 0) Then i = i + 2
 
If ((l - i + 1) Mod 3 = 1) Then
dk = True
For j = i To l
If A(j) <> 0 Then dk = False
Next j
End If
If dk Then Exit For
Next i
ReadBilGroup = C
End Function
 
 
Private Function isBigRange(ByVal Target As Range) As Boolean
On Error GoTo ErrHandler
If Target.Rows.Count > 1 Or Target.Columns.Count > 1 Then isBigRange = True
ErrHandler:
End Function
Function ToUnicode(txtString As String, Optional isReversed As Boolean = False) As String
' This function will do the conversion of text string into unicode
Dim iStr As String, repTxt As String, mText As String
Dim i As Long, j As Long
Dim iUnicode As Variant ' array to keep unicode char set
Dim iTCVN As Variant ' array to keep TCVN char set
Dim iProcList() As String ' array to keep what to convert
 
'parse the parameter into this local variable
iStr = txtString
mText = txtString
 
iUnicode = Array(225, 224, 7843, 227, 7841, 259, 7855, 7857, 7859, 7861, 7863, 226, _
7845, 7847, 7849, 7851, 7853, 233, 232, 7867, 7869, 7865, 234, 7871, 7873, 7875, _
7877, 7879, 237, 236, 7881, 297, 7883, 243, 242, 7887, 245, 7885, 244, 7889, 7891, _
7893, 7895, 7897, 417, 7899, 7901, 7903, 7905, 7907, 250, 249, 7911, 361, 7909, _
432, 7913, 7915, 7917, 7919, 7921, 253, 7923, 7927, 7929, 7925, 273, 193, 192, 195, _
258, 194, 212, 416, 431, 272)
 
iTCVN = Array(184, 181, 182, 183, 185, 168, 190, 187, 188, 189, 198, 169, 202, 199, 200, _
201, 203, 208, 204, 206, 207, 209, 170, 213, 210, 211, 212, 214, 221, 215, 216, 220, _
222, 227, 223, 225, 226, 228, 171, 232, 229, 230, 231, 233, 172, 237, 234, 235, 236, _
238, 243, 239, 241, 242, 244, 173, 248, 245, 246, 247, 249, 253, 250, 251, 252, 254, _
174, 193, 192, 195, 161, 162, 164, 165, 166, 167)
 
' Reenlarge the array
ReDim iProcList(1, 133)
' process the vowel only and covert to asc code
For i = 1 To Len(mText)
repTxt = Mid(mText, i, 1)
If AscW(repTxt) > 122 Then
iStr = Replace(iStr, repTxt, "[" & AscW(repTxt) & "]")
mText = Replace(mText, repTxt, " ")
' write the processed list
iProcList(1, j) = "[" & AscW(repTxt) & "]"
If isReversed Then
iProcList(0, j) = GetElementNo(AscW(repTxt), iUnicode)
Else
iProcList(0, j) = GetElementNo(AscW(repTxt), iTCVN)
End If
j = j + 1
End If
Next
If j = 0 Then
ToUnicode = txtString
Exit Function
End If
ReDim Preserve iProcList(1, j - 1)
' now convert to unicode
For i = 0 To UBound(iProcList, 2)
If isReversed Then
iStr = Replace(iStr, iProcList(1, i), ChrW(iTCVN(Val(iProcList(0, i)))))
Else
iStr = Replace(iStr, iProcList(1, i), ChrW(iUnicode(Val(iProcList(0, i)))))
End If
Next
fExit:
ToUnicode = iStr
End Function
 
ui sao mình làm theo các bước bạn hướng dẫn mà không dùng được là sao?
 
Upvote 0
Xin chao!
Minh la thanh vien moi, minh da tai ham cua "man" ve de chuyen so thanh chu nhung k duoc va hien ra "?name"
ban vui long giai thich giup minh nhe!
Cam on!
 
Upvote 0
Xin chao!
Minh la thanh vien moi, minh da tai ham cua "man" ve de chuyen so thanh chu nhung k duoc va hien ra "?name"
ban vui long giai thich giup minh nhe!
Cam on!

Bạn cần viết có dấu tiếng Việt để dễ đọc, cũng là quy định của diễn đàn. Bạn cũng cần trích bài mà bạn hỏi để tiện biết bạn đang sử dụng bài của người nào mà hướng dẫn đúng cho bạn.
 
Upvote 0
cho e hỏi làm thế nào để nó chạy ẩn mà ko cần phải gõ hàm khi sử dụng ấy. Chẳng hạn mình chỉ cần gõ số 100 thì nó tự biến thành chữ luôn, k cần phải gõ đầy đủ hàm =vnd(100) ấy :), hướng dẫn e đầy đủ dc k :)
 
Upvote 0
Có một vấn lỗi mong thầy sửa dùm: khi đọc số chẵn ngàn, mười ngàn, trăm ngàn thi có thêm chữ tỷ ví dụ như đọc :50000 có kết quả là Năm mươi ngàn, tỷ đồng. Mong thầy sớm khắc phục
 
Upvote 0
Có một vấn lỗi mong thầy sửa dùm: khi đọc số chẵn ngàn, mười ngàn, trăm ngàn thi có thêm chữ tỷ ví dụ như đọc :50000 có kết quả là Năm mươi ngàn, tỷ đồng. Mong thầy sớm khắc phục

Bạn thử code này xem.
Code mudule
Mã:
Private donvi0, hangchuc, donvi1, donvi2, donvi_nhom, IsInitArrayStr As Boolean
Private Sub InitArrayStr()
    If IsInitArrayStr Then Exit Sub
    IsInitArrayStr = True
    
    donvi0 = Array("", " m" & ChrW(7897) & "t", " hai", " ba", " b" & ChrW(7889) & "n", " n" & ChrW(259) & "m", _
            " s" & ChrW(225) & "u", " b" & ChrW(7849) & "y", " t" & ChrW(225) & "m", " ch" & ChrW(237) & "n")
    hangchuc = Array("", " m" & ChrW(432) & ChrW(7901) & "i", _
                " hai m" & ChrW(432) & ChrW(417) & "i", " ba m" & ChrW(432) & ChrW(417) & "i", _
                " b" & ChrW(7889) & "n m" & ChrW(432) & ChrW(417) & "i", " n" & ChrW(259) & "m m" & ChrW(432) & ChrW(417) & "i", _
                " s" & ChrW(225) & "u m" & ChrW(432) & ChrW(417) & "i", " b" & ChrW(7849) & "y m" & ChrW(432) & ChrW(417) & "i", _
                " t" & ChrW(225) & "m m" & ChrW(432) & ChrW(417) & "i", " ch" & ChrW(237) & "n m" & ChrW(432) & ChrW(417) & "i")
    donvi1 = Array("", " m" & ChrW(7897) & "t", " hai", " ba", " b" & ChrW(7889) & "n", " l" & ChrW(259) & "m", _
                " s" & ChrW(225) & "u", " b" & ChrW(7849) & "y", " t" & ChrW(225) & "m", " ch" & ChrW(237) & "n")
    donvi2 = Array("", " m" & ChrW(7889) & "t", " hai", " ba", " t" & ChrW(432), " l" & ChrW(259) & "m", _
                " s" & ChrW(225) & "u", " b" & ChrW(7849) & "y", " t" & ChrW(225) & "m", " ch" & ChrW(237) & "n")
    donvi_nhom = Array("", " tri" & ChrW(7879) & "u", " ngh" & ChrW(236) & "n", " t" & ChrW(7927))
End Sub
' doc so thanh chu Viet unicode
Function BangLoiVn(ByVal So, ByVal strDonVi As String) As String
' So - là số cần chuyển thành chữ
' strDonvi - chuỗi miêu tả đơn vị cần đưa vào chuỗi trả về. strDonvi có dạng: "donvichan+donvile"
' vd. "dollar+cent", "met+cm", "+phan tram"
' BangLoiVn(1234567891000, "lần được lên mây+")
' Trả về "Một nghìn hai trăm ba mươi tư tỷ năm trăm sáu mươi bẩy triệu tám trăm chín mươi mốt nghìn lần được lên mây"
' BangLoiVn(1234567891000, "con trâu+")
' Trả về "Một nghìn hai trăm ba mươi tư tỷ năm trăm sáu mươi bẩy triệu tám trăm chín mươi mốt nghìn con trâu"
' BangLoiVn(1234567891000, "lọ thuốc tăng lực+")
' Trả về "Một nghìn hai trăm ba mươi tư tỷ năm trăm sáu mươi bẩy triệu tám trăm chín mươi mốt nghìn lọ thuốc tăng lực"
' BangLoiVn(1234567891000,56, "+phần trăm")
' Trả về "Một nghìn hai trăm ba mươi tư tỷ năm trăm sáu mươi bẩy triệu tám trăm chín mươi mốt nghìn và năm mươi sáu phần trăm"
        
' BangLoiVn(1234567891000,56, "kg+dag")
' Trả về "Một nghìn hai trăm ba mươi tư tỷ năm trăm sáu mươi bẩy triệu tám trăm chín mươi mốt nghìn kg và năm mươi sáu dag"
        
' BangLoiVn(1234567891000,56, "mét+cm")
' Trả về "Một nghìn hai trăm ba mươi tư tỷ năm trăm sáu mươi bẩy triệu tám trăm chín mươi mốt nghìn mét và năm mươi sáu cm"
        
' BangLoiVn(1234567891000,56, "đồng+xu")
' Trả về "Một nghìn hai trăm ba mươi tư tỷ năm trăm sáu mươi bẩy triệu tám trăm chín mươi mốt nghìn đồng và năm mươi sáu xu"
        
' BangLoiVn(1234567891000,56, "dollar+cent")
' Trả về "Một nghìn hai trăm ba mươi tư tỷ năm trăm sáu mươi bẩy triệu tám trăm chín mươi mốt nghìn dollar và năm mươi sáu cent"
Dim dau As String, ketqua As String
Dim dvchan As String, dvle As String, nguyen As Double
Dim le As Byte, n1 As Byte, n2 As Byte, n3 As Byte, index As Byte, chisonhom As Byte
Dim tram As String, chuc As String, DonVi As String, baso As String
    InitArrayStr
    
    If Trim(So) = "" Then
        BangLoiVn = ""
    ElseIf Not IsNumeric(So) Then
        BangLoiVn = So
    Else
        ' chuẩn bị phần nguyên và phần lẻ
        If So < 0 Then dau = ChrW(226) & "m "
        So = Application.WorksheetFunction.Round(Abs(So), 2)
        index = InStr(1, So, "E")
        If index > 0 Then ' số có dạng xxxE+yyy
            le = 0
            ' loại các ký tự "." và ","
            So = Replace(Replace(So, ".", ""), ",", "")
            ' vị trí E
            index = InStr(1, So, "E")
            ' yyy
            nguyen = Mid(So, index + 1)
            So = Mid(So, 1, index - 1)
            ' phần chẵn ở dạng "ab...c0...0"
            So = So & String(nguyen - Len(So) + 1, "0")
        Else
            ' phần lẻ
            le = (So - Int(So)) * 100
            ' phần chẵn
            So = Int(So)
        End If
        index = Len(So) Mod 9
        ' ta thêm các ký tự "0" vào đầu khi cần thiết để độ dài chuỗi chia hết cho 9
        If index > 0 Then So = String(9 - index, "0") & So
        ' đọc số
        index = 1
        Size = Len(So)
        chisonhom = 1
        ketqua = ""
        Do
            baso = ""
            ' đọc lần lượt 3 ký tự
            n1 = Mid(So, index, 1)
            n2 = Mid(So, index + 1, 1)
            n3 = Mid(So, index + 2, 1)
            index = index + 3
            If n1 & n2 & n3 <> "000" Then
                If n1 = 0 Then
                    ' hang tram la 0. Ta them "khong tram" chi khi no khong nam o dau chuoi tra ve
                    If ketqua = "" Then tram = "" Else tram = " kh" & ChrW(244) & "ng tr" & ChrW(259) & "m"
                Else
                    ' hang tram bang loi
                    tram = donvi0(n1) & " tr" & ChrW(259) & "m"
                End If
                
                If n2 > 0 Then
                    ' hang chuc khac 0 nen ta doc tu bang ra
                    chuc = hangchuc(n2)
                ElseIf tram = "" Then
                    ' chu so hang chuc bang 0 nam o nhom 3 ky tu dau So ma hang tram cung bang 0
                    chuc = ""
                ElseIf n3 > 0 Then
                    ' chu so hang chuc bang 0, ham tram va don vi khac 0 nen ta dung tu "linh"
                     chuc = " linh"
                Else
                    ' chu so hang chuc va hang don vi bang 0
                    chuc = ""
                End If
                
                If n2 = 1 Then
                    ' neu chu so hang chuc la 1 thi don vi doc tu bang donvi1
                    DonVi = donvi1(n3)
                ElseIf n2 > 1 Then
                    ' neu chu so hang chuc > 1 thi don vi doc tu bang donvi2
                    DonVi = donvi2(n3)
                Else
                    ' neu chu so hang chuc bang 0 thi don vi doc tu bang donvi0
                    DonVi = donvi0(n3)
                End If
                ' neu chua doc het chuoi tuc la nhom 3 so doc ra chua phai la nhom 3 so cuoi
                ' cung nen ta them don vi "trieu", nghin", "ty"
                If index < Size Then
                    baso = tram & chuc & DonVi & donvi_nhom(chisonhom)
                Else
                ' nhom 3 so doc ra la nhom 3 so cuoi cung nen khong them don vi gi ca
                    baso = tram & chuc & DonVi
                End If
            End If
            ' them vao ket qua tam thoi
            ketqua = ketqua & baso
            chisonhom = chisonhom + 1
            ' neu chisonhom = 4 co nghia la ta vua doc xong 3 nhom 3 chu so (tuc tong cong 9 chu so)
            ' ta bat dau lai chu ky doc 9 chu so, trong 3 dot - moi dot 3 chu so
            If chisonhom > 3 Then chisonhom = 1
            ' neu da doc het cac chu so thi ra khoi vong lap
            If index > Size Then Exit Do
        Loop
        ketqua = Trim(ketqua)
        If ketqua = "" Then
            ketqua = "Kh" & ChrW(244) & "ng"
        ElseIf dau <> "" Then
            ketqua = dau & ketqua
        Else
            ' tra ve chuoi co ky tu dau la Hoa
            ketqua = UCase(Left(ketqua, 1)) & Mid(ketqua, 2)
        End If
        ' Ta xet phan DonVi
        index = InStr(1, strDonVi, "+")
        If index > 0 Then
            dvchan = Mid(strDonVi, 1, index - 1)
            If dvchan <> "" Then dvchan = " " & dvchan
            dvle = Mid(strDonVi, index + 1)
            If dvle <> "" Then dvle = " " & dvle
        End If
        ketqua = ketqua & dvchan
        If le <> 0 Then
            So = CStr(le)
            n2 = Left(So, 1)
            n3 = Right(So, 1)
            If n2 > 0 Then chuc = hangchuc(n2) Else chuc = ""
            If n2 = 1 Then
                DonVi = donvi1(n3)
            ElseIf n2 > 1 Then
                DonVi = donvi2(n3)
            Else
                DonVi = ""
            End If
            
            ketqua = ketqua & " v" & ChrW(224) & chuc & DonVi & dvle
        Else
            ketqua = ketqua & " ch" & ChrW(7861) & "n"
        End If
        BangLoiVn = ketqua
    End If
End Function

Tải về rồi đổi thành SoThanhChu.bas
 

File đính kèm

  • SoThanhChu.txt
    8.6 KB · Đọc: 82
Upvote 0
các bác cho mình macro hoàn chỉnh chuyển như thế này:

Một trăm hai mươi ba tỷ, bốn trăm ba mươi bốn triệu, năm trăm sáu mươi bảy nghìn, tám trăm đồng.

được không vậy, mong có trả lời sớm.
và cho minh hỏi:
có mấy macro: Một trăm hai mươi ba tỷ bốn trăm ba mươi bốn triệu năm trăm sáu mươi bảy ngàn tám trăm đồng
muốn thêm dấu phẩy "," với chuyển chữ ngàn => nghìn thì mình đổi như thế nào trong MVB
 
Upvote 0
các bác cho mình macro hoàn chỉnh chuyển như thế này:

Một trăm hai mươi ba tỷ, bốn trăm ba mươi bốn triệu, năm trăm sáu mươi bảy nghìn, tám trăm đồng.

được không vậy, mong có trả lời sớm.
và cho minh hỏi:
có mấy macro: Một trăm hai mươi ba tỷ bốn trăm ba mươi bốn triệu năm trăm sáu mươi bảy ngàn tám trăm đồng
muốn thêm dấu phẩy "," với chuyển chữ ngàn => nghìn thì mình đổi như thế nào trong MVB

Bạn sử dụng công thức sau nhé:
SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(
HAM_DOC_SO(XXX);"tỷ";"tỷ,");"triệu";"triệu,");"ngàn";"ngàn,")
SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(
HAM_DOC_SO(XXX);"tỷ";"tỷ,");"triệu";"triệu,");"ngàn";"nghìn,")
Ghi chú:
  1. HAM_DOC_SO là cái hàm gì đó được dùng để đọc số.
  2. XXX là giá trị số cần đọc (có thể là địa chỉ 1 ô, 1 số cụ thể hay là 1 công thức tính ra giá trị số...)

Đây là công thức chữa cháy khi chưa tìm ra HAM_DOC_SO như ý của bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Code đọc số thành chữ.

Có một ý kiến, bạn có thể đặt tên hàm "SoThanhChu" ngắn lại không, dài quá hơi bất tiện mà thao tác type cũng mất thời gian. VD có thể đổi là DocSo() !?
Thanks!

gui tham khao, chi don gian la ten ham DSOTIEN( SO TIEN)
nếu có gì sai, mong được gốp ý để hoàn thiện thêm thanks
 
Lần chỉnh sửa cuối:
Upvote 0
nếu có gì sai, mong được gốp ý để hoàn thiện thêm thanks


View attachment 87493

Bạn muốn người ta góp ý cho bạn mà bạn "chơi" ảnh? Bạn nghĩ là người ta sẽ ngồi gõ cái code của bạn, chú ý cao độ để khỏi gõ sai so với code của bạn?
Nhưng thôi, tôi đã chót viết thì cũng vài lời, gọi là "nhìn" thấy cái gì thì nói.
1. Cái sotien as Single kia có vấn đề. Single chỉ dùng 4 bai nên nếu số cỡ hơi bự (không hẳn là nguyên soái) vd. 12345678 thì nó được truyền vào hàm ở dạng 1,x...yE+z. Như thế thì Val(sotien) sẽ trả về 1. Do vậy với a = Fix(Val(sotien)) thì a = 1. Nếu code tiếp theo đúng cả thì kết quả là "một đồng" cho số 12345678. Bạn cứ thử mà xem.
2. Tôi nhìn thấy ở đầu
Mã:
b = Len(Trim(a))
y = (b) - 1
Tức y >= 0. Ở cuối vòng lặp DO có
Mã:
 y = y + 1 
Loop Until y < 0
Thế thì có bao giờ y < 0 đâu.
3. Tôi nhìn thấy If (y = 3 Or y = 6 Or y = 12 Or y = 15) Then, tức bạn hỗ trợ số hơi to đấy. Nhưng thôi tôi xét số nhập vào có 14 chữ số thôi. Sau dòng y = b - 1 ta có y = 13.
Tiếp theo có code
Mã:
dv = Array("", "muoi", "tram", "nghin", "muoi", "tram", "trieu", "muoi", "tram", "ty", "muoi", "tram", "nghin")
ddv = dv(y)
Thế này thì chết rồi. Mảng dv có chỉ số trên là 12 mà gọi ddv = dv(y) = dv(13) thì toi rồi.
Ha, viết xong thì thấy bạn sửa là y = y - 1. Thôi không tính điểm 2.
Thôi không dò tiếp nữa. Lần sau bạn gửi văn bản để người ta dễ dán vào module để thử.

À mà bạn khai mảng như thế thì bạn sẽ có
15 = "mười năm đồng", 21 = "hai mười một đồng", 51 = "năm mười một đồng"
Sao kỳ quặc thế
Không chỉ đơn giản "ngọng líu ngọng lô" mà có thể gây hiểu lầm: "hai mười một" = 211, "năm mười một" = 511
 
Lần chỉnh sửa cuối:
Upvote 0
[GPECODE=vb]Option Explicit
Public Function VND(sotien As Double)
Dim a, b, X, Y As Double, Dso, Ddv, So, Dv, doc As String
If sotien = 0 Then
VND = "Khoâng"
Exit Function
End If
a = Fix(Val(sotien))
b = Len((a))
X = 1
Y = b - 1
Do
So = Array("khoâng", "moät", "hai", "ba", "boán", "naêm", "saùu", "baûy", "taùm", "chín")
Dso = So(Mid(a, X, 1))
Dv = Array("", "möôi", "traêm", "nghìn,", "möôi", "traêm", "trieäu,", "möôi", "traêm", "tyû,", "möôi", "traêm", "nghìn", "möôi", "traêm")
Ddv = Dv(Y)
If Dso <> "khoâng" Then
If Ddv = "traêm" Then
doc = doc & " " & Dso & " " & Ddv
ElseIf Ddv = "möôi" Then
If Dso = "moät" Then
If X > 1 Then
doc = doc & " " & "möôøi"
Else
doc = "möôøi"
End If
Else
doc = doc & " " & Dso & " " & Ddv
End If
Else
If X > 1 Then
If Dso = "moät" And Val(Mid(a, X - 1, 1)) > 1 Then
doc = doc & " moát" & " " & Ddv
Else
doc = doc & " " & Dso & " " & Ddv
End If
Else
doc = Dso & " " & Ddv
End If
End If
Else
If Ddv = "traêm" Then
If Val(Mid(a, X, 2)) = 0 And Val(Mid(a, X, 3)) = 0 Then
doc = doc
Else
doc = doc & " " & Dso & " " & Ddv
End If
ElseIf Ddv = "möôi" Then
If Val(Mid(a, X, 2)) = 0 Then
doc = doc
Else
doc = doc & " leû"
End If
Else
If X >= 3 Then
If Val(Mid(a, X - 2, 3)) > 0 Or Y = 9 Or Y = 12 Then
doc = doc & " " & Ddv
Else
doc = doc
End If
Else
If Val(Mid(a, X - 1, 2)) > 0 Or Y = 9 Or Y = 12 Then
doc = doc & " " & Ddv
Else
doc = doc
End If
End If
End If
End If
X = X + 1
Y = Y - 1
Loop Until Y < 0
doc = Trim(doc)
If Val(Right(a, 3)) = 0 Or Val(Right(a, 6)) = 0 Or Val(Right(a, 9)) = 0 Then
doc = Left(doc, Len(doc) - 1)
Else
doc = doc
End If
doc = UCase(Left(doc, 1)) & Right(doc, Len(doc) - 1)
VND = doc
End Function



[/GPECODE]
chỉnh sửa bổ sung thêm dấu phải, font vni

Bổ sung bài viết hàm dùng font UniCode
[GPECODE=vb]Option Explicit




Function UniVND(sotien As Double)
Dim a, b, X, Y As Double, Dso, Ddv, So, Dv, doc As String


If sotien = 0 Then
UniVND = "kh" & ChrW(244) & "ng"
Exit Function
End If
a = Fix(Val(sotien))
b = Len((a))
X = 1
Y = b - 1
Do
So = Array("kh" & ChrW(244) & "ng", "m" & ChrW(7897) & "t", "hai", "ba", "b" & ChrW(7889) & "n", "n" & ChrW(259) & "m", "s" & ChrW(225) & "u", "b" & ChrW(7843) & "y", "t" & ChrW(225) & "m", "ch" & ChrW(237) & "n")
Dso = So(Mid(a, X, 1))
Dv = Array("", "m" & ChrW(432) & ChrW(417) & "i", "tr" & ChrW(259) & "m", "ng" & ChrW(224) & "n,", "m" & ChrW(432) & ChrW(417) & "i", "tr" & ChrW(259) & "m", "tri" & ChrW(7879) & "u,", "m" & ChrW(432) & ChrW(417) & "i", "tr" & ChrW(259) & "m", "t" & ChrW(7927) & ",", "m" & ChrW(432) & ChrW(417) & "i", "tr" & ChrW(259) & "m", "ng" & ChrW(224) & "n")
Ddv = Dv(Y)
If Dso <> "kh" & ChrW(244) & "ng" Then
If Ddv = "tr" & ChrW(259) & "m" Then
doc = doc & " " & Dso & " " & Ddv
ElseIf Ddv = "m" & ChrW(432) & ChrW(417) & "i" Then
If Dso = "m" & ChrW(7897) & "t" Then
If X > 1 Then
doc = doc & " " & "m" & ChrW(432) & ChrW(7901) & "i"
Else
doc = "m" & ChrW(432) & ChrW(7901) & "i"
End If
Else
doc = doc & " " & Dso & " " & Ddv
End If
Else
If X > 1 Then
If Dso = "m" & ChrW(7897) & "t" And Val(Mid(a, X - 1, 1)) > 1 Then
doc = doc & " " & "m" & ChrW(7889) & "t" & " " & Ddv
Else
doc = doc & " " & Dso & " " & Ddv
End If
Else
doc = Dso & " " & Ddv
End If
End If
Else
If Ddv = "tr" & ChrW(259) & "m" Then
If Val(Mid(a, X, 2)) = 0 And Val(Mid(a, X, 3)) = 0 Then
doc = doc
Else
doc = doc & " " & Dso & " " & Ddv
End If
ElseIf Ddv = "m" & ChrW(432) & ChrW(417) & "i" Then
If Val(Mid(a, X, 2)) = 0 Then
doc = doc
Else
doc = doc & " l" & ChrW(7867)
End If
Else
If X >= 3 Then
If Val(Mid(a, X - 2, 3)) > 0 Or Y = 9 Or Y = 12 Then
doc = doc & " " & Ddv
Else
doc = doc
End If
Else
If Val(Mid(a, X - 1, 2)) > 0 Or Y = 9 Or Y = 12 Then
doc = doc & " " & Ddv
Else
doc = doc
End If
End If
End If
End If
X = X + 1
Y = Y - 1
Loop Until Y < 0
doc = Trim(doc)
If Val(Right(a, 3)) = 0 Or Val(Right(a, 6)) = 0 Or Val(Right(a, 9)) = 0 Then
doc = Left(doc, Len(doc) - 1)
Else
doc = doc
End If
doc = UCase(Left(doc, 1)) & Right(doc, Len(doc) - 1)
UniVND = doc
End Function
[/GPECODE]
 

File đính kèm

  • VND.xls
    38 KB · Đọc: 196
  • Ham UniVND.xls
    45 KB · Đọc: 157
Lần chỉnh sửa cuối:
Upvote 0
Đề tài này có nhiều trên GPE mình rồi đó bạn. Bạn vào thư viện GPE tải về các add-ins hỗ trợ việc dịch số ra chữ về xài. Còn nếu không muốn mất thời gian thì tải file mình đính kèm bên dưới. Sau đó giải nén vào một thư mục (thư mục nào cũng được, miễn dễ nhớ). Mở excel lên, chọn Tool-->Add-Ins-->Browse, chỉ đường dẫn tới chỗ lưu file này. ấn OK.

Muốn đọc số ra chữ bạn gõ vào công thức tại ô cần đặt chữ: =VND(số tiền).
Add-Ins này cũng hỗ trợ chuyển đổi chữ hoa, chữ thường đấy nhé (giống trong Word ấn Shift+F3 vậy)
Cách làm như sau: chọn vùng cần đổi sang chữ HOA/thường
Phím tắt như sau:
Ctrl+Shift+T: chuyển hết thành chữ thường
Ctrl+Shift+H: CHUYỂN HẾT THÀNH CHỮ HOA
Ctrl+Shift+K: Chuyển Thành Dạng Như Thế này.
File này mình đúc kết từ các bài viết của các anh chị GPE mình đấy!
Bạn làm thử xem nhé!


Nếu bạn chưa có Winrar thì có thể tải tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=2273


Ps: Nhìn cái hình chọt lét người ta rồi làm ngơ thấy ghét quá!
:-=

Mình dùng rồi thấy rât ok, nhưng vẫn bị đọc thiếu số. VD: 63.050.298.427 đọc là Sáu mươi ba tỷ (mình mun thêm không trăm năm mươi)năm mươi triệu hai trăm chín mươi tám ngàn bốn trăm hai mươi bẩy đồng -->thiếu số 0
 
Lần chỉnh sửa cuối:
Upvote 0
Có ai chỉ dùm cho mình cách copy và cài phần đọc từ số sang chữ với. mình đang cần. cảm ơn nhiều
 
Upvote 0
có ai chỉ cho e chi tiết được không?em hk thực hành được/
 
Upvote 0
Web KT
Back
Top Bottom