Hàm chuyển số thành chữ - làm sao bỏ chữ USD sau cùng ? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

vuyenthao

Thành viên mới
Tham gia
10/9/07
Bài viết
39
Được thích
1
Chào các bạn. Mình copy code này trên mạng lâu rồi, nên không nhớ rõ tác giả. Mình thấy hàm này rất hay, nhưng lại có 2 khuyết điểm (theo mình) nhờ các bạn khắc phục:
- Bỏ từ USD sau cùng ?
- Thêm dấu phân cách (dấu phẩy) ở phần chữ (VD phần số là 1,900) ?

Vậy rất mong các bạn xa gần quan tâm giúp đỡ. Bên dưới là nội dung code
Mã:
[FONT=Times New Roman][SIZE=3]Public Function USD(AMT)[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]Dim ToRead, Chuoi, Nhom, Word As String[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]Dim I, J As Byte, W, X, Y, Z As Double[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]Dim Donvi, Hchuc, Khung[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]If AMT = 0 Then[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]    ToRead = "None"[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]Else[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]    Donvi = Array("None", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen")[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    Hchuc = Array("None", "None", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety")[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    Khung = Array("None", "trillion", "billion", "million", "thousand", "USD", "")[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]If AMT < 0 Then[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]    ToRead = "Minus" & Space(1)[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]Else[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]    ToRead = Space(0)[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]End If[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]Chuoi = Format(Abs(AMT), "###############.00") '18 digit with 2 decimal places[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]Chuoi = Right(Space(15) & Chuoi, 18)[/SIZE][/FONT]

[FONT=Times New Roman][SIZE=3]For I = 1 To 6[/SIZE][/FONT]
[SIZE=3][FONT=Times New Roman]    Nhom = Mid(Chuoi, I * 3 - 2, 3)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    If Nhom <> Space(3) Then[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]        Select Case Nhom[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]        Case "000"[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]            If I = 5 And Abs(AMT) > 1 Then[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                Word = "USD" & Space(1)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]            Else[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                Word = Space(0)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]            End If[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]        Case ".00"[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                Word = "only."[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]        Case Else[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]            X = Val(Left(Nhom, 1))[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]            Y = Val(Mid(Nhom, 2, 1))[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]            Z = Val(Right(Nhom, 1))[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]            W = Val(Right(Nhom, 2))[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]            If X = 0 Then[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                Word = Space(0)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]            Else[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                Word = Donvi(X) & Space(1) & "hundred" & Space(1)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                If W > 0 And W < 21 Then[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                    Word = Word & "and" & Space(1)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                End If[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]            End If[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                If W < 20 And W > 0 Then[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                    Word = Word & Donvi(W) & Space(1)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                Else[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                If W >= 20 Then[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                    Word = Word & Hchuc(Y) & Space(1)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                If Z > 0 Then[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                    Word = Word & Donvi(Z) & Space(1)[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]                End If[/FONT][/SIZE]

[SIZE=3][FONT=Times New Roman]            End If[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]        End If[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]            Word = Word & Khung(I) & Space(1)[/FONT][/SIZE]

[SIZE=3][FONT=Times New Roman]        End Select[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]             ToRead = ToRead & Word[/FONT][/SIZE]
[SIZE=3][FONT=Times New Roman]    End If[/FONT][/SIZE]
[FONT=Times New Roman][SIZE=3]Next I[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]End If[/SIZE][/FONT]
[FONT=Times New Roman][SIZE=3]USD = UCase(Left(ToRead, 1)) & Mid(ToRead, 2)[/SIZE][/FONT]

[FONT=Times New Roman][SIZE=3]End Function
[/SIZE][/FONT]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Mình chỉ sửa lại mốt chút chỗ USD và thêm từ Cent
Mã:
Public Function USD(AMT)
Dim ToRead, Chuoi, Nhom, Word As String
Dim I, J As Byte, W, X, Y, Z As Double
Dim Donvi, Hchuc, Khung
If AMT = 0 Then
ToRead = "None"
Else
Donvi = Array("None", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen")
Hchuc = Array("None", "None", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety")
Khung = Array("None", "trillion", "billion", "million", "thousand", "", "cent")
If AMT < 0 Then
ToRead = "Minus" & Space(1)
Else
ToRead = Space(0)
End If
Chuoi = Format(Abs(AMT), "###############.00") '18 digit with 2 decimal places
Chuoi = Right(Space(15) & Chuoi, 18)

For I = 1 To 6
Nhom = Mid(Chuoi, I * 3 - 2, 3)
If Nhom <> Space(3) Then
Select Case Nhom
Case "000"
If I = 5 And Abs(AMT) > 1 Then
Word = "" & Space(1)
Else
Word = Space(0)
End If
Case ".00"
Word = "only."
Case Else
X = Val(Left(Nhom, 1))
Y = Val(Mid(Nhom, 2, 1))
Z = Val(Right(Nhom, 1))
W = Val(Right(Nhom, 2))
If X = 0 Then
Word = Space(0)
Else
Word = Donvi(X) & Space(1) & "hundred" & Space(1)
If W > 0 And W < 21 Then
Word = Word & "and" & Space(1)
End If
End If
If W < 20 And W > 0 Then
Word = Word & Donvi(W) & Space(1)
Else
If W >= 20 Then
Word = Word & Hchuc(Y) & Space(1)
If Z > 0 Then
Word = Word & Donvi(Z) & Space(1)
End If

End If
End If
Word = Word & Khung(I) & Space(1)

End Select
ToRead = ToRead & Word
End If
Next I
End If
USD = UCase(Left(ToRead, 1)) & Mid(ToRead, 2)

End Function
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cám ơn bạn. Ý mình hỏi là không có từ USD phía sau và dĩ nhiên là cả từ cent. Ngoài ra, nếu tiếng Anh 'chuẩn" thì sau hàng chục và hàng đơn vị (như 90 là ninety-one) phải có gạch nối. Vậy thì phải sửa lại ra sao ? Tóm lại là 3 vấn đề :
- Bỏ từ USD, cent
- có dấu phân cách
- có gạch nối

Rất mong các bạn xem và giúp đỡ. Thanks
 
Mình bổ xung code Matmotmi:
Mã:
Public Function USD(AMT)
Dim ToRead, Chuoi, Nhom, Word As String
Dim I, J As Byte, W, X, Y, Z As Double
Dim Donvi, Hchuc, Khung
If AMT = 0 Then
ToRead = "None"
Else
Donvi = Array("None", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen")
Hchuc = Array("None", "None", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety")
Khung = Array("None", "trillion[COLOR=Red],[/COLOR]", "billion[COLOR=Red],[/COLOR]", "million[COLOR=Red],[/COLOR]", "thousand[COLOR=Red],[/COLOR]", "", [COLOR=Red]""[/COLOR])
If AMT < 0 Then
ToRead = "Minus" & Space(1)
Else
ToRead = Space(0)
End If
Chuoi = Format(Abs(AMT), "###############.00") '18 digit with 2 decimal places
Chuoi = Right(Space(15) & Chuoi, 18)

For I = 1 To 6
Nhom = Mid(Chuoi, I * 3 - 2, 3)
If Nhom <> Space(3) Then
Select Case Nhom
Case "000"
If I = 5 And Abs(AMT) > 1 Then
Word = "" & Space(1)
Else
Word = Space(0)
End If
Case ".00"
Word = "only."
Case Else
X = Val(Left(Nhom, 1))
Y = Val(Mid(Nhom, 2, 1))
Z = Val(Right(Nhom, 1))
W = Val(Right(Nhom, 2))
If X = 0 Then
Word = Space(0)
Else
Word = Donvi(X) & Space(1) & "hundred" & Space(1)
If W > 0 And W < 21 Then
Word = Word & "and" & Space(1)
End If
End If
If W < 20 And W > 0 Then
Word = Word & Donvi(W) & Space(1)
Else
If W >= 20 Then
Word = Word & Hchuc(Y) [COLOR=Red]& "-" 'Space(1)[/COLOR]
If Z > 0 Then
Word = Word & Donvi(Z) & Space(1)
End If

End If
End If
Word = Word & Khung(I) & Space(1)

End Select
ToRead = ToRead & Word
End If
Next I
End If
USD = UCase(Left(ToRead, 1)) & Mid(ToRead, 2)

End Function
Code trên phải thêm đoạn cắt dấu phảy khi tròn số
 
Lần chỉnh sửa cuối:
Cám ơn bạn Sealand. OK rồi. Do nhu cầu, mình phải gõ thêm &"Vietnam dong.". Nếu có thể, phiền bạn bổ sung thêm Vietnam dong. (có dấu chấm cuối cùng) để đỡ phải gõ thêm phần &.... Cám ơn bạn.

Ngoài ra, mình muốn lưu macro này để dùng cho mọi file Excel thì không được (mình dùng Excel 2007) mà chỉ dùng được cho book1 - Trong hộp thoại Macro, chỉ có 3 dòng là Book1, All open workbook và This workbook, chứ không có ...template workbook.... như Excel 2003/XP). Mong các bạn cho "mẹo" khắc phục. Thanks
 
Chỉnh sửa lần cuối bởi điều hành viên:
Ngoài ra, mình muốn lưu macro này để dùng cho mọi file Excel thì không được (mình dùng Excel 2007) mà chỉ dùng được cho book1 - Trong hộp thoại Macro, chỉ có 3 dòng là Book1, All open workbook và This workbook, chứ không có ...template workbook.... như Excel 2003/XP). Mong các bạn cho "mẹo" khắc phục. Thanks

Bạn nên viết code trên đặt vào trong Module và lưu lại dưới dạng *.xla (add-Ins của excel)
Sau đó mở file excel bất kỳ lên và chọn Tool/Add-Ins/ Browse để chọn file Add-Ins này. Kể từ giờ khi mở excel lên, bất kỳ file nào cũng có thể xài hàm mà bạn vừa tạo ra này.

Các anh chị nào xài excel 2007 xin chỉ giúp, em không nhớ thêm add-Ins trong excel 2007 phải vào đâu (máy em đang sử dụng không có excel 2007).
 
Cám ơn bạn Ca_dafi. Mình đã làm OK rồi, nhưng phần "Do nhu cầu, mình phải gõ thêm &"Vietnam dong.". Nếu có thể, phiền bạn bổ sung thêm Vietnam dong. (có dấu chấm cuối cùng) để đỡ phải gõ thêm phần &.... Cám ơn bạn." mình vẫn chờ bạn và các bạn khác xem và giúp đỡ.
 
Bạn co thể cho VD cụ thể được không? Hàm USD hay hàm VND. Nếu là hàm USD thì thêm chữ Vietnam dong vào sau kết quả hàm trả về hả? Nói tóm lại bạn đưa ra VD cụ thể đi, nói chung chung quá!!!
 
Cám ơn bạn. Ví dụ : 1,352 VND thì "dịch" là : One thousand, three hundred fifty-two Vietnam dong.
 
Cám ơn bạn. Ví dụ : 1,352 VND thì "dịch" là : One thousand, three hundred fifty-two Vietnam dong.
Thì bạn thêm vào câu sau ở dòng gần cuối function USD là
PHP:
USD=UCase(Left(ToRead, 1)) & Mid(ToRead, 2)
End Function
Thành
USD=UCase(Left(ToRead, 1)) & Mid(ToRead, 2)&"Vietnam dong."
End Function

Hay là bạn thay trong UDF mà Sealand sửa tại chỗ
Word = "only."

Word = "Vietnam dong."
 
Cám ơn các bạn đã quan tâm giúp đỡ.

Chào bạn Thunghi. Mình thực hiện theo 2 cách của bạn thì :
- Cách 1 : OK, nhưng vẫn còn 2 vấn đề nhỏ là sau khi kích hoạt (đánh dấu chọn và khởi động Excel) thì Excel báo "this workbook contains links to other data sources" và kết quả có 1 khoảng cách rồi mới đến Vietnam dong. VD :
Six hundred fifty-six thousand, six hundred sixty-six Vietnam dong. (656666).
- Cách 2 : sao không được (thay thế rồi, nhưng vẫn không hiển thị được dòng chữ thay thế đó) ?
Vậy rất mong bạn xem xét giúp. Thanks
 
Chỉnh sửa lần cuối bởi điều hành viên:
Bạn sửa như sau là được

Mã:
Public Function USD(AMT)
Dim ToRead, Chuoi, Nhom, Word As String
Dim I, J As Byte, W, X, Y, Z As Double
Dim Donvi, Hchuc, Khung
If AMT = 0 Then
ToRead = "None"
Else
Donvi = Array("None", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen")
Hchuc = Array("None", "None", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety")
Khung = Array("None", "trillion,", "billion,", "million,", "thousand,", [B][COLOR=SandyBrown]"Vietnam dong."[/COLOR][/B], "")
If AMT < 0 Then
ToRead = "Minus" & Space(1)
Else
ToRead = Space(0)
End If
Chuoi = Format(Abs(AMT), "###############.00") '18 digit with 2 decimal places
Chuoi = Right(Space(15) & Chuoi, 18)

For I = 1 To 6
Nhom = Mid(Chuoi, I * 3 - 2, 3)
If Nhom <> Space(3) Then
Select Case Nhom
Case "000"
If I = 5 And Abs(AMT) > 1 Then
Word = "" & Space(1)
Else
Word = Space(0)
End If
Case ".00"
Word = [B][COLOR=Blue]Space(0)[/COLOR][/B]
Case Else
X = Val(Left(Nhom, 1))
Y = Val(Mid(Nhom, 2, 1))
Z = Val(Right(Nhom, 1))
W = Val(Right(Nhom, 2))
If X = 0 Then
Word = Space(0)
Else
Word = Donvi(X) & Space(1) & "hundred" & Space(1)
If W > 0 And W < 21 Then
Word = Word & "and" & Space(1)
End If
End If
If W < 20 And W > 0 Then
Word = Word & Donvi(W) & Space(1)
Else
If W >= 20 Then
Word = Word & Hchuc(Y) & "-" [SIZE=4][COLOR=Red]'Space(1)[/COLOR][/SIZE]
If Z > 0 Then
Word = Word & Donvi(Z) [SIZE=2][COLOR=Black]& Space(1)[/COLOR][/SIZE]
End If

End If
End If
Word = Word & Khung(I) & Space(1)

End Select
ToRead = ToRead & Word
End If
Next I
End If
USD = UCase(Left(ToRead, 1)) & Mid(ToRead, 2)

End Function
Chỗ dấu màu xanh: Thay only bằng Space(0)
Chỗ màu nâu Thêm "Vietnam dong. (Nhớ gõ dấu chấm)
Chỗ dấu đỏ: Nháy đơn như trên hay xóa đi
Thực sự mình chưa dùng Excell 2007 nên không biết lưu như dạng Add-In của Exc 2003 như thế nào.
 
Lần chỉnh sửa cuối:
Cám ơn bạn Sealand. OK rồi. Tuy nhiên với phần thập phân thì lại có...problem! Phần thập phân nằm phía sau Vietnam dong. VD : Fourteen Vietnam dong. fifty- (của số 14,5) !?
 
...đọc trên báo LBVMVT số 282, trang 4 thấy có phần mềm đổi số ra chữ tiếng Việt (hỗ trợ 28 số). http://www.mediafire.com/?gn00gxvzzai Mình thấy hay nhưng hơi bất tiện là bạn phải vào Regional...đổi dấu . là thập phân, dấu phẩy là dấu phân cách hàng ngàn thì nó mới làm việc OK.
 
Cám ơn bạn Sealand. OK rồi. Tuy nhiên với phần thập phân thì lại có...problem! Phần thập phân nằm phía sau Vietnam dong. VD : Fourteen Vietnam dong. fifty- (của số 14,5) !?
Vậy ý bạn muốn đọc 14.5 là gì?
..đọc trên báo LBVMVT số 282, trang 4 thấy có phần mềm đổi số ra chữ tiếng Việt (hỗ trợ 28 số). http://www.mediafire.com/?gn00gxvzzai Mình thấy hay nhưng hơi bất tiện là bạn phải vào Regional...đổi dấu . là thập phân, dấu phẩy là dấu phân cách hàng ngàn thì nó mới làm việc OK.
Dù là gì bạn cũng phải đổi dấu à.
 
Phần Thập phân giải quyết không có vấn đề gì lắm nhưng đơn vị tiền tệ việt nam dùng trong hạch toán và báo cáo làm tròn đến đồng. Một khi đã kết xuất kết quả thì không nên để số lẻ.Mình sẽ làm động tác cắt số lẻ bằng hàm Int(), lưu ý dòng lệnh sau:

Chuoi = Format(Int(Abs(AMT)), "##############0")

Ngay trong GPE cũng có hàng loạt các code để đoc số ra chữ, nhưng mình cho đoạn code trong bài này khá ngắn gọn dễ sử lý và đã sử dụng trong 1 số phần mềm kế toán đấy. Nên nắm vững nó trước khi nghiên cứu cách khác.Ngay hàm này cũng có thể chỉnh để sửa để hỗ trợ 28 số, bạn lưu ý nghiên cưu mấy mảng, nhóm là thấy ngay phương pháp của tác giả.
 
Lần chỉnh sửa cuối:
Web KT

Bài viết mới nhất

Back
Top Bottom