Nhờ hỗ trợ về việc tạo từ viết tắt cho chuỗi ký tự.

Liên hệ QC

nguyenhoangtuananh9897

Thành viên mới
Tham gia
6/4/22
Bài viết
38
Được thích
11
Xin chào mọi người.
Mình gặp phải vấn đề viết tắt chuỗi ký tự theo 3 nguyên tắc sau:
- Nếu tiếng chỉ gồm chữ -> giữ lại chữ đầu tiên. Các chữ tiếng Việt như Đ,Ư,Ơ, ... Sẽ chuyển thành chữ tiếng anh như D,U,O,A
- Nếu tiếng gồm số đứng trước và chữ -> giữ lại số. VD: 120K -> 120, 3in1 -> 31
- Nếu tiếng gồm chữ đứng trước và số -> giữ lại chữ đầu tiên và toàn bộ số. VD: K300 -> K300, INVERTER1200XL ->I1200
Cám ơn mọi người rất nhiều.
 

File đính kèm

  • VIETTAT.xlsx
    9 KB · Đọc: 7
Lần chỉnh sửa cuối:
Xin chào mọi người.
Mình gặp phải vấn đề viết tắt chuỗi ký tự theo 3 nguyên tắc sau:
- Nếu từ chỉ gồm chữ -> giữ lại chữ đầu tiên. Các chữ tiếng Việt như Đ,Ư,Ơ, ... Sẽ chuyển thành chữ tiếng anh như D,U,O,A
- Nếu từ gồm số đứng trước và chữ -> giữ lại số. VD: 120K -> 120, 3in1 -> 31
. . . . . . . . .
 
Upvote 0
Upvote 0
Sr bạn, mình đã nhầm lẫn giữ "từ" và "tiếng". Nước xúc miệng -> NXM Kem đánh răng PS -> KDRP Kem hộp 3in1 -> KH31
Chú ý viết thuần Việt nha bạn, code dưới mình đã kiểm khá nhiều trường hợp không biết coi sai sót gì không:
Cách dùng: =VietTat(ô cần tạo)
Mã:
Option Explicit

Public Function VietTat(ByVal str As String) As String
Dim Tmp, I&, J&, K&, U&, S(), D(), Txt$, fTxt$, Res$
S = Array(258, 7856, 7854, 7860, 7858, 7862, 194, 7844, 7846, 7850, 7848, 7852, 272, 202, 7872, 7870, 7876, _
    7874, 7878, 212, 7890, 7888, 7894, 7892, 7896, 416, 7900, 7898, 7904, 7902, 7906, 431, 7914, 7912, 7918, 7916, 7920)
D = Array(65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 68, 69, 69, 69, 69, 69, 69, _
        79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 85, 85, 85, 85, 85, 85)
Tmp = Split(Application.Trim(str)): U = UBound(Tmp)
For I = 0 To U
    Txt = Tmp(I): fTxt = UCase(Left(Txt, 1))
    If AscW(fTxt) > 90 Then
        For K = 0 To UBound(S)
            If AscW(fTxt) = S(K) Then Res = Res & ChrW(D(K)): Exit For
        Next
        If K = UBound(S) + 1 Then Res = Res & fTxt
    Else
        Res = Res & fTxt
    End If
    If Txt Like "*[0-9]*" Then
        For J = 2 To Len(Txt)
            If IsNumeric(Mid(Txt, J, 1)) Then Res = Res & Mid(Txt, J, 1)
        Next
    End If
Next
VietTat = Res
End Function
 
Upvote 0
Chú ý viết thuần Việt nha bạn, code dưới mình đã kiểm khá nhiều trường hợp không biết coi sai sót gì không:
Cách dùng: =VietTat(ô cần tạo)
...
Theo cách lập trình modular programming (lập trình từng khối - theo phân vùng nhiệm vụ) thì lấy ký tự đầu và chuyển sang tiếng Việt không dấu là hai công việc khác nhau. Dân lập trình lối kinh điển này sẽ chia làm hai hàm:
1. hàm LayKyTuDau(ByVal str As String) As String : lấy ký tự đầu từ theo quy luật nào đó.
2. hàm ChuyenMaLatin(ByVal str As String) As String : chuyển ký tự từ Unicode tiếng Việt có dấu sang tiếng Anh (Latin, không dấu)
Cộng code chính, gọi 2 hàm.
Public Function VietTat(ByVal str As String) As String
VietTat = ChuyenMaLatin(LayKyTuDau(str))
End Function

Hàm ChuyenMaLatin là một hàm rất thông dụng. Cứ ba bữa là thấy có người yêu cầu. Nếu bạn có nó sẵn trong thư viện thì khỏi phải viết lại mỗi lần cần đến. Đó là một trong những lợi điểm của modular programming.

Chú ý: tôi chỉ nói chuyện phân chia theo kiểu kinh điển. GPE này theo trường phái cascading (thác nước), code đổ từ trên xuống dưới. Một sub/function làm hết mọi công việc, không phân biệt.
 
Upvote 0
Chú ý viết thuần Việt nha bạn, code dưới mình đã kiểm khá nhiều trường hợp không biết coi sai sót gì không:
Cách dùng: =VietTat(ô cần tạo)
Mã:
Option Explicit

Public Function VietTat(ByVal str As String) As String
Dim Tmp, I&, J&, K&, U&, S(), D(), Txt$, fTxt$, Res$
S = Array(258, 7856, 7854, 7860, 7858, 7862, 194, 7844, 7846, 7850, 7848, 7852, 272, 202, 7872, 7870, 7876, _
    7874, 7878, 212, 7890, 7888, 7894, 7892, 7896, 416, 7900, 7898, 7904, 7902, 7906, 431, 7914, 7912, 7918, 7916, 7920)
D = Array(65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 68, 69, 69, 69, 69, 69, 69, _
        79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 85, 85, 85, 85, 85, 85)
Tmp = Split(Application.Trim(str)): U = UBound(Tmp)
For I = 0 To U
    Txt = Tmp(I): fTxt = UCase(Left(Txt, 1))
    If AscW(fTxt) > 90 Then
        For K = 0 To UBound(S)
            If AscW(fTxt) = S(K) Then Res = Res & ChrW(D(K)): Exit For
        Next
        If K = UBound(S) + 1 Then Res = Res & fTxt
    Else
        Res = Res & fTxt
    End If
    If Txt Like "*[0-9]*" Then
        For J = 2 To Len(Txt)
            If IsNumeric(Mid(Txt, J, 1)) Then Res = Res & Mid(Txt, J, 1)
        Next
    End If
Next
VietTat = Res
End Function
Cám ơn bạn đã hỗ trợ code, code hoạt động rất tốt và mình đã sửa "sr" -> xin lỗi :)
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom