Tìm thủ thuật nhanh hơn với chức năng tìm trong Blog

7/12/09

Hàm đọc số dùng mã Unicode trong Access

Do môi trường VBA chưa hỗ trợ Unicode đầy đủ nên việc thiết lập hàm đọc số tiếng Việt với mã (font) Unicode trong Access cũng như Excel có khó khăn. Bài viết này giới thiệu một cách thiết lập hàm đọc số dùng font Unicode trong Access (bạn cũng có thể áp dụng trong Excel, VB...).


Các bước thực hiện như sau:
1. Mở CSDL Access.
2. Tạo một form đặt tên là FormTam, trên FormTam tạo hai label:
LabSo, nhập chuỗi: “không một hai ba bốn năm sáu bảy tám chín mốt lẻ lăm mươi mười trăm ”, cuối chuỗi có một khoảng trắng.
LabDonvi, nhập chuỗi: “đồng. nghìn triệu tỷ”, cuối chuỗi cũng có khoảng trắng.
3. Trong Module, nhấn New để tạo mới một module với tên mặc định là Module1. Sau đó nhấn Design để vào cửa sổ soạn code và nhập đoạn mã sau:
Khai báo 2 biến toàn cục là 2 mảng chứa chuỗi ký tự số và chuỗi đơn vị được lấy từ LabSo và LabDonvi thông qua thủ tục Docchu và Docdonvi.
Public Solay(0 To 15) As String
Public Donvilay(0 To 4) As String
Private Sub Docchu() 'Lấy chuỗi chữ số từ LabSo đặt vào mảng Solay
Dim tp, Stp, ii
ii = 0: tp = Form_FormTam.LabSo.Caption
Stp = InStr(tp, “ “)
Do While Stp <> 0
Solay(ii) = Left(tp, Stp)
tp = Right(tp, Len(tp) - Stp)
1Stp = InStr(tp, “ “)
ii = ii + 1
Loop
End Sub
'''''
Private Sub Docdonvi() 'Lấy chuỗi đơn vị từ LabDonvi đặt vào mảng Donvilay
Dim tp, Stp, ii
ii = 0: tp = Form_FormTam.LabDonvi.Caption
Stp = InStr(tp, “ “)
Do While Stp <> 0
Donvilay(ii) = Left(tp, Stp)
tp = Right(tp, Len(tp) - Stp)
Stp = InStr(tp, “ “)
ii = ii + 1
Loop
End Sub

'Tạo hàm đọc số:

Public Function DocVND(Sodoc As String) As String
If Len(Sodoc) > 12 Then
DocVND = “So qua lon qua hang tram ty. Hay xem lai!”
Exit Function
End If
Sodoc = Round(Sodoc, 0)
Dim Cht As String
Dim fg0 As Boolean
Dim fg1 As Boolean
Dim So As String
Dim ch As String
Dim tp As String
Dim i As Byte
Dim dv
Dim chs
Docchu Gọi hàm đọc chữ số
chs = Solay
Docdonvi Gọi hàm đọc đơn vị
dv = Donvilay
Do While Sodoc <> “”
Cht = “”
If Len(Sodoc) <> 0 Then
If (Len(Sodoc) >= 3) Then
So = Right(Sodoc, 3)
Else
So = Right(Sodoc, Len(Sodoc))
End If
Sodoc = Left(Sodoc, Len(Sodoc) - Len(So))
If Left(So, 1) = “0” And Mid(So, 2, 1) = “0” And Right(So, 1) = “0” Then
ch = ch
Else
If Len(So) = 3 Then
If Left(So, 1) <> “ “ Then
Cht = chs(Left(So, 1)) + chs(15)
End If
So = Right(So, 2)
End If
If Len(So) = 2 Then
If Left(So, 1) = “0” Then
If Right(So, 1) <> “0” Then
Cht = Cht + chs(11)
End If
fg0 = True
Else
If Left(So, 1) = “1” Then
Cht = Cht + chs(14)
Else
Cht = Cht + chs(Left(So, 1)) + chs(13)
fg1 = True
End If
End If
So = Right(So, 1)
End If
If Right(So, 1) <> 0 Then
If Left(So, 1) = “5” And Not fg0 Then
If Len(tp) = 1 Then
Cht = Cht + chs(4)
Else
Cht = Cht + chs(12)
End If
Else
If Left(So, 1) = 1 And Not (Not fg1 Or fg0) And Cht <> “” Then
Cht = Cht + chs(10)
Else
Cht = Cht + chs(Left(So, 1))
End If
End If
End If
ch = Cht + dv(i) + ch
End If
i = i + 1
End If
Loop
If Right(Trim(ch), 1) <> “.” Then
ch = ch + dv(0)
End If
DocVND=UCase(Left(ch, 1))&Mid(ch,2)
End Function
Ở đây tôi không phân tích hàm đọc số bởi TGVT đã có bài về vấn đề này (TGVT A 3/2001, t.76; 7/2001, t.88).
4. Sử dụng hàm DocVND
Tạo một Textbox có tên là Text1, nhấn phải lên Text1 chọn Build Event, trong Choose Builder chọn Code Builder và nhấn OK. Cửa sổ Microsoft VB hiện ra, nhập đoạn code sau:
Private Sub Text1_BeforeUpdate(Cancel As Integer)
Ketqua.Caption = DocVND(Text1.Text)
End Sub
Mở form, nhập vào các con số và gõ Enter, bạn sẽ có kết quả như hình. Mã nguồn chương trình có thể tải về tại website của TGVT – PCW VN.

DownLoad Demo

-------------------------------------
Trên đây là bài mình đăng nguyên văn từ báo PC-Word. Mình cũng xin góp ý với chương trình này : Thay vì làm bước:

2. Tạo một form đặt tên là FormTam, trên FormTam tạo hai label:
LabSo, nhập chuỗi: “không một hai ba bốn năm sáu bảy tám chín mốt lẻ lăm mươi mười trăm ”, cuối chuỗi có một khoảng trắng.
LabDonvi, nhập chuỗi: “đồng. nghìn triệu tỷ”, cuối chuỗi cũng có khoảng trắng.
 Ta có thể thay bằng cách tạo 1 table và lưu các giá trị trên vào. Sau đó gọi ra bằng 1 biến chuỗi hoặc hàm Dlookup tùy ý. Như vậy, ta có thể gọi hàm đọc số bất cứ đâu mà không cần tạo formTam

9 nhận xét:

  1. Nặc danh00:53 25/1/10

    sao không có đọc usd,vd 100usd.đọc là một ngàn đôla.thì sao?(tranlamphi@yahoo.com)

    Trả lờiXóa
  2. Nặc danh18:40 20/5/10

    Nhờ Noname kiểm tra giúp: tôi đã tạo một table để lưu các giá trị đọc số. Nhưng khi chạy đọc số không đúng.
    File Link: http://www.mediafire.com/?jly01wfnzyj

    Trả lờiXóa
  3. Nặc danh18:21 1/6/10

    Nhờ Noname xem giúp file trên nhé.

    Trả lờiXóa
  4. bạn chú ý vì trong table không lưu được khoảng trắng cuối cùng. Nên khi gọi ô đọc chữ ra, bạn phải ghép thêm 1 khoảng trắng nữa:

    ii = 0: tp = DLookup("[ND1]", "table1", "[SOTB]=1") & " "

    Trả lờiXóa
  5. Nặc danh13:57 20/10/10

    Hoàng Long: truonglongbv@gmail.com
    các canh có thể bảo em cách chuyển từ ngày tháng năm sinh trong (access) sang chữ được hông ạ.

    Trả lờiXóa
  6. Bạn chỉ format ngày thành kiểu gì bạn muốn. Nếu muốn đọc thành tiếng Việt thì vào control panel mà mò! :)

    Trả lờiXóa
  7. anh viết bài này thấy hay. Nhưng mà còn trong report thì có xuất được không? vì tôi đang viết 1 chương trình nhỏ, để quản lý hóa đơn, nhưng khi xuất ra report thì không xuất được "từ số ra chữ". bạn có cách nào không thì chỉ giúp mình với.

    Trả lờiXóa
  8. report quản lý theo Đối tượng. Excel quản lý theo Cell. Xuất ra thì được nhưng không thể đúng format bạn à( trừ khi bạn viết code kẻ từng khung 1 trong Excel)

    Để đọc từ số ra chữ trong Excel, bạn nên tham khảo ở đây:
    http://thuthuataccess.co.cc/forum/thread-17.html

    Trả lờiXóa
  9. Nặc danh12:21 25/5/12

    Phần mềm MSchool(Quản lý điểm và xét tốt nghiệp THCS theo TT58 - thông tư áp dụng học kỳ 2 năm học 2011-2012
    Phần mềm MSchool(Quản lý điểm và xét hoàn thành CTTH theo TT32 - thông tư áp dụng học kỳ 2 năm học 2010-2011
    http://www.mediafire.com/myfiles.php

    Trả lờiXóa

» Hãy để lại tên, email của bạn khi bạn post comment, để mình có thể dễ dàng trả lời comment của bạn khi cần.
» Có thể sử dụng các thẻ < b>,< i>,< a>. Và các icon thông dụng trên YM