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
 
PhanTuHuong đã viết:
Hàm của bác Long là ngắn nhất, phù hợp với công việc đổi tiền. Còn 1 số hàm khác hơi dài nhưng lại phù hợp với việc đổi số (thêm phần thập phân).
Phần thập phân không biết đọc các nào cho đúng.
5,12 đọc thế nào cho đúng? Nếu đọc theo sách giáo khoa là năm đơn vị mười hai phần trăm thì chính xác, nhưng trong thực tế không ai đọc vậy. Nếu là tiền đọc năm đồng mười hai xu hoặc năm đồng một hào hai xu; còn nếu là độ dài, thể tích, ... đọc thế nào?
Chịu thua, không viết được!
 
Upvote 0
Xem thử cái này nhé các bạn, mình chỉnh sửa từ hàm say(number,unit) của 1 bạn quên tên (rất chân thành cám ơn bạn ấy) thành hàm say(number,unit,decimal), đọc số thập phân, đọc đơn vị tính tự do kiểu 3 lít phẩy năm mươi, đơn vị cho phần thập phân kiểu năm Mỹ kim và ba muơi hai cents ( một cent), đọc không đơn vị kiểu bốn phẩy năm mươi ba, bảy đồng chẵn.
Kèm theo là hàm đọc ra tiếng Anh saye(number,unit,decimal) cũng giống như vậy (Three litters point zero four), Five Euros and fifty cents, Zero US dolllar and four cents, Fifty pounds only)
Đặc biệt có ngoại lệ cho số nhiều kiểu foot, feet; penny, pence; mouse, mice. Ngoại lệ thêm vào thoải mái trong code phần exception.
Nhưng chưa có phần Unicode.
 

File đính kèm

  • Docso.zip
    11.7 KB · Đọc: 1,135
Lần chỉnh sửa cuối:
Upvote 0
vungoc đã viết:
Đây là hàm của bác phamduylong - rất chuẩn và đa dạng (VNI, UNI, ABC, ...)
PhanTuHuong đã viết:
Hàm của bác Long là ngắn nhất, phù hợp với công việc đổi tiền
rất hay, cám ơn bác Long đã XD các hàm này đa dạng cho các loại mã Font khác nhau. Tuy nhiên còn bất lợi nhỏ, đó là
+ Chưa phân biệt giữa lop3 (tức là phân cách hàng tỷ, triệu, nghìn) -> nên dùng dấu "," để phân cách, VD:
Số: 123,434,567,800
thì KQ chỉ là: 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
Nên KQ là: 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
(đã có dấu phẩy phân cách)

+ Chưa có Ký tự đầu tiên là chữ HOA, VD trên chỉ ra rằng "một trăm ...." nên là "Một trăm ...." (như màu xanh trên)

TigerTiger đã sửa các lỗi này rùi, xin post lên:

PHP:
Public Function DocSoVni(conso) As String
s09 = Array("", " moät", " hai", " ba", " boán", " naêm", " saùu", " baûy", " taùm", " chín")
lop3 = Array("", " trieäu,", " nghìn,", " tyû,")
If Trim(conso) = "" Then
DocSoVni = ""
ElseIf IsNumeric(conso) = True Then
If conso < 0 Then dau = "aâm " Else dau = ""
conso = Application.WorksheetFunction.Round(Abs(conso), 0)
conso = " " & conso
conso = Replace(conso, ",", "", 1)
vt = InStr(1, conso, "E")
If vt > 0 Then
sonhan = Val(Mid(conso, vt + 1))
conso = Trim(Mid(conso, 2, vt - 2))
conso = conso & String(sonhan - Len(conso) + 1, "0")
End If
conso = Trim(conso)
sochuso = Len(conso) Mod 9
If sochuso > 0 Then conso = String(9 - (sochuso Mod 12), "0") & conso
docso = ""
I = 1
lop = 1
Do
n1 = Mid(conso, I, 1)
n2 = Mid(conso, I + 1, 1)
n3 = Mid(conso, I + 2, 1)
baso = Mid(conso, I, 3)
I = I + 3
If n1 & n2 & n3 = "000" Then
If docso <> "" And lop = 3 And Len(conso) - I > 2 Then s123 = " tyû" Else s123 = ""
Else
If n1 = 0 Then
If docso = "" Then s1 = "" Else s1 = " khoâng traêm"
Else
s1 = s09(n1) & " traêm"
End If
If n2 = 0 Then
If s1 = "" Or n3 = 0 Then
s2 = ""
Else
s2 = " linh"
End If
Else
If n2 = 1 Then s2 = " möôøi" Else s2 = s09(n2) & " möôi"
End If
If n3 = 1 Then
If n2 = 1 Or n2 = 0 Then s3 = " moät" Else s3 = " moát"
ElseIf n3 = 5 And n2 <> 0 Then
s3 = " laêm"
Else
s3 = s09(n3)
End If
If I > Len(conso) Then
s123 = s1 & s2 & s3
Else
s123 = s1 & s2 & s3 & lop3(lop)
End If
End If
lop = lop + 1
If lop > 3 Then lop = 1
docso = docso & s123
If I > Len(conso) Then Exit Do
Loop
If docso = "" Then
  DocSoVni = "khoâng" 'Else DocSoVni = dau & Trim(docso)
Else: docso = Trim(docso): DocSoVni = dau & UCase(Left(docso, 1)) + Right(docso, Len(docso) - 1): End If
Else
DocSoVni = conso
End If
End Function
 
'==================================
Public Function DocSoAbc(conso) As String
s09 = Array("", " mét", " hai", " ba", " bèn", " n¨m", " s¸u", " b¶y", " t¸m", " chÝn")
lop3 = Array("", " triÖu,", " ngh×n,", " tû,", " triÖu,", " ngh×n,", "")
If Trim(conso) = "" Then
DocSoAbc = ""
ElseIf IsNumeric(conso) = True Then
If conso < 0 Then dau = "©m " Else dau = ""
conso = Application.WorksheetFunction.Round(Abs(conso), 0)
conso = " " & conso
conso = Replace(conso, ",", "", 1)
vt = InStr(1, conso, "E")
If vt > 0 Then
sonhan = Val(Mid(conso, vt + 1))
conso = Trim(Mid(conso, 2, vt - 2))
conso = conso & String(sonhan - Len(conso) + 1, "0")
End If
conso = Trim(conso)
sochuso = Len(conso) Mod 9
If sochuso > 0 Then conso = String(9 - (sochuso Mod 12), "0") & conso
docso = ""
I = 1
lop = 1
Do
n1 = Mid(conso, I, 1)
n2 = Mid(conso, I + 1, 1)
n3 = Mid(conso, I + 2, 1)
baso = Mid(conso, I, 3)
I = I + 3
If n1 & n2 & n3 = "000" Then
If docso <> "" And lop = 3 And Len(conso) - I > 2 Then s123 = " tû" Else s123 = ""
Else
If n1 = 0 Then
If docso = "" Then s1 = "" Else s1 = " kh«ng tr¨m"
Else
s1 = s09(n1) & " tr¨m"
End If
If n2 = 0 Then
If s1 = "" Or n3 = 0 Then
s2 = ""
Else
s2 = " linh"
End If
Else
If n2 = 1 Then s2 = " m­¬i" Else s2 = s09(n2) & " m­¬i"
'If n2 = 1 Then s2 = " m&shy;êi" Else s2 = s09(n2) & " m&shy;¬i"
End If
If n3 = 1 Then
If n2 = 1 Or n2 = 0 Then s3 = " mét" Else s3 = " mèt"
ElseIf n3 = 5 And n2 <> 0 Then
s3 = " l¨m"
Else
s3 = s09(n3)
End If
If I > Len(conso) Then
s123 = s1 & s2 & s3
Else
s123 = s1 & s2 & s3 & lop3(lop)
End If
End If
lop = lop + 1
If lop > 3 Then lop = 1
docso = docso & s123
If I > Len(conso) Then Exit Do
Loop
If docso = "" Then
DocSoAbc = "kh«ng" 'Else DocSoAbc = dau & Trim(docso)
Else: docso = Trim(docso): DocSoAbc = dau & UCase(Left(docso, 1)) + Right(docso, Len(docso) - 1): End If
Else
DocSoAbc = conso
End If
End Function
'===============================
Public Function DocSoUni(conso) As String
s09 = Array("", " 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")
lop3 = Array("", " tri" & ChrW(7879) & "u,", " ngh" & ChrW(236) & "n,", " t" & ChrW(7927) & ",")
'lop3 = Array("", " tri" & ChrW(7879) & "u", " ngh" & ChrW(236) & "n", " t" & ChrW(7927))
'Stop
If Trim(conso) = "" Then
DocSoUni = ""
ElseIf IsNumeric(conso) = True Then
If conso < 0 Then dau = ChrW(226) & "m " Else dau = ""
conso = Application.WorksheetFunction.Round(Abs(conso), 0)
conso = " " & conso
conso = Replace(conso, ",", "", 1)
vt = InStr(1, conso, "E")
If vt > 0 Then
sonhan = Val(Mid(conso, vt + 1))
conso = Trim(Mid(conso, 2, vt - 2))
conso = conso & String(sonhan - Len(conso) + 1, "0")
End If
conso = Trim(conso)
sochuso = Len(conso) Mod 9
If sochuso > 0 Then conso = String(9 - (sochuso Mod 12), "0") & conso
docso = ""
I = 1
lop = 1
Do
n1 = Mid(conso, I, 1)
n2 = Mid(conso, I + 1, 1)
n3 = Mid(conso, I + 2, 1)
baso = Mid(conso, I, 3)
I = I + 3
If n1 & n2 & n3 = "000" Then
If docso <> "" And lop = 3 And Len(conso) - I > 2 Then s123 = " t" & ChrW(7927) Else s123 = ""
Else
If n1 = 0 Then
If docso = "" Then s1 = "" Else s1 = " kh" & ChrW(244) & "ng tr" & ChrW(259) & "m"
Else
s1 = s09(n1) & " tr" & ChrW(259) & "m"
End If
If n2 = 0 Then
If s1 = "" Or n3 = 0 Then
s2 = ""
Else
s2 = " linh"
End If
Else
If n2 = 1 Then s2 = " m" & ChrW(432) & ChrW(7901) & "i" Else s2 = s09(n2) & " m" & ChrW(432) & ChrW(417) & "i"
End If
If n3 = 1 Then
If n2 = 1 Or n2 = 0 Then s3 = " m" & ChrW(7897) & "t" Else s3 = " m" & ChrW(7889) & "t"
ElseIf n3 = 5 And n2 <> 0 Then
s3 = " l" & ChrW(259) & "m"
Else
s3 = s09(n3)
End If
If I > Len(conso) Then
s123 = s1 & s2 & s3
Else
s123 = s1 & s2 & s3 & lop3(lop)
End If
End If
lop = lop + 1
If lop > 3 Then lop = 1
docso = docso & s123
If I > Len(conso) Then Exit Do
Loop

'If docso = "" Then DocSoUni = "kh" & ChrW(244) & "ng" Else DocSoUni = dau & Trim(docso)
If docso = "" Then
     DocSoUni = "kh" & ChrW(244) & "ng"
Else: docso = Trim(docso): DocSoUni = dau & UCase(Left(docso, 1)) + Right(docso, Len(docso) - 1)
End If
Else
DocSoUni = conso
End If
End Function

 
Upvote 0
Nếu tôi có số tiền là 2 560 000.52 đồng, thì làm sao?

Lê Văn Duyệt
 
Upvote 0
Nếu tôi có số tiền là 2 560 000.52 đồng, thì làm sao?
Bác xem thử cái này:
PHP:
Function Say(number, unit, dec) As String
bangchu(0, 0) = "Khoâng traêm "
bangchu(1, 0) = "Moät traêm "
bangchu(2, 0) = "Hai traêm "
bangchu(3, 0) = "Ba traêm "
bangchu(4, 0) = "Boán traêm "
bangchu(5, 0) = "Naêm traêm "
bangchu(6, 0) = "Saùu traêm "
bangchu(7, 0) = "Baûy traêm "
bangchu(8, 0) = "Taùm traêm "
bangchu(9, 0) = "Chín traêm "
bangchu(0, 1) = IIf(Int(Abs(number)) = 0, "Khoâng ", " ")
bangchu(1, 1) = "Moät "
bangchu(2, 1) = "Hai "
bangchu(3, 1) = "Ba "
bangchu(4, 1) = "Boán "
bangchu(5, 1) = "Naêm "
bangchu(6, 1) = "Saùu "
bangchu(7, 1) = "Baûy "
bangchu(8, 1) = "Taùm "
bangchu(9, 1) = "Chín "
bangchu(0, 2) = "leû "
bangchu(1, 2) = "Möôøi "
bangchu(2, 2) = "Hai möôi "
bangchu(3, 2) = "Ba möôi "
bangchu(4, 2) = "Boán möôi "
bangchu(5, 2) = "Naêm möôi "
bangchu(6, 2) = "Saùu möôi "
bangchu(7, 2) = "Baûy möôi "
bangchu(8, 2) = "Taùm möôi "
bangchu(9, 2) = "Chín möôi "
banghang(0) = " "
banghang(1) = " "
banghang(2) = "ngaøn, "
banghang(3) = "trieäu "
banghang(4) = "tyû, "
banghang(5) = "ngaøn tyû, "
bangvaloi(1, 1) = "möôi moät"
bangvaloi(1, 2) = "möôi moát"
bangvaloi(2, 1) = "i naêm"
bangvaloi(2, 2) = "i laêm"
Tam = Abs(number)
Tam = Int(Tam)
l = Len(Tam)
For i = 1 To l
so = Mid(Tam, i, 1)
so1 = IIf(i > l - 1, 0, Mid(Tam, i + 1, 1))
so2 = IIf(i > l - 2, 0, Mid(Tam, i + 2, 1))
If i < 2 Then
so3 = 0
Else
so3 = Mid(Tam, i - 1, 1)
End If
If i < 3 Then
so4 = 0
Else
so4 = Mid(Tam, i - 2, 1)
End If
nhom = Int(l - i + 1) / 3 + 1
du = (l - i + 1) Mod 3
If ((du = 0) And (so = 0) And (so1 = 0) And (so2 = 0)) Or ((du = 2) And (so = 0) And (so1 = 0)) = True Then
chu = " "
Else
chu = bangchu(so, du)
End If
If (du = 1) And ((so <> 0) Or (so3 <> 0) Or (so4 <> 0)) Then
chu = chu & banghang(nhom)
End If
If chu <> " " Then
If i = 1 Then
Say = chu
Else
Say = Say & LCase(chu)
End If
End If
Next i
Say = Replace(Say, bangvaloi(1, 1), bangvaloi(1, 2))
Say = Replace(Say, bangvaloi(2, 1), bangvaloi(2, 2))
sole = Abs(number) - Int(Abs(number))
If sole > 0 Then
Select Case unit
Case 0
dvt = ""
Case 1
dvt = "ñoàng"
Case 2
dvt = "Myõ kim"
Case 3
dvt = "Euro"
Case Else
dvt = unit
End Select
Else
Select Case unit
Case 0
dvt = IIf(dec = 1, IIf(Tam < 2, "cent", "cents"), IIf(dec = 0, "", dec))
Case 1
dvt = "ñoàng chaün"
Case 2
dvt = "Myõ kim chaün"
Case 3
dvt = "Euro chaün"
Case Else
dvt = unit & " chaün"
End Select
End If
Select Case number
Case 0
Say = ""
Case Is > 0
Say = Trim(Say) & " " & dvt
Case Else
Say = "AÂm " & LCase(Say)
Say = Trim(Say) & " " & dvt
End Select
If sole > 0 Then
Say = Trim(Say) & IIf(dec = 0, " phaåy ", " vaø ")
Say = Say & IIf(Round(sole * 100, 0) < 10 And dec = 0, "khoâng ", "")
Say = Say & LCase(Say(Round(sole * 100, 0), 0, dec))
Else
Say = Trim(Say) & IIf(number = 0, "", ".")
'Exceptions:
Say = IIf(Tam > 1, Replace(Say, "penny", "pence"), Say)
Say = IIf(Tam > 1, Replace(Say, "foot", "feet"), Say)
End If
'Exceptions:
Say = IIf(Tam > 1, Replace(Say, "penny", "pence"), Say)
Say = IIf(Tam > 1, Replace(Say, "foot", "feet"), Say)
End Function

1.tham số Unit là đơn vị tính: 1 là đồng VN, 2 là USD, 3 là EUR, đơn vị khác thì gõ trực tiếp vào tham số ("mét" chẳng hạn)
2. Tham số Dec là đơn vị cho phần thập phân: 0 là không xài đọc là phẩy ba mươi hai, 1 là cent (số nhiều thêm s), đơn vị tính khác thì gõ vào ("centimét" chẳng hạn)
3. Đọc cả số âm kể cả số âm lẻ thập phân.

Tuy nhiên chỉ mới đọc ra font VNI, chưa bẫy lỗi chuỗi là text. ngoài ra số thập phân làm tròn đến 2 số.

Hàm này còn 1 thằng em là SayE(number,Unit,Dec) đọc sang tiếng Anh. Tính năng như trên. Thêm chức năng thêm s vào đv tính số nhiều, và phân biệt 1 vài trường hợp số nhiều bất quy tắc như: penny - pence, foot - feet, mouse - mice
Số lẻ đọc point nếu chọn dec = 0

Nhờ bác xem hộ rồi sửa giúp nếu còn sai sót.
 
Upvote 0
Cần nói rõ thêm với các bác, đây là hàm mình cải tiến từ hàm Say(number,unit) của "truong huu thai", Excel member, ở bài #13 trong topic http://www.giaiphapexcel.com/forum/showthread.php?page=2&t=1563
Đó là 1 trong số ít bài đổi số thành chữ mà code mình hiểu nổi bằng trình độ i tờ, từ đó mới mở rộng các tính năng khác được. bây giờ muốn cám ơn bạn ấy cũng không làm sao được. bạn ấy chỉ viết 1 bài duy nhất ngày 17/08/07 rồi không hề thấy nữa.
Code bài này mình cải tiến dùng toàn hàm VBA nên xài được trong Access, vì mình cần dùng trong Access nhiều hơn.

Xin góp luôn thằng em SayE(number, Unit, Dec)
1.tham số Unit là đơn vị tính: 1 là Vietnam Dong, 2 là US Dollar, 3 là Euro, đơn vị khác thì gõ trực tiếp vào tham số ("Kilogram" chẳng hạn); số nhiều thêm s, không là không xài, chẵn thì đọc sixty <Unit> only.
2. Tham số Dec là đơn vị tính cho phần thập phân (đã làm tròn 2 con: 0 là không xài đọc là point thirty two hoặc point zero five, 1 là cent , đơn vị tính khác thì gõ vào ("centimetter" chẳng hạn),số nhiều thêm s.
3. Cũng có phần exception cho số nhiều bất quy tắc.
Tên biến khai báo chung với thằng anh.
PHP:
Function SayE(number, unit, dec) As String
bangchu(0, 0) = "Zero hundred "
bangchu(1, 0) = "One hundred "
bangchu(2, 0) = "Two hundred "
bangchu(3, 0) = "Three hundred "
bangchu(4, 0) = "Four hundred "
bangchu(5, 0) = "Five hundred "
bangchu(6, 0) = "Six hundred "
bangchu(7, 0) = "Seven hundred "
bangchu(8, 0) = "Eight hundred "
bangchu(9, 0) = "Nine hundred "
bangchu(0, 1) = IIf(Int(Abs(number)) = 0, "Zero ", " ")
bangchu(1, 1) = "One "
bangchu(2, 1) = "Two "
bangchu(3, 1) = "Three "
bangchu(4, 1) = "Four "
bangchu(5, 1) = "Five "
bangchu(6, 1) = "Six "
bangchu(7, 1) = "Seven "
bangchu(8, 1) = "Eight "
bangchu(9, 1) = "Nine "
bangchu(0, 2) = "and "
bangchu(1, 2) = "Ten "
bangchu(2, 2) = "Twenty "
bangchu(3, 2) = "Thirty "
bangchu(4, 2) = "Fourty "
bangchu(5, 2) = "Fifty "
bangchu(6, 2) = "Sixty "
bangchu(7, 2) = "Seventy "
bangchu(8, 2) = "Eighty "
bangchu(9, 2) = "Ninety "
banghang(0) = " "
banghang(1) = " "
banghang(2) = "thousand, "
banghang(3) = "million "
banghang(4) = "billion, "
banghang(5) = "thousand billion, "
bangvaloi(1, 1) = "Ten one"
bangvaloi(1, 2) = "Eleven"
bangvaloi(2, 1) = "Ten two"
bangvaloi(2, 2) = "Twelve"
bangvaloi(3, 1) = "Ten three"
bangvaloi(3, 2) = "Thirteen"
bangvaloi(4, 1) = "Ten four"
bangvaloi(4, 2) = "Fourteen"
bangvaloi(5, 1) = "Ten five"
bangvaloi(5, 2) = "Fifteen"
bangvaloi(6, 1) = "Ten six"
bangvaloi(6, 2) = "Sixteen"
bangvaloi(7, 1) = "Ten seven"
bangvaloi(7, 2) = "Seventeen"
bangvaloi(8, 1) = "Ten eight"
bangvaloi(8, 2) = "Eighteen"
bangvaloi(9, 1) = "Ten nine"
bangvaloi(9, 2) = "Nineteen"
tam = Abs(number)
tam = Int(tam)
l = Len(tam)
For i = 1 To l
so = Mid(tam, i, 1)
so1 = IIf(i > l - 1, 0, Mid(tam, i + 1, 1))
so2 = IIf(i > l - 2, 0, Mid(tam, i + 2, 1))
If i < 2 Then
so3 = 0
Else
so3 = Mid(tam, i - 1, 1)
End If
If i < 3 Then
so4 = 0
Else
so4 = Mid(tam, i - 2, 1)
End If
nhom = Int(l - i + 1) / 3 + 1
du = (l - i + 1) Mod 3
If ((du = 0) And (so = 0) And (so1 = 0) And (so2 = 0)) Or ((du = 2) And (so = 0) And (so1 = 0)) = True Then
chu = " "
Else
chu = bangchu(so, du)
End If
If (du = 1) And ((so <> 0) Or (so3 <> 0) Or (so4 <> 0)) Then
chu = chu & banghang(nhom)
End If
If chu <> " " Then
If i = 1 Then
SayE = chu
Else
SayE = SayE & LCase(chu)
End If
End If
Next i
For x = 1 To 9
SayE = Replace(SayE, bangvaloi(x, 1), bangvaloi(x, 2))
SayE = Replace(SayE, LCase(bangvaloi(x, 1)), LCase(bangvaloi(x, 2)))
Next x
 
sole = Abs(number) - Int(Abs(number))
If sole > 0 Then
Select Case unit
Case 0
dvt = ""
Case 1
dvt = IIf(tam < 2, "VN dong", "VN dongs")
Case 2
dvt = IIf(tam < 2, "US dollar", "US dollars")
Case 3
dvt = IIf(tam < 2, "Euro", "Euros")
Case Else
dvt = IIf(tam < 2, unit, unit & "s")
End Select
Else
Select Case unit
Case 0
dvt = IIf(dec = 1, IIf(tam < 2, "cent", "cents"), IIf(dec = 0, "", IIf(tam < 2, dec, dec & "s")))
Case 1
dvt = IIf(tam < 2, "VN dong only", "VN dongs only")
Case 2
dvt = IIf(tam < 2, "US dollar only", "US dollars only")
Case 3
dvt = IIf(tam < 2, "Euro only", "Euros only")
Case Else
dvt = IIf(tam < 2, unit, unit & "s") & " only"
End Select
End If
Select Case number
Case 0
SayE = " "
Case Is > 0
SayE = Trim(SayE & dvt)
Case Else
SayE = "Minus " & LCase(SayE)
SayE = Trim(SayE & dvt)
End Select
If sole > 0 Then
SayE = Trim(SayE) & IIf(dec = 0, " point ", " and ")
SayE = SayE & IIf(Round(sole * 100, 0) < 10 And dec = 0, "zero ", "")
SayE = SayE & LCase(SayE(Round(sole * 100, 0), 0, dec))
Else
SayE = SayE & "."
End If
           'Exceptions:
SayE = Replace(SayE, "pennys", "pence")
SayE = Replace(SayE, "mouses", "mice")
SayE = Replace(SayE, "foots", "feet")
End Function
Phần code chính dùng nguyên xi như Say(), chỉ đổi giá trị biến.
 
Upvote 0
help me , cty mình xài excel 2007 , giao diện hoàn toàn khác , nên mình k biết cách cài , chỉ cho mình với
 
Upvote 0
Dây là 3 hàm đổi chữ ra số của các loại tiền Đô, VND, Yên. Em viết hơi lủng củng các bác tham khảo và tư vấn nhé (em cũng mới tiếp cận với VBA, nên còn gà lắm)
PHP:
Public Function Hgwordd(Num)
'Ham doi so ra chu voi tien Dollar'
 Dim sole, sotien, nhom, tr, hangtr, hangch, hangdv, chu, s1, s2, s3 As String
 Dim i, s11, s22, s33, sl1, sl2, sc As Integer
 Dim hang, ngang, count, count1, count2

 count = Array(" ", "one ", "two ", "three ", "four ", "five ", "six ", "seven ", "eight ", "nine ")
 count1 = Array("ten ", "eleven ", "twelve ", "thirteen  ", "fourteen ", "fifteen ", "sixteen ", "seventeen ", "eighteen ", "nineteen ")
 count2 = Array("twenty ", "thirty ", "forty ", "fifty ", "sixty ", "seventy ", "eighty ", "ninety ")
 ngan = Array(" ", "trillion, ", "billion, ", "million, ", "thousand, ", " ")
 If Num = 0 Then
    chu = ""
 Else
    If Abs(Num) >= 1E+15 Then
        chu = "Input smaller number"
    Else
        chu = ""
        If Num < 0 Then
            chu = "Minus"
        End If
    End If
    sotien = Format(Abs(Num), "################0.00")
    sotien = Right(Space(15) & sotien, 18)
    For i = 1 To 5
        nhom = Mid(sotien, i * 3 - 2, 3)
        If nhom <> Space(3) And nhom <> "000" Then
            hangtr = "":                      hangch = ""
            hangdv = ""
            s1 = Left(nhom, 1):            s2 = Mid(nhom, 2, 1)
            s3 = Right(nhom, 1):           s11 = Val(s1)
            s22 = Val(s2):                    s33 = Val(s3)
            hangtr = count(s11)
            If s11 <> 0 And s22 + s33 <> 0 Then
                 tr = "hundred and "
            Else
                  If s11 <> 0 And s22 + s33 = 0 Then
                        tr = "hundred"
                  Else
                         tr = " "
                  End If
            End If
            If s2 < "2" Then
                hangch = ""
            Else
                hangch = count2(s22 - 2)
            End If
            If s2 <> "1" Then
                hangdv = count(s33)
            Else
                 hangdv = count1(s33)
            End If
            sc = Val(Mid(sotien, 14, 3))
            If sc = 0 And i = 4 Then ngan(i) = "thousand "  '!'
            chu = chu & hangtr & tr & hangch & hangdv & ngan(i)
        End If
    Next i
End If

sl1 = Val(Mid(sotien, 17, 1))
sl2 = Val(Mid(sotien, 18, 1))

If sl1 = 0 And sl2 = 0 Then
    sole = "only."
Else
    If sl1 = 0 And sl2 > 0 Then
        sole = ".  " & "Cent " & count(sl2)
    Else
        If sl1 = 1 Then
            sole = ".  " & "Cent " & count1(sl2)
        Else
            If sl1 > 1 Then
                sole = ".  " & "Cent " & count2(sl1 - 2) & count(sl2)
        End If:        End If
End If:       End If

Hgwordd = "Dollar " & chu & sole
End Function

Mã:
[B]Public Function Hgwordv(Numv)[/B]
[COLOR="Blue"]'Ham doi so ra chu voi tien Vietnam[/COLOR]
 Dim solev, sotienv, nhomv, trv, hangtrv, hangchv, hangdvv, chuv, s1v, s2v, s3v As String
 Dim iv, s11v, s22v, s33v, sl1v, sl2v, scv As Integer
 Dim hangv, ngangv, countv, count1v, count2v
 countv = Array(" ", "one ", "two ", "three ", "four ", "five ", "six ", "seven ", "eight ", "nine ")
 count1v = Array("ten ", "eleven ", "twelve ", "thirteen  ", "fourteen ", "fifteen ", "sixteen ", "seventeen ", "eighteen ", "nineteen ")
 count2v = Array("twenty ", "thirty ", "forty ", "fifty ", "sixty ", "seventy ", "eighty ", "ninety ")
nganv = Array(" ", "trillion, ", "billion, ", "million, ", "thousand, ", " ")
 If Numv = 0 Then
    chuv = ""
 Else
    If Abs(Numv) >= 1E+15 Then
        chuv = "Input smaller number"
    Else
        chuv = ""
        If Numv < 0 Then
             chuv = "Minus"
        End If
    End If
    sotienv = Format(Abs(Numv), "################0.00")
    sotienv = Right(Space(15) & sotienv, 18)
    For iv = 1 To 5
        nhomv = Mid(sotienv, iv * 3 - 2, 3)
        If nhomv <> Space(3) And nhomv <> "000" Then
            hangtrv = "":            hangchv = ""
            hangdvv = ""
            s1v = Left(nhomv, 1):            s2v = Mid(nhomv, 2, 1)
            s3v = Right(nhomv, 1):            s11v = Val(s1v)
            s22v = Val(s2v):                      s33v = Val(s3v)
            hangtrv = countv(s11v)
            If s11v <> 0 And s22v + s33v <> 0 Then
                trv = "hundred and "
            Else
                If s11v <> 0 And s22v + s33v = 0 Then
                    trv = "hundred"
                Else
                     trv = " "
            End If:                       End If
            If s2v < "2" Then
                 hangchv = ""
            Else
                  hangchv = count2v(s22v - 2)
            End If
            If s2v <> "1" Then
                  hangdvv = countv(s33v)
            Else
                   hangdvv = count1v(s33v)
            End If
             scv = Val(Mid(sotienv, 14, 3))
            If scv = 0 And iv = 4 Then
                  nganv(iv) = "thousand "
            End If
                  chuv = chuv & hangtrv & trv & hangchv & hangdvv & nganv(iv)
            End If
    Next iv
 End If
 sl1v = Val(Mid(sotienv, 17, 1))
 sl2v = Val(Mid(sotienv, 18, 1))

 If sl1v = 0 And sl2v = 0 Then
    solev = "only."
 End If

 Hgwordv = "Dong " & chuv & solev
[B]End Function[/B]

PHP:
Public Function Hgwordy(Numy)
 'Ham doi so ra chu voi tien Yen'
 Dim soley, sotieny, nhomy, try, hangtry, hangchy, hangdvy, chuy, s1y, s2y, s3y As String
 Dim iy, s11y, s22y, s33y, sl1y, sl2y, scy As Integer
 Dim hangy, ngangy, county, count1y, count2y
 county = Array(" ", "one ", "two ", "three ", "four ", "five ", "six ", "seven ", "eight ", "nine ")
 count1y = Array("ten ", "eleven ", "twelve ", "thirteen  ", "fourteen ", "fifteen ", "sixteen ", "seventeen ", "eighteen ", "nineteen ")
 count2y = Array("twenty ", "thirty ", "forty ", "fifty ", "sixty ", "seventy ", "eighty ", "ninety ")
 ngany = Array(" ", "trillion, ", "billion, ", "million, ", "thousand, ", " ")
 If Numy = 0 Then
    chuy = ""
 Else
    If Abs(Numy) >= 1E+15 Then
         chuy = "Input smaller number"
    Else
         chu = ""
         If Numy < 0 Then
             chuy = "Minus"
         End If
    End If
    sotieny = Format(Abs(Numy), "################0.00")
    sotieny = Right(Space(15) & sotieny, 18)
    For iy = 1 To 5
        nhomy = Mid(sotieny, iy * 3 - 2, 3)
        If nhomy <> Space(3) And nhomy <> "000" Then
            hangtry = "":                         hangchy = ""
            hangdvy = ""
            s1y = Left(nhomy, 1):             s2y = Mid(nhomy, 2, 1)
            s3y = Right(nhomy, 1):            s11y = Val(s1y)
            s22y = Val(s2y):                     s33y = Val(s3y)
            hangtry = county(s11y)
            If s11y <> 0 And s22y + s33y <> 0 Then
                 try = "hundred and "
            Else
                 If s11y <> 0 And s22y + s33y = 0 Then
                     try = "hundred"
                 Else
                     try = " "
            End If:                            End If
            If s2y < "2" Then
                 hangchy = ""
            Else
                 hangchy = count2y(s22y - 2)
            End If
            If s2y <> "1" Then
                 hangdvy = county(s33y)
            Else
                 hangdvy = count1y(s33y)
            End If
            scy = Val(Mid(sotieny, 14, 3))
            If scy = 0 And iy = 4 Then
                  ngany(iy) = "thousand "
            End If
            chuy = chuy & hangtry & try & hangchy & hangdvy & ngany(iy)
        End If
    Next iy
 End If
 sl1y = Val(Mid(sotieny, 17, 1))
 sl2y = Val(Mid(sotieny, 18, 1))
 If sl1y = 0 And sl2y = 0 Then
      soley = "only."
 End If

 Hgwordy = "Yen " & chuy & soley
End Function
'L.V.Hưng
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Dây là 3 hàm đổi chữ ra số của các loại tiền Đô, VND, Yên. Em viết hơi lủng củng các bác tham khảo và tư vấn nhé (em cũng mới tiếp cận với VBA, nên còn gà lắm)

Thực ra 3 function của bạn cũng chỉ là 1; khác nhau mỗi đoạn cuối.
Bạn gộp chung lại, cho thêm 1 tham số nữa để nhận diện loại nào thế là gom được cái đuôi.)(&&@@)(&&@@

@$@!^%
 
Upvote 0
Chào các anh/chị, em đã đọc bài chuyển đổi số thành chữ nhưng không biết phải làm sao các anh chị chỉ giúp em với.Em muốn diễn giải số tiền bằng số trong file đính kèm thành chữ , giúp với !-=.,,:cc_confused:

Em cảm ơn anh, nhưng anh có thể gửi cho em file khác không ? vì file đó em mở không đươc ?_+)(9
 

File đính kèm

  • DNTT.xls
    14 KB · Đọc: 792
Upvote 0
Chào các anh/chị, em đã đọc bài chuyển đổi số thành chữ nhưng không biết phải làm sao các anh chị chỉ giúp em với.Em muốn diễn giải số tiền bằng số trong file đính kèm thành chữ , giúp với !-=.,,:cc_confused:
Đề 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é!

Em cảm ơn anh, nhưng anh có thể gửi cho em file khác không ? vì file đó em mở không đươc ?_+)(9
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á!
:-=
 

File đính kèm

  • ChuHoaThuong.rar
    10.7 KB · Đọc: 1,195
Upvote 0
các bác ơi em làm theo các bác nhưng sao không có được. bác nào chỉ giúp em với. Thanks!
 
Upvote 0
các bácơi!
mình cần 1 hàm đọc số tiền ra chữ trong tiếng anh.
ví dụ : 100usd---->usd....chữ.
cám ơn.
và các thêm hàm vào
 
Upvote 0
các bác ơi em làm theo các bác nhưng sao không có được. bác nào chỉ giúp em với. Thanks!

Bạn làm theo các bác là làm theo bác nào? Không được là không được làm sao? Bạn phải nói rõ thì mọi người mới biết mà hướng dẫn chứ!

Nguyên văn bởi: quangsaiga
các bácơi!
mình cần 1 hàm đọc số tiền ra chữ trong tiếng anh.
ví dụ : 100usd---->usd....chữ.
cám ơn.
và các thêm hàm vào
Bạn chịu khó đọc kỹ các bài trong topic này xem. Mọi người đã hướng dẫn rõ lắm rồi mà.
 
Upvote 0
các bác ơi!!
mình chép cai này docso.zip vào và làm như sau:

- mình vào tools/ Add-In ---> browse----> dia chi file ---> ok
sau buoc ke tiep
- mình thoát ra ngoài vào lại
gõ thử 1 số : 123----> =docso(123) ----> chuong trinh doc khong duoc.
các bác chỉ giúp mình với.
mình cám ơn
 
Upvote 0
cái này tớ dùng ở EX 2003 thì được nhưng 2007 thì bị báo lỗi, có ai dùng được ở 2007 không ?
 
Upvote 0
Vấn đề này đã có rất nhiều người làm với nhiều thuật toán khác nhau. Mình xin đưa ra một cách mới như sau, cách này xây dựng hàm, không phải Add-In. Các bạn xem thử có đúng không nhé.
 

File đính kèm

  • DocSo.xls
    31 KB · Đọc: 1,344
Upvote 0
Hello everybody! Em là new member. Em cũng tự viết 1 hàm chyển đổi số sang chữ, em dân tin, ko phải dân tài chính nên ko rõ các quy định đọc số thành chữ lắm, mong mọi người cho ý kiến. Mới chỉ dừng lại ở việc đọc từ số sang chữ tiếng Việt, có đọc số thập phân.

Tiện thể hỏi các bác số này đọc thế nào: 1001 là một nghìn linh một hay một nghìn không trăm linh một?
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom