hàm VBA đọc ngày tháng thành chữ trong excel (3 người xem)

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

Tôi tuân thủ nội quy khi đăng bài

nhunghau1

Thành viên mới
Tham gia
8/1/08
Bài viết
4
Được thích
9
E ko biết về VBA, bác nào giúp em chuyển ngày tháng trong excel thành chữ giúp e với ạ. VD: 04/09/2015 thì sẽ thành: Ngày bốn tháng chín năm hai không mười lăm ý ạ. e coppy lệnh này bị báo lỗi ạ
Function DV(i As Integer) As String
Dim a
a = Array("không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín")
DV = a(i)
End Function

Function Doc2ChuSo(n As Integer) As String
Dim ch As Integer, dv As Integer
ch = n \ 10
dv = n Mod 10

If n < 10 Then
Doc2ChuSo = DV(n)
ElseIf n < 20 Then
If n = 15 Then
Doc2ChuSo = "mười lăm"
Else
Doc2ChuSo = "mười " & DV(dv)
End If
Else
Dim s As String
s = DV(ch) & " mươi"

If dv = 0 Then
Doc2ChuSo = s
ElseIf dv = 1 Then
Doc2ChuSo = s & " mốt"
ElseIf dv = 5 Then
Doc2ChuSo = s & " lăm"
Else
Doc2ChuSo = s & " " & DV(dv)
End If
End If
End Function

Function DocNam(y As Long) As String
Dim ng As Integer, tr As Integer, ch As Integer, dv As Integer
ng = y \ 1000
tr = (y Mod 1000) \ 100
ch = (y Mod 100) \ 10
dv = y Mod 10

Dim kq As String
kq = DV(ng) & " nghìn "

If tr = 0 And (ch > 0 Or dv > 0) Then
kq = kq & "không trăm "
ElseIf tr > 0 Then
kq = kq & DV(tr) & " trăm "
End If

If ch = 0 And dv > 0 Then
kq = kq & "lẻ " & DV(dv)
ElseIf ch > 0 Then
kq = kq & Doc2ChuSo(ch * 10 + dv)
End If

DocNam = Trim(kq)
End Function

Function DocNgay(dValue As Variant) As String
If Not IsDate(dValue) Then
DocNgay = "Không phải ngày hợp lệ"
Exit Function
End If

Dim d As Integer, m As Integer, y As Integer
d = Day(dValue)
m = Month(dValue)
y = Year(dValue)

DocNgay = "ngày " & Doc2ChuSo(d) & " tháng " & Doc2ChuSo(m) & " năm " & DocNam(y)
End Function
 

File đính kèm

  • loi.jpg
    loi.jpg
    66.5 KB · Đọc: 11
E ko biết về VBA, bác nào giúp em chuyển ngày tháng trong excel thành chữ giúp e với ạ. VD: 04/09/2015 thì sẽ thành: Ngày bốn tháng chín năm hai không mười lăm ý ạ. e coppy lệnh này bị báo lỗi ạ
Function DV(i As Integer) As String
Dim a
a = Array("không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín")
DV = a(i)
End Function

Function Doc2ChuSo(n As Integer) As String
Dim ch As Integer, dv As Integer
ch = n \ 10
dv = n Mod 10

If n < 10 Then
Doc2ChuSo = DV(n)
ElseIf n < 20 Then
If n = 15 Then
Doc2ChuSo = "mười lăm"
Else
Doc2ChuSo = "mười " & DV(dv)
End If
Else
Dim s As String
s = DV(ch) & " mươi"

If dv = 0 Then
Doc2ChuSo = s
ElseIf dv = 1 Then
Doc2ChuSo = s & " mốt"
ElseIf dv = 5 Then
Doc2ChuSo = s & " lăm"
Else
Doc2ChuSo = s & " " & DV(dv)
End If
End If
End Function

Function DocNam(y As Long) As String
Dim ng As Integer, tr As Integer, ch As Integer, dv As Integer
ng = y \ 1000
tr = (y Mod 1000) \ 100
ch = (y Mod 100) \ 10
dv = y Mod 10

Dim kq As String
kq = DV(ng) & " nghìn "

If tr = 0 And (ch > 0 Or dv > 0) Then
kq = kq & "không trăm "
ElseIf tr > 0 Then
kq = kq & DV(tr) & " trăm "
End If

If ch = 0 And dv > 0 Then
kq = kq & "lẻ " & DV(dv)
ElseIf ch > 0 Then
kq = kq & Doc2ChuSo(ch * 10 + dv)
End If

DocNam = Trim(kq)
End Function

Function DocNgay(dValue As Variant) As String
If Not IsDate(dValue) Then
DocNgay = "Không phải ngày hợp lệ"
Exit Function
End If

Dim d As Integer, m As Integer, y As Integer
d = Day(dValue)
m = Month(dValue)
y = Year(dValue)

DocNgay = "ngày " & Doc2ChuSo(d) & " tháng " & Doc2ChuSo(m) & " năm " & DocNam(y)
End Function
Vẵn code của bạn có sửa tý chút.
Xem code trong file
 

File đính kèm

Còn phải sửa chính tả nhiều lắm:

1764103498656.png

→ Người Việt hay đọc là hai mươi mốt;
→ Một số từ còn dính nhau;
→ Những từ không đầu câu lại viết hoa (?)

Nhưng sửa sẽ không khố, chắc vậy!
 
Cảm ơn anh
Còn phải sửa chính tả nhiều lắm:

View attachment 310407

→ Người Việt hay đọc là hai mươi mốt;
→ Một số từ còn dính nhau;
→ Những từ không đầu câu lại viết hoa (?)

Nhưng sửa sẽ không khố, chắc vậy!
Cảm ơn Anh đã xem bài.
Vẫn là code của chủ thớt, tôi chỉ sửa lại tý chút thôi.
Những lỗi như anh nói, tôi tin rằng chủ thớt biết chỗ sửa và sửa được theo ý định.
 
Hic nó bị lỗi, mình dán cái code vào macro rồi vẫn báo lỗi. mình ko biết gì về code. bạn có thể cho mình xin cái bạn sửa để mình dán vào macro đc ko? giúp mình với?
 

File đính kèm

  • loihoi.jpg
    loihoi.jpg
    32.5 KB · Đọc: 7
Hic nó bị lỗi, mình dán cái code vào macro rồi vẫn báo lỗi. mình ko biết gì về code. bạn có thể cho mình xin cái bạn sửa để mình dán vào macro đc ko? giúp mình với?
Bạn không biết gì về code VBa. Vậy code cũ ấy ai viết cho bạn?
Bạn đã thử file tôi gửi chưa? Rất có thể bạn chưa Ulock macro
cách làm: Tải fileveef máy rồi làm như hình đính kèm sau ===>xuất hiện 1 bảng tích chon vào Unlock==> chon Apply===>chon OK ===> Mở file
đưa chuột vào ô C1 và ấn Enter.
nếu vẫn không được thì có thể Utralview với tôi để dduocj hướng dẫn trực tiếp.
 

File đính kèm

Cảm ơn anh

Cảm ơn Anh đã xem bài.
Vẫn là code của chủ thớt, tôi chỉ sửa lại tý chút thôi.
Những lỗi như anh nói, tôi tin rằng chủ thớt biết chỗ sửa và sửa được theo ý định.
e ib zalo cho anh rồi ạ. Anh giúp e với? cái mã code là chatgpt làm cho e, e coppy ko hiểu sao ko đc ạ. cái code đó anh sửa lỗi dính chữ và chữ viết hoa lại giúp e đc ko ạ? e cảm ơn
 

File đính kèm

  • loi sai.png
    loi sai.png
    31.9 KB · Đọc: 5
Mình vừa yêu cầu Copilot viết hàm thông qua CHRWIN() nè:
Tuy nhiên hắn viết vẫn chưa chỉnh cho lắm!

PHP:
Function DocNgayVN(ByVal Ngay As Date) As String
    Dim d As Integer, m As Integer, y As Integer
    Dim kq As String
    
    d = Day(Ngay)
    m = Month(Ngay)
    y = Year(Ngay)
    
    kq = "Ngày " & DocNgayThang(d) & " tháng " & DocNgayThang(m) & " nam " & DocNam(y)
    
    DocNgayVN = kq
End Function

' Hàm d?c s? ngày/tháng (1–31)
Mã:
Function DocNgayThang(ByVal n As Integer) As String
    Dim arrSo
    arrSo = Array("kh" & CHRWin(244) & "ng", "m" & CHRWin(7897) & "t", "hai", "ba", _
                  "b" & CHRWin(7889) & "n", "n" & CHRWin(259) & "m", "s" & CHRWin(225) & "u", _
                  "b" & CHRWin(7843) & "y", "t" & CHRWin(225) & "m", "ch" & CHRWin(237) & "n")
    
    Select Case n
        Case 1 To 9
            DocNgayThang = arrSo(n)
        Case 10
            DocNgayThang = "m" & CHRWin(432) & "oi"
        Case 11 To 19
            DocNgayThang = "m" & CHRWin(432) & "oi " & arrSo(n - 10)
        Case 20
            DocNgayThang = "hai m" & CHRWin(432) & "oi"
        Case 21 To 29
            DocNgayThang = "hai m" & CHRWin(432) & "oi " & arrSo(n - 20)
        Case 30
            DocNgayThang = "ba m" & CHRWin(432) & "oi"
        Case 31
            DocNgayThang = "ba m" & CHRWin(432) & "oi m" & CHRWin(7897) & "t"
    End Select
End Function[/cfode]
[php]
' Hàm d?c nam t? nhiên
Function DocNam(ByVal y As Long) As String
    Dim arrSo
    arrSo = Array("kh" & CHRWin(244) & "ng", "m" & CHRWin(7897) & "t", "hai", "ba", _
                  "b" & CHRWin(7889) & "n", "n" & CHRWin(259) & "m", "s" & CHRWin(225) & "u", _
                  "b" & CHRWin(7843) & "y", "t" & CHRWin(225) & "m", "ch" & CHRWin(237) & "n")
    
    Dim nghin As Integer, tram As Integer, chuc As Integer, donvi As Integer
    Dim kq As String
    
    nghin = y \ 1000
    tram = (y Mod 1000) \ 100
    chuc = (y Mod 100) \ 10
    donvi = y Mod 10
    
    kq = arrSo(nghin) & " ngh" & CHRWin(236) & "n "
    
    If tram > 0 Then
        kq = kq & arrSo(tram) & " tr" & CHRWin(259) & "m "
    End If
    
    If chuc = 0 And donvi > 0 Then
        kq = kq & "linh " & arrSo(donvi)
    ElseIf chuc = 1 Then
        kq = kq & "m" & CHRWin(432) & "oi "
        If donvi > 0 Then kq = kq & arrSo(donvi)
    ElseIf chuc > 1 Then
        kq = kq & arrSo(chuc) & " m" & CHRWin(432) & "oi "
        If donvi > 0 Then kq = kq & arrSo(donvi)
    End If
    
    DocNam = Trim(kq)
End Function[/php][code]
' Hàm t?o ký t? Unicode theo mã s?
Function CHRWin(ByVal Code As Integer) As String
    CHRWin = ChrW(Code)
End Function
 
Không cần viết 1 hàm riêng để đọc ngày tháng. Bất kỳ ai có 1 hàm đọc số thành chữ (kế toán thì chắc chắn có, kỹ sư lập dự toán & bên soạn thảo hợp đồng văn bản cũng có), đều có thể áp dụng. Không có thì xin ẻm kế toán.
Chẳng hạn đã có 1 hàm có tên là Docso(số).
= "Ngày " & Docso(Day(A1)) & " tháng " & Docso(Month(A1)) & ...

Miễn đừng đòi tháng giêng, tháng tư, tháng một tháng chạp là được.
 
Lần chỉnh sửa cuối:
(/ậy thì viết phụ thêm 1 hàm đọc tháng nữa lả uyển chuyển rồi
Ví dụ như thông qua hàm Choose(0 trong VBA:

="Ngày " & DocSo(DAY(B1)) & " " & DocThang(MONTH(B1)) & " năm " & DocSo(YEAR(B1)) & "."
Xin mời các anh chị em viết dùm hàm DocThang(Num) giúp mình nha!
 
(/ậy thì viết phụ thêm 1 hàm đọc tháng nữa lả uyển chuyển rồi
Ví dụ như thông qua hàm Choose(0 trong VBA:

="Ngày " & DocSo(DAY(B1)) & " " & DocThang(MONTH(B1)) & " năm " & DocSo(YEAR(B1)) & "."
Xin mời các anh chị em viết dùm hàm DocThang(Num) giúp mình nha!
Đúng rồi. Nếu đọc là tháng bốn thì nghe trái tai quá
 
Không cần hàm Choose với Switch cho phiền hà

Mã:
Function DocThang(Num) As String
    Dim Thang()
    Thang = Array("mot", "hai", "ba", "tu")
    DocThang = Thang(Num - 1)
End Function
 
Nếu cần viết hàm Docso cho việc này thì chỉ cần viết cho các số từ 0 đến 999 nghĩa là đọc tối đa 3 con số. Đọc số hàng ngàn thì lấy y \ 1000 ra đọc riêng.
 
Cũng là ngứa tay. Thấy AI viết code mà mắc mệt. Đã có hàm ChrW lại còn đẻ ra CHRWin.

Viết 3 hàm con:
DocThang (chỉ cho mỗi 1 cái tháng tư), tại làm biếng thôi chứ bỏ nó đi thì sửa mất công thêm 1 chút.
Doc1So
Doc2So

PHP:
Function DocThang(Num) As String
    ChuSo = Array("", "m" & ChrW(7897) & "t", "hai", "ba", "t" & ChrW(432), "n" & ChrW(259) & "m", _
    "sáu", "b" & ChrW(7843) & "y", "tám", "chín", "m" & ChrW(432) & ChrW(7901) & "i", _
    "m" & ChrW(432) & ChrW(7901) & "i  m" & ChrW(7897) & "t", "m" & ChrW(432) & ChrW(7901) & "i hai")
    DocThang = ChuSo(Num)
End Function
'__________'
Function Doc1So(Num) As String
    ChuSo = Array("kh" & ChrW(244) & "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", "m" & ChrW(432) & ChrW(7901) & "i")
    Doc1So = ChuSo(Num)
End Function
'______________'
Function Doc2So(Num) As String
    If Num < 10 Then
        Doc2So = Doc1So(Num)
    Else
      
        If Num \ 10 = 1 Then
            Doc2So = Doc1So(10) & " " & Doc1So(Right(Num, 1))
        Else
            Doc2So = Doc2So & Doc1So(Left(Num, 1)) & " m" & ChrW(432) & ChrW(417) & "i " & Doc1So(Right(Num, 1))
            If Num Mod 10 = 1 Then
                Doc2So = Replace(Doc2So, ChrW(7897), ChrW(7889))
            End If
        End If
        Doc2So = Replace(Doc2So, "n" & ChrW(259), "l" & ChrW(259))
    End If
End Function
'____________'
Function Docngaythang(Dt As Date) As String
    y = Year(Dt)
    ngay = Day(Dt)
    ngan = y \ 1000
    tram = Mid(y, 2, 1)
    chuc = Mid(y, 3, 2)
    Docngan = Doc1So(ngan) & " ngàn "
    If y Mod 1000 > 0 Then
        doctram = Doc1So(tram)
        If y Mod 100 > 0 Then
            If y Mod 100 < 10 Then
                doctram = doctram & " tr" & ChrW(259) & "m " & "l" & ChrW(7867) & " " & Doc1So(y Mod 10)
            Else
                doctram = doctram & " tr" & ChrW(259) & "m " & Doc2So(chuc)
            End If
        End If
    End If
      
Docngaythang = "Ngày " & Doc2So(ngay) & " tháng " & DocThang(Month(Dt)) & " n" & ChrW(259) & "m " & _
    Docngan & doctram & "."
End Function

q01.png
 
Lần chỉnh sửa cuối:

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

Back
Top Bottom