Câu đố về tạo mã nhân viên

Liên hệ QC

Hoang2013

Thành viên gắn bó
Tham gia
15/8/13
Bài viết
1,622
Được thích
1,595
Giới tính
Nam
Nghề nghiệp
Hưu trí
Tôi có 1 danh sách nhân sự gần nghìn người với 2 trường như trích dẫn trong bảng sau:

A | B | C | D | E | F | G | H
TT| HoTen | Ma ||| F ||
1|Ardyatma Free|AJF00||| F ||
2|Âu Minh Tuấn|AMT00||| Nguyễn Thị Hoá || NTH |
3|Cao Thị Ngọc Hương|CNH00||| F ||
4|Lê Anh|LJA00||||Nguyễn Thanh Hiếu|NTH00
5|Nguyễn Đúc|NJF00||||Nguyễn Thị Hoà|NTH01
6|Lưu Bình|LJB00||||Nguyễn Thanh Hoá|NTH02
7|Lê Đoàn Kết|LFK00||||Nguyễn Thị Hương|NTH03
8|Công Tằng Tôn Nữ Minh Nguyệt|CMN00||||Nguyễn Trường Hận|NTH04
|. . . . |. . . ||.||.|.|

Tại ô [F3], nếu tôi nhập vô đó tên 1 người, như "Nguyễn Thị Hoá"
Thì macro1 sẽ đưa ra kết quả "NTN" ở ô cùng dòng tại cột [H]

& một macro khác sẽ liệt kê tất cả những người có cùng nhau 3 chữ cái đầu của mã

Bài tập đề ra là:

(1) Các bạn cho biết các bước để tao ra macro1
(2) Hãy tạo ra macro đó;
(3) Hãy tao ra macro2 để liệt kê toàn bộ số người có cùng 3 ký tự đầu như [H3] có trong danh sách
(4) Chuyển Macro1 Thành hàm tự tạo
(5) (Dành cho tất cả mọi người) Chuyễn Macro2 thành hàm tự tạo

Chúc thành công!
 

File đính kèm

  • TaoMa.rar
    13.9 KB · Đọc: 14
Lần chỉnh sửa cuối:
Tôi có 1 danh sách nhân sự gần nghìn người với 2 trường như trích dẫn trong bảng sau:
Tại ô [F3], nếu tôi nhập vô đó tên 1 người, như "Nguyễn Thị Hoá"
Thì macro1 sẽ đưa ra kết quả "NTN" ở ô cùng dòng tại cột [H]

& một macro khác sẽ liệt kê tất cả những người có cùng nhau 3 chữ cái đầu của mã

Bài tập đề ra là:

(1) Các bạn cho biết các bước để tao ra macro1
(2) Hãy tạo ra macro đó;
(3) Hãy tao ra macro2 để liệt kê toàn bộ số người có cùng 3 ký tự đầu như [H3] có trong danh sách
(4) Chuyển Macro1 Thành hàm tự tạo
(5) (Dành cho tất cả mọi người) Chuyễn Macro2 thành hàm tự tạo

Chúc thành công!
Bài này mình dùng For Next, nhưng chưa biết chuyển sang hàm tự tạo. Mong các Thầy chỉ bảo:
Code tách 3 ký tự đầu:
Mã:
Private Sub CommandButton1_Click()
Dim Nm As String
Dim I As Long
Dim Kq As String
Range("H3").ClearContents
Nm = Application.Trim(Range("F3").Value)
Kq = Left(Nm, 1)
    For I = 1 To Len(Nm)
        If Mid(Nm, I, 1) = " " Then
            Kq = Kq & Mid(Nm, I + 1, 1)
        End If
    Next I
    Range("H3").Value = Kq
End Sub
Code liệt kê những người có cùng chữ cái đầu:
Mã:
Private Sub CommandButton2_Click()
Dim Rng As Range, Clls As Range
Dim Nm As String
Dim I As Long, J As Long
Dim Kq As String
Set Rng = Range("B2:B" & Sheet1.Range("B65535").End(xlUp).Row)
Range("G5:H65536").ClearContents
    For Each Clls In Rng
        Nm = Application.Trim(Clls.Value)
        Kq = Left(Clls, 1)
            For I = 1 To Len(Clls)
                If Mid(Clls, I, 1) = " " Then
                    Kq = Kq & Mid(Clls, I + 1, 1)
                End If
            Next I
            If Kq = Range("H3") Then
                J = J + 1
                Range("G" & J + 4) = Clls
                Range("H" & J + 4) = Range("H3") & J - 1
            End If
    Next Clls
End Sub
 

File đính kèm

  • TaoMa.xls
    77.5 KB · Đọc: 13
Upvote 0
trả lời bài #222 của leonguyen
code lấy các ký tự đầu
Mã:
[/B]Option Explicit
Function TACH3KT(HoTen As String)
Dim I As Long
Dim Kq As String
    HoTen = Trim(HoTen)
    Kq = Left(HoTen, 1)
    For I = 1 To Len(HoTen)
        If Mid(HoTen, I, 1) = " " Then
            Kq = Kq & Mid(HoTen, I + 1, 1)
        End If
    Next I
    TACH3KT = Kq
End Function
[B]

code dò tìm và in ra các ký tự giống ký tự đầu
Mã:
[/B]Sub TIM_GIONG()
Dim Rng As Range, CLLS As Range
Dim J  As Long
Set Rng = Range("B2:B" & Sheet1.Range("B65535").End(xlUp).Row)
Range("G5:H65536").ClearContents
    J = 0
    Range("H3").Value = TACH3KT(Range("F3").Value)
   For Each CLLS In Rng
        If (TACH3KT(CLLS.Value) = Range("H3").Value) Then
              J = J + 1
              Range("G" & J + 4) = CLLS
              Range("H" & J + 4) = Range("H3") & J - 1
        End If
   Next CLLS
End Sub
[B]
bài này dựa trên code của leonguyen để viết
 
Upvote 0
Bài này mình dùng For Next, nhưng chưa biết chuyển sang hàm tự tạo. Mong các Thầy chỉ bảo:
Code tách 3 ký tự đầu:
Mã:
Private Sub CommandButton1_Click()
Dim Nm As String
Dim I As Long
Dim Kq As String
Range("H3").ClearContents
Nm = Application.Trim(Range("F3").Value)
Kq = Left(Nm, 1)
    For I = 1 To Len(Nm)
        If Mid(Nm, I, 1) = " " Then
            Kq = Kq & Mid(Nm, I + 1, 1)
        End If
    Next I
    Range("H3").Value = Kq
End Sub

Nhà ngươi chưa làm câu 1 đã làm câu hai; Bỡi vậy nên mà chưa đúng!
Hãy xem lại bảng mẫu:

(1) Với các cá nhân có số TT 1, 4, 5 & 6 trong danh sách chỉ có họ & tên thì fải thêm 'J' thay vô;
(1.1) Với họ đệm hay lót có chữ cái đầu là 'Đ' thì thay vì dùng 'D' người ta dùng 'F' thay thế;
(1.2) Cũng nói luôn, Nếu từ đầu cần chọn là nhựng nguyên âm có dấu, thì bỏ dấu đi,
như Ấ => A; Ế => E, & Ứ => U, . . . .

(2) Nếu họ tên gồm hơn 3 từ thì ta cần chọn chữ cái đầu của từ đầ, các chữ cái đầu của 2 từ cuối trong 'Ho & tên'

Hãy làm câu 1 đã nha, bạn thân thương!
 
Upvote 0
file kèm theo bài trên lầy file của leonguyen
 

File đính kèm

  • TaoMa_leonguyen.xls
    81.5 KB · Đọc: 9
Upvote 0
Nhà ngươi chưa làm câu 1 đã làm câu hai; Bỡi vậy nên mà chưa đúng!
Hãy xem lại bảng mẫu:
(1) Với các cá nhân có số TT 1, 4, 5 & 6 trong danh sách chỉ có họ & tên thì fải thêm 'J' thay vô;
(1.1) Với họ đệm hay lót có chữ cái đầu là 'Đ' thì thay vì dùng 'D' người ta dùng 'F' thay thế;
(1.2) Cũng nói luôn, Nếu từ đầu cần chọn là nhựng nguyên âm có dấu, thì bỏ dấu đi,
như Ấ => A; Ế => E, & Ứ => U, . . . .
(2) Nếu họ tên gồm hơn 3 từ thì ta cần chọn chữ cái đầu của từ đầ, các chữ cái đầu của 2 từ cuối trong 'Ho & tên'
Hãy làm câu 1 đã nha, bạn thân thương!
Bác giải thích thế này thì em hiểu, nhưng nếu làm được luôn việc bỏ dấu, chèn chữ (J), thay chữ (F), chỉ lấy 3 ký tự (1 đầu và 2 cuối), ... thì em chưa đạt tới khả năng đó, và bài này "đậu phộng" topic luôn rồi.
Mong các Thầy đừng đưa ra những câu đố vượt quá cơ bản, vì sợ rằng topic chỉ có các Thầy tranh luận mà thôi.
 
Upvote 0
chỉ lấy 3 ký tự (1 đầu và 2 cuối) thì đơn giản mà. mình làm xong có kết quả sau đó mình gán lại
left(kq,1) & right(kq,2)
// cái này chưa bẫy lỗi à nha

 
Upvote 0
@leonguyenz:

Về giải thuật và code:

Vì bài này bạn ra đề có nói là dùng giải thuật đơn giản cho nên tôi không nói qua kỹ thuật dùng hàm split tách ra từng từ rồi chặt lấy kt đầu tiên.

Tuy nhiên, code của bạn không có phần đề phòng trường hợp nhiều khoảng trắng đi liền nhau.

Về cách áp dụng:

Sau khi có code, người ta thường xem lại code đặt như thế nào thì hợp lý. Ví dụ điển hình là philndhsp đã đưa code "lấy các chữ cái đầu từ" về thành một hàm thay vì thủ tục. Kỹ thuật này gọi là tạo cấu trúc chuyên cụm (modularisation).

Các bước sẽ như thế này:
- Hàm LayKTDauTu(byVal chuoi as string) as string sẽ trả về tất cả các ký tự đầu từ (2, 3, 4 gì đó, theo dạng thô, có gì lấy nấy.
- Hàm LocLay3KT(byVal chuoi as string) as string sẽ lọc lại kết quả của trên, và lấy 3 ký tự theo chuẩn đòi hỏi.
- Code chính sẽ gọi hàm trên.
[H3].Value = Loc3KT(LayKTDauTu([F3.Value])
Viết như thế thì các hàm con của bạn rất dễ kiểm soát (*) và có thể được dùng lại nhiều lần. Đó là mục đích chính của viết code cho các project phức tạp.
Lưu ý đầy chỉ là hướng dẫn. Trên thực tế, đòi hỏi của cách lọc ra 3 KT cuối cùng (như Đ -> F, J để chèn vào chỗ thiếu vv...) rất đặc thù, cơ hội dùng lại rất thấp, cho nên cũng không cần phải tách ra hàm con. Ngược lại, code lấy KT đầu từ có khả năng dùng lại rất cao, tách ra hàm con là điều rất nên làm.
Lưu ý thứ hai là tôi dùng cách viết tắt [h3] là vì các bạn ở đây thích dùng vậy. Cá nhân tôi khi dùng các ranges, tôi luôn luôn đặt địa chỉ cứng trong hằng số.
private const noiDi = "F3"
private const noiDen = "H3"
Range(noitDen).Value = Loc3KT(LayKTDauTu(Range(noiDi).Value)
Tôi là người học lập trình theo kiểu xưa cho nên tôi tránh "magic numbers" (nếu bạn nào cần biết thì tra từ khoá này trên Gú Gồ cùng với từ khoá programming). Tuy nhiên tôi xin từ chối bảo vệ xu hướng lạc hậu của mình.

(*) kình nghiệm cho biết dùng từ "dễ" này sẽ bị bắt bẻ, cho nên cái này tôi chỉ nói ra. Có thấy lợi hay không là tuỳ trường phái làm việc của bạn.
 
Upvote 0
Bác giải thích thế này thì em hiểu, nhưng nếu làm được luôn việc bỏ dấu, chèn chữ (J), thay chữ (F), chỉ lấy 3 ký tự (1 đầu và 2 cuối), ... thì em chưa đạt tới khả năng đó, và bài này "đậu phộng" topic luôn rồi.
Mong các Thầy đừng đưa ra những câu đố vượt quá cơ bản, vì sợ rằng topic chỉ có các Thầy tranh luận mà thôi.

Bài 1 nên là vầy:

B1: Tìm số lượng từ mà người dùng (ND) nhập vô;
Nếu 1 từ thì nhắc nhỡ ND & thoát;
Nếu chỉ 2 từ thì thêm 'J' vô giữa;
Nếu 3 từ thì "Lấy cả 3";
Nếu trên 3 từ thì lấy từ đầu & tìm cách lấy 2 từ cuối

B2: Lấy 3 ký tự đầu của 3 từ đã qua bước 1
Lập bảng tra trên trang excel (cách bèo nhất có thể) để tra các nguyên âm có dấu & 'Đ', hầu chuyển 3 ký tự đã chọn về dạng đúng theo qui tắc đề ra;

Nhiều khi tìm fương hướng giải quyết lại là mấu chốt của sự hình thành 1 macro!

Thân & tiếp đi, trong khả năng bạn mà!
 
Upvote 0
@leonguyenz:
Về giải thuật và code: ...
Tuy nhiên, code của bạn không có phần đề phòng trường hợp nhiều khoảng trắng đi liền nhau.
Chân thành cảm ơn bác VetMini đã hướng dẫn.
Trong code em có dùm hàm Trim để loại bỏ khoảng trắng liền nhau, nếu còn đề phòng nữa xin bác chỉ giáo.
Em mới tập tành viết code, chủ yếu là mấy vòng lặp cơ bản nên hiểu và viết như một người viết công thức, cụ thể để giải quyết chèn, thay chữ, ... thì em dùng If, ... còn loại bỏ dấu tiếng Việt thì em chịu thua.
Mã:
Dim Kq As String
Range("H3").ClearContents
Nm = Application.Trim(Range("F3").Value)
If Left(Nm, 1) = ChrW(272) Then
    Kq = "F"
Else
    Kq = Left(Nm, 1)
End If
    For I = 1 To Len(Nm)
        If Mid(Nm, I, 1) = " " Then
            If Mid(Nm, I + 1, 1) = ChrW(272) Then
                Kq = Kq & "F"
            Else
                Kq = Kq & Mid(Nm, I + 1, 1)
            End If
        End If
    Next I
    If Len(Kq) = 2 Then
        Range("H3").Value = Left(Kq, 1) & "J" & Right(Kq, 1)
    Else
        Range("H3").Value = Left(Kq, 1) & Right(Kq, 2)
    End If
End Sub
 

File đính kèm

  • TaoMa.xls
    80 KB · Đọc: 9
Upvote 0
Chân thành cảm ơn bác VetMini đã hướng dẫn.
Trong code em có dùm hàm Trim để loại bỏ khoảng trắng liền nhau, nếu còn đề phòng nữa xin bác chỉ giáo.
Em mới tập tành viết code, chủ yếu là mấy vòng lặp cơ bản nên hiểu và viết như một người viết công thức, cụ thể để giải quyết chèn, thay chữ, ... thì em dùng If, ... còn loại bỏ dấu tiếng Việt thì em chịu thua.
Mã:
Dim Kq As String
Range("H3").ClearContents
Nm = Application.Trim(Range("F3").Value)
If Left(Nm, 1) = ChrW(272) Then
    Kq = "F"
Else
    Kq = Left(Nm, 1)
End If
    For I = 1 To Len(Nm)
        If Mid(Nm, I, 1) = " " Then
            If Mid(Nm, I + 1, 1) = ChrW(272) Then
                Kq = Kq & "F"
            Else
                Kq = Kq & Mid(Nm, I + 1, 1)
            End If
        End If
    Next I
    If Len(Kq) = 2 Then
        Range("H3").Value = Left(Kq, 1) & "J" & Right(Kq, 1)
    Else
        Range("H3").Value = Left(Kq, 1) & Right(Kq, 2)
    End If
End Sub
Ham trim vba # trim function excel
 
Upvote 0
Xin lỗi, tôi đọc nhầm code khác (code của Function TACH3KT(HoTen As String)) nên chỉ thấy hàm Trim của VBA chứ không thấy hàm Trim của Application. Đúng là code của bạn có dùng Application.Trim để loại hết các khoảng trắng thừa.

Để chuyển các ký tự đặc thù của tiếng Việt sang mã chuẩn ASCII, người ta phải dùng bảng tra (các ngôn ngữ khác như vây, có thể Excel có công cụ nào đó tôi chưa biết tới)

bangViet = "ÁÂ...áâ...Đ"
bangAnh = "AA...aa...F"
Bạn dò ký tự trong bangViet. Nếu có thì dùng vị trí để tra ra ký tự tương đương trong bangAnh. Nếu không có thì để nguyên, vì không cần chuyển.
 
Lần chỉnh sửa cuối:
Upvote 0
@leonguyenz:

Tánh tôi nói chuyện có nhiều người cho là rất phách lối. Nếu bạn thấy chỗ nào chướng tai chướng mắt thì đừng đọc tiếp. Có vậy thôi, tôi biết nhược điểm của mình, không phiền đâu.

Cách làm mã trong bài này là một cơ hội toost cho các bạn mới vào nghề dữ liệu học hỏi về kỹ thuật phân tích yêu cầu. Đọc một đề tài, bạn phải chịu khó phân tích xem nó yêu cầu những gì. Và đặt cho mình câu hỏi: nếu đầu vào là abc thì đầu ra là xyz, đúng hay không?
Kế đó bạn phải nhìn vào các luật để xem luật nào quan trọng hơn, tức là luật nào phải thoả mãn trước. Và một khi thoả mãn luật thứ n thì có bị bể/phạm luật thứ n-1 không?
Trong bài này, các luật đi theo thứ tự ưu tiên như sau:
1. Kết quả có tất cả 3 ký tự, không 1 không 2 không 4
2. các ký tự được lấy từ các đầu từ trong chuỗi
3. Các ký tự nếu tiếng Việt thì phải chuyển ra tiếng Anh

Vì luật 1 cao hơn cho nên luật 2 phải chịu thiệt, tức là phải suy ra các luật 2 phụ
2. các ký tự được lấy từ các đầu từ trong chuỗi
2.a. nếu trên 3 ký tự thì chỉ lấy 1 đầu và 2 cuối
2.b. nếu dưới 3 KT thì phải chèn vào cho đủ số, và luật chèn là:
2.b.i. ký tự chèn này là J
2.b.ii. chèn vào vị trí thứ 2 (đề bài không cho biết trường hợp nếu cần chèn 2 ký tự thì chèn ra sao. Bạn phải tự đặt giả thiết)

Luật 3 thì diễn ra như sau:
3.a. Các ký tự tiếng Việt thì dùng phương pháp chặt bỏ dấu để đưa về tiếng Anh. Tức là Ô, Ơ, Ó đều dưa về O như nhau.
3.b. Riêng ký tự Đ thì không chặt bỏ dấu (để thành D) mà chuyển thành F
3.c. Đề bài không nói đến trường hợp hoa và thường cho nên bạn phải giả thiết chúng giữ nguyên.
 
Upvote 0
Xin lỗi, tôi đọc nhầm code khác (code của Function TACH3KT(HoTen As String)) nên chỉ thấy hàm Trim của VBA chứ không thấy hàm Trim của Application. Đúng là code của bạn có dùng Application.Trim để loại hết các khoảng trắng thừa.

Để chuyển các ký tự đặc thù của tiếng Việt sang mã chuẩn ASCII, người ta phải dùng bảng tra (các ngôn ngữ khác như vây, có thể Excel có công cụ nào đó tôi chưa biết tới)

bangViet = "ÁÂ...áâ...Đ"
bangAnh = "AA...aa...F"
Bạn dò ký tự trong bangViet. Nếu có thì dùng vị trí để tra ra ký tự tương đương trong bangAnh. Nếu không có thì để nguyên, vì không cần chuyển.


Với dạng bài này, em có làm tại topic dưới đây, nếu các bạn thành viên mới muốn tham khảo thì xem tại link này:

Tặng Hàm đặt mã nhân viên theo họ tên (tên viết tắt + 1 dãy số)
 
Upvote 0
@leonguyenz:

Tôi đợi 1 ngày để bạn nghiền ngẫm code của HTN xong sẽ chỉ cho 1 vài thủ thuật trong đề bài này.

Điểm chính là giải thuật làm thế nào để nhận ra một ký tự đầu từ.

Giải thuật của bạn duyệt chuỗi theo chiều "nhìn trước". Tức là đọc thấy dấu cách thì cho rằng ký tự kế tiếp phải là ký tự đầu từ. Cách này không sai vì chuỗi của bạn trước đó đã được "chuẩn hoá", bỏ hết các khoảng trắng đầu, cuối, và lặp lại.

Trên thực tế, kỹ thuật duyệt chuỗi tìm từ đơn giản hơn, và không cần phải chuẩn hoá chuỗi trước. Kỹ thuật này dùng cách "xét lui". Tức là dò thấy một ký tự không trắng thì xét xem trước nó có một trắng hay không. Tuy dùng phương pháp nảy bạn phải có thêm một biến để chứa ký tự đi trước, những bù lại số lần gọi hàm MID được giảm đi.

Mã:
Function KTDT(ByVal str As String) As String

' hàm tìm các ký tự đầu từ trong chuỗi str
'   Rules: ký tự đầu từ được định nghĩa là ký tự:
'          1. không phải là ký tự trắng, và
'          2. ở đầu chuỗi hoặc đi sau ký tự trắng

Const KTRANG = " " ' ký tự trắng
Dim kt0 As String, kt1 As String ' ký tự trước và ý tự hiện thời
Dim i As Integer

KTDT = ""
kt0 = KTRANG
For i = 1 To Len(str) ' vòng lặp duyệt chuỗi
    kt1 = Mid(str, i, 1)
    If (kt0 = KTRANG) Then '  trước đó là ký tự trắng -> có khả năng là đầu từ
        If (kt1 <> KTRANG) Then KTDT = KTDT & kt1 ' đúng là đầu từ
    End If
    kt0 = kt1
Next i

End Function

Chú thích:
- Trường phái viết code của tôi tuân thủ theo các quy luật sau:
- Tôi luôn luôn chú thích nhiệm vụ của hàm (dòng thứ nhất)
- Đôi khi tôi thêm dòng thứ 2, cho biết luật lệ làm việc của hàm
- Ký tự trắng được chọn là space. Vì có trường hợp chọn mặc định nên tôi dùng Constant. Bởi vì (TRANG = SPACE) tuy đúng cho các chuỗi họ tên nhưng không hẳn đã đúng cho các loại chuỗi khác. Có những trường hợp ký tự này gồm cả tab, vv... Lúc đó phải dùng hàm để dò
- Tôi luôn luôn chú thích nhiệm vụ của biên. Riêng i thì không cần vì nó quá rõ rệt
 
Upvote 0
Tôi đang tự hỏi, nếu hàm viết tắt này đặt mã cho các tên của tàu thì phải viết tắt thế nào nhỉ?

Các hãng tàu Việt Nam thường đặt tên đại loại như thế này: Một cụm chữ + một cụm số

VD: PHÚ TÀI 18, HOÀNG ĐẠT 1, PASCO 98, TRƯỜNG SA 125 v.v...

Thì viết tắt sẽ như thế nào? nếu lấy chuỗi là ký tự đầu thì đụng số sẽ lấy đúng số đầu, mã này thấy sao sao ấy!


===============================

THAM KHẢO:

Đây là một hàm viết tắt Họ Tên (chưa kèm theo số), luôn đảm bảo 3 ký tự:

Nếu tên chỉ có 1 chữ:

NGHĨA -----------------------------------> NZZ

Nếu họ tên có 2 chữ:

TRỌNG NGHĨA ---------------------------> TNZ

Nếu họ tên có 3 chữ:

HOÀNG TRỌNG NGHĨA -------------------> HTN

Nếu họ tên có từ 4 chữ trở lên, lấy ký tự đầu tiên của họ, kết hợp với 2 ký tự đầu tiên của tên và tên lót sát với tên:

TÔN TẦN TÔN NỮ PHƯƠNG KHANH ------> TPK

Mã:
Function InitialName(ByVal FullName As String) As String


    FullName = Trim(FullName)
    
    If FullName = "" Then Exit Function
    
    If InStr(FullName, " ") = 0 Then
        InitialName = Left(FullName, 1) + "ZZ"
    Else
        Dim splArr, iniArr(), i As Long, n As Long, itm As String
        
        splArr = Split(FullName, " ")
        
        For i = 0 To UBound(splArr)
            itm = Trim(splArr(i))
            If itm > "" Then
                ReDim Preserve iniArr(0 To n)
                iniArr(n) = Left(itm, 1)
                n = n + 1
            End If
        Next
        
        If n = 2 Then
            InitialName = iniArr(0) + iniArr(n - 1) + "Z"
        Else
            InitialName = iniArr(0) + iniArr(n - 2) + iniArr(n - 1)
        End If
        
    End If
    
    InitialName = UCase(InitialName)
    
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Cái gì cũng vậy. Hễ đặt thêm trường hợp thì cũng phải đặt thêm luật để phân sử các trường hợp đó:

Nếu chuỗi có lẫn số thì phải đặt ra luật:

- Số thì chỉ là số hay vừa số vừa chữ: 123, 456... hay là 123A, A9B, ... ?

- Tất cả những từ bắt đầu bằng số thì không tính, HOẶC là:
- Tất cả những từ bắt đầu bằng số thì lấy kể từ ký tự đầu tiên không phải là số

Vân vân

Có hàng nửa tá luật. Phải nêu rõ ra hết rồi mới có hướng giải quyết.

Nếu luật rắc rối quá thì có lẽ dùng Regex là cách sạch sẽ nhất. (Các bạn thích chạy nhanh nên tôi phải dùng từ "sạch sẽ", Regex không phải là công cụ chạy nhanh.)
 
Upvote 0
"Nắn" lại thành 3 ký tự:

SELECT CASE LEN(str)
CASE 0
... chèn thê nào đó thì chèn
CASE 1
... chèn thê nào đó thì chèn
CASE 2
... chèn thê nào đó thì chèn
CASE 3
... không làm gì hết
CASE ELSE
str = Left(str,1) & Right(str,2)
END SELECT

Nếu chèn ở sau thì chỉ cần
IF LEN(str) > 3 THEN
str = Left(str,1) & Right(str,2)
ELSE
str = Left(str & "ZZZ", 3)
END IF
 
Upvote 0
Web KT
Back
Top Bottom