Giúp em một tí, hàm đọc số ra chữ

Liên hệ QC

soonwi

Thành viên mới
Tham gia
29/4/09
Bài viết
23
Được thích
2
Em lấy cái VBA đọc số ra chữ trên diễn đàn về dùng và giờ sửa lại để đọc tiền USD nhưng đọc bằng tiếng Việt. (Ví dụ: 1.200.000 thì đọc là: Một triệu, hai trăm ngàn đô la Mỹ). VBA này em sửa từ VBA đọc tiền tiếng việt, nhưng vì quản lý tiền USD người ta quản lý đến cả cent mà VBA này nó toàn làm tròn số nên dù đằng sau dấu phẩy có số thì nó vẫn không đọc thêm cent được. Vậy em nhờ các anh sửa hộ em để khi em có số 1.200,5 thì nó đọc cho em là Một ngàn hai trăm đô la Mỹ và năm mươi cent hoặc 1.200,05 thì nó đọc cho em là Một ngàn hai trăm đô la Mỹ và năm cent. Em cảm ơn rất nhiều. Sau đây là đoạn code VBA:

Mã:
Public Function VND_US(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
VND_US = ""
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
VND_US = "kh«ng" 'Else VND_US = dau & Trim(docso)
Else: docso = Trim(docso): VND_US = dau & UCase(Left(docso, 1)) + Right(docso, Len(docso) - 1): End If
Else
VND_US = conso
End If
VND_US = VND_US & " ®« la Mü"
VND_US = Replace(VND_US, ", ®« la Mü", " ®« la Mü")
End Function
 
Bạn hãy nghiên cứu bài này: http://www.giaiphapexcel.com/forum/showthread.php?t=1047
Trong đó, ở bài gần cuối, tôi có đề cập đến vấn đề bạn nêu ở trên.
Em muốn có cả 3 loại đọc số trong Excel để khi sử dụng bất cứ cách đọc nào cũng không cần sửa lại trong AcchelperOptions.exe
Em cũng đã sử dụng qua cái đó của bác nhưng nó chỉ có đọc kiểu
Cho tiếng anh: Twelve thousand three hundred and forty five dollars and fifty three cents.
Cho tiếng Việt: Mười hai ngàn ba trăm bốn mươi lăm đồng và năm mươi ba xu.
Vấn đề của em đang cần là:
Mười hai ngàn ba trăm bốn mươi lăm đô la Mỹ và năm mươi ba cent.
Dù sao cũng cảm ơn bác
 
Lần chỉnh sửa cuối:
Em muốn có cả 3 loại đọc số trong Excel để khi sử dụng bất cứ cách đọc nào cũng không cần sửa lại trong AcchelperOptions.exe
Em cũng đã sử dụng qua cái đó của bác nhưng nó chỉ có đọc kiểu
Cho tiếng anh: Twelve thousand three hundred and forty five dollars and fifty three cents.
Cho tiếng Việt: Mười hai ngàn ba trăm bốn mươi lăm đồng và năm mươi ba xu.
Vấn đề của em đang cần là:
Mười hai ngàn ba trăm bốn mươi lăm đô la Mỹ và năm mươi ba cent.
Dù sao cũng cảm ơn bác

Cái đó thì dễ mà, bạn có thể sửa lại code nơi bạn cần sửa.
 
Em muốn có cả 3 loại đọc số trong Excel để khi sử dụng bất cứ cách đọc nào cũng không cần sửa lại trong AcchelperOptions.exe
Em cũng đã sử dụng qua cái đó của bác nhưng nó chỉ có đọc kiểu
Cho tiếng anh: Twelve thousand three hundred and forty five dollars and fifty three cents.
Cho tiếng Việt: Mười hai ngàn ba trăm bốn mươi lăm đồng và năm mươi ba xu.
Vấn đề của em đang cần là:
Mười hai ngàn ba trăm bốn mươi lăm đô la Mỹ và năm mươi ba cent.
Dù sao cũng cảm ơn bác

Dùng UDF này thử xem.
PHP:
Function DocSo(Number, Font) As String
Dim MyArray, tam
Dim Str As String, Str1 As String
Str = Format(Fix(Abs(Number)), "000000000000000000")
Select Case Font
    Case 1
    MyArray = Array("không ", "m" & ChrW(7897) & "t ", "hai ", "ba ", "b" & ChrW(7889) & "n ", "n" & ChrW(259) & "m ", "sáu ", "b" & ChrW(7843) & "y ", "tám ", "chín ", "tri" & ChrW(7879) & "u, ", "ngàn, ", "t" & ChrW(7927) & ", ", "tri" & ChrW(7879) & "u, ", "ngàn, ", "", "tr" & ChrW(259) & "m ", "m" & ChrW(432) & ChrW(417) & "i ", "không " & "m" & ChrW(432) & ChrW(417) & "i" & " không ", "không " & "m" & ChrW(432) & ChrW(417) & "i", "l" & ChrW(7867), "m" & ChrW(432) & ChrW(417) & "i" & " không", "m" & ChrW(432) & ChrW(417) & "i", "m" & ChrW(432) & ChrW(417) & "i" & " n" & ChrW(259) & "m", "m" & ChrW(432) & ChrW(417) & "i" & " l" & ChrW(259) & "m", "m" & ChrW(7897) & "t " & "m" & ChrW(432) & ChrW(417) & "i", "m" & ChrW(432) & ChrW(7901) & "i", "m" & ChrW(432) & ChrW(417) & "i" & " m" & ChrW(7897) & "t", "m" & ChrW(432) & ChrW(417) & "i" & " m" & ChrW(7889) & "t", "Âm ", ChrW(273) & "ô la M" & ChrW(7929) & " ", "và ", "cent ")
    Case 2
    MyArray = Array("khoâng ", "moät ", "hai ", "ba ", "boán ", "naêm ", "saùu ", "baûy ", "taùm ", "chín ", "trieäu, ", "ngaøn, ", "tyû, ", "trieäu, ", "ngaøn, ", "", "traêm ", "möôi ", "khoâng möôi khoâng ", "khoâng möôi", "leû", "möôi khoâng", "möôi", "möôi naêm", "möôi laêm", "moät möôi", "möôøi", "möôi moät", "möôi moát", "AÂm ", "ñoâ la Myõ ", "vaø ", "cent ")
    Case 3
    MyArray = Array("kh«ng ", "mét ", "hai ", "ba ", "bèn ", "n¨m ", "s¸u ", "b¶y ", "t¸m ", "chÝn ", "triÖu, ", "ngµn, ", "tû, ", "triÖu, ", "ngµn, ", "", "tr¨m ", "m­¬i ", "kh«ng m­¬i kh«ng ", "kh«ng m­¬i", "lÎ", "m­¬i kh«ng", "m­¬i", "m­¬i n¨m", "m­¬i l¨m", "mét m­¬i", "m­êi", "m­¬i mét", "m­¬i mèt", "¢m ", "®« la Mü ", "vµ ", "cent ")
End Select
If Number = 0 Then
    DocSo = MyArray(0)
    Else
    DocSo = ""
End If
For I = 1 To Len(Str)
    If Left(Str, I) <> 0 And Mid(Str, (Int((I + 2) / 3) - 1) * 3 + 1, 3) <> 0 Then
        DocSo = DocSo & MyArray(Mid(Str, I, 1)) & MyArray(-(9 + I / 3) * (I Mod 3 = 0) - (15 + I Mod 3) * (I Mod 3 <> 0))
    ElseIf I = 9 And Mid(Str, 7, 3) = 0 And Left(Str, 6) <> 0 Then
        DocSo = DocSo & MyArray(12)
    End If
Next
DocSo = IIf(Number = 0, MyArray(0) & MyArray(30), "") & IIf(Fix(Number) <> 0, DocSo & MyArray(30), "") & IIf(Fix(Number) <> 0 And Fix(Number) <> Number, MyArray(31), "") & IIf(Fix(Number) <> Number, IIf(Abs(Number - Fix(Number)) < 0.1, "", MyArray(Left(Right(Format(Abs(Number), "#.00"), 2), 1)) & MyArray(17)) & MyArray(Right(Format(Number, "#.00"), 1)) & MyArray(32), "")
DocSo = Trim(Replace(Replace(Replace(Replace(Replace(Replace(Replace(DocSo, MyArray(18), MyArray(15)), MyArray(19), MyArray(20)), MyArray(21), MyArray(22)), MyArray(23), MyArray(24)), MyArray(25), MyArray(26)), MyArray(27), MyArray(28)), ", " & MyArray(30), " " & MyArray(30)))
If Number < 0 Then
    DocSo = MyArray(29) & DocSo
End If
DocSo = UCase(Left(DocSo, 1)) & Mid(DocSo, 2) & "."
End Function
Cú pháp:
=Docso(Number,Font)
Number: Số cần đọc
Font: Lựa chọn bảng mã cho Font chữ. Có 3 tùy chọn:
Font = 1: Mã Unicode
Font = 2: Mã VNI Windowns
Font = 3: Mã TCVN3 (ABC)
 
Cái đó thì dễ mà, bạn có thể sửa lại code nơi bạn cần sửa.
Híc tui mà biết chỗ nào cần sửa thì tui đâu có hỏi. Tui đã nói rồi VBA này tui lấy từ diễn đàn về chứ đâu phải do tui viết ra mà. Mấy bác trả lời chán quá, tui hỏi rõ ràng thế mà các bạn cứ rào trước đón sau
 
Híc tui mà biết chỗ nào cần sửa thì tui đâu có hỏi. Tui đã nói rồi VBA này tui lấy từ diễn đàn về chứ đâu phải do tui viết ra mà. Mấy bác trả lời chán quá, tui hỏi rõ ràng thế mà các bạn cứ rào trước đón sau
Mục đích là muốn bạn tự làm, tự chỉnh và tự rút kinh nghiệm ---> Cũng là lợi cho bản thân bạn thôi ---> Đây chính là mục đích chính của diển đàn
GPE là nơi trao đổi học hỏi, tôi nghĩ nó không phải là SIÊU THỊ để mổi khi cần thì vào mua hàng
Đúng không?
 
Híc tui mà biết chỗ nào cần sửa thì tui đâu có hỏi. Tui đã nói rồi VBA này tui lấy từ diễn đàn về chứ đâu phải do tui viết ra mà. Mấy bác trả lời chán quá, tui hỏi rõ ràng thế mà các bạn cứ rào trước đón sau
Ý bạn là phải sửa lại chính cái UDF mà bạn gửi lên hả? Nếu vậy thì bạn quay lại topic mà bạn lấy UDF này và hỏi người tạo ra nó. Sẽ đơn giản hơn so với việc một người khác, phải đọc hiểu toàn bộ code mới sửa được.
 
Bạn thử đoạn code này , tôi cũng lấy từ diễn đàn , đã sửa , dùng font VNI-Time


Public Function Dola(SoTienMuonDich)
Dim KetQua, SoTien, Nhom, Chu, Dich, S1, S2, S3 As String
Dim I, J, Vitri As Byte, S As Double
Dim Hang, Doc, Dem
If SoTienMuonDich = 0 Then
KetQua = "Khoâng ñoâ la "
Else
If Abs(SoTienMuonDich) >= 1E+15 Then
KetQua = "Soá quaù lôùn"
Else
If SoTienMuonDich < 0 Then
KetQua = "Tröø" & Space(1)
Else
KetQua = Space(0)
End If
SoTien = Format(Abs(SoTienMuonDich), "##############0.00")
SoTien = Right(Space(15) & SoTien, 18)
Hang = Array("None", "traêm", "möôi", "gì ñoù")
Doc = Array("None", "nghìn tyû", "tyû", "trieäu", "nghìn", "ñoâ la Myõ", "cent")
Dem = Array("None", "moät", "hai", "ba", "boán", "naêm", "saùu", "baûy", "taùm", "chín")
For I = 1 To 6
Nhom = Mid(SoTien, I * 3 - 2, 3)
If Nhom <> Space(3) Then
Select Case Nhom
Case "000"
If I = 5 Then
Chu = "ñoâ la Myõ" & Space(1)
Else
Chu = Space(0)
End If
Case ".00", ",00"
Chu = ""
Case Else
S1 = Left(Nhom, 1)
S2 = Mid(Nhom, 2, 1)
S3 = Right(Nhom, 1)
Chu = Space(0)
Hang(3) = Doc(I)
For J = 1 To 3
Dich = Space(0)
S = Val(Mid(Nhom, J, 1))
If S > 0 Then
Dich = Dem(S) & Space(1) & Hang(J) & Space(1)
End If
Select Case J
Case 2 And S = 1
Dich = "möôøi" & Space(1)
Case 3 And S = 0 And Nhom <> Space(2) & "0"
Dich = Hang(J) & Space(1)
Case 3 And S = 5 And S2 <> Space(1) And S2 <> "0"
Dich = "l" & Mid(Dich, 2)
Case 2 And S = 0 And S3 <> "0"
If (S1 >= "1" And S1 <= "9") Or (S1 = "0" And I = 4) Then
Dich = "leû" & Space(1)
End If
End Select
Chu = Chu & Dich
Next J
End Select
Vitri = InStr(1, Chu, "möôi moät", 1)
If Vitri > 0 Then Mid(Chu, Vitri, 9) = "möôi moát"
KetQua = KetQua & Chu
End If
Next I
End If
End If
Dola = UCase(Left(KetQua, 1)) & Mid(KetQua, 2)
End Function
 
Tôi gửi cho bạn file này xem có dùng được không? File tôi tự viết bằng các hàm sẵn có trong Excel. Bạn đánh số nhỏ hơn 999.999.999.999 vào các ô trong cột A nhé.
 
Bạn thử đoạn code này , tôi cũng lấy từ diễn đàn , đã sửa , dùng font VNI-Time
Cảm ơn bạn nhưng code này vẫn không chuẩn, ví dụ:
505.034.534 nó đọc là: Năm trăm lẻ năm triệu ba mươi bốn nghìn năm trăm ba mươi bốn đô la Mỹ. Lẽ ra nó phải đọc là:
Năm trăm lẻ năm triệu không trăm ba mươi bốn nghìn năm trăm ba mươi bốn đô la Mỹ. Và còn một điều nữa là không có dấu ngăn cách các đơn vị như
Năm trăm lẻ năm triệu, không trăm ba mươi bốn nghìn, năm trăm ba mươi bốn đô la Mỹ
 
Chỉnh sửa lần cuối bởi điều hành viên:
Web KT
Back
Top Bottom