Hàm tách ký tự tạo thành mã nhân viên

Liên hệ QC

manhcuong91

Thành viên mới
Tham gia
27/12/14
Bài viết
18
Được thích
1
Các cao nhân giúp em với ạ. Em muốn lấy các ký tự đầu của họ và tên để tạo thành mã nhân viên thì nên dùng hàm nào được ạ.
Em có gửi file đính kèm bên dưới ạ. Mong được mọi người chỉ giúp. em cám ơn!
 

File đính kèm

  • FILE THUC HANH EXCEL.xlsx
    9.7 KB · Đọc: 19
Các cao nhân giúp em với ạ. Em muốn lấy các ký tự đầu của họ và tên để tạo thành mã nhân viên thì nên dùng hàm nào được ạ.
Em có gửi file đính kèm bên dưới ạ. Mong được mọi người chỉ giúp. em cám ơn!
Chủ đề này vui nè, ví dụ tên như sau:
Đặng Uông
Lê Ông Nhân
Bạn muốn kết quả như thế nào? -0-0-0-
 
(2) Anh/ Chị có cách sử dụng hàm nào giúp em tạo mã nhân viên mà không phải đánh tay không ạ. Đây có 6 nhân viên còn điền tay được, chứ thêm 1000 nhân viên nữa mà điền tay thì tốn thời gian quá ạ.
(1) Mã nhân viên trên là lấy các ký tự đầu của Họ và tên và kèm theo số thứ tự tương ứng
Bộ mã của bạn chưa thật hoàn chỉnh; Thể hiện ở những chổ sau, từ bé đến lớn:
a./ Không nên xài trong bộ mã tiếng Việt là ký tự 'Đ' bỡi lý do Font chữ tiếng Việt chưa nhất quán trong các máy
Như mình trong những trường hợp như vậy sẽ là:
PHP:
 Mã NV    Họ & Tên
FFF00   Đỗ Đình Đức
DJF00   Dương Đông
DFF00   Dương Đăng Đại
LAN00   Lê Thị Ân Nhân
b./ Ở ví dụ trên mình có bộ mã luôn có độ dài là 5 kí tự (kể cả số); Với trường hợp như vậy mình đã thành công với 1 trường PTTH ~ nữa vạn HS mà vẫn ngủ khỏe đó nha

(2) Điều này có thể tự động tạo bộ mã nhờ trợ giúp bỡi VBA; Nếu ưng ý mình sẽ gởi file cho bạn xài, miễn phí trong tháng đầu
 
Các cao nhân giúp em với ạ. Em muốn lấy các ký tự đầu của họ và tên để tạo thành mã nhân viên thì nên dùng hàm nào được ạ.
Em có gửi file đính kèm bên dưới ạ. Mong được mọi người chỉ giúp. em cám ơn!
Dùng hàm tự tạo nhé
 

File đính kèm

  • FILE THUC HANH EXCEL.xlsm
    15.7 KB · Đọc: 19
Sao hàm của bạn @LamNA mình thử gõ tên"Nguyễn Ái Loan" thì nó ra"NÁL"
Muốn loại dấu tìm hàm tự tạo chịu khó tìm sẽ có nhiều
Mã:
Function BoDau(Text As String) As String
  Dim AsciiDict As Object
  Set AsciiDict = CreateObject("scripting.dictionary")
  AsciiDict(192) = "A"
  AsciiDict(193) = "A"
  AsciiDict(194) = "A"
  AsciiDict(195) = "A"
  AsciiDict(196) = "A"
  AsciiDict(197) = "A"
  AsciiDict(199) = "C"
  AsciiDict(200) = "E"
  AsciiDict(201) = "E"
  AsciiDict(202) = "E"
  AsciiDict(203) = "E"
  AsciiDict(204) = "I"
  AsciiDict(205) = "I"
  AsciiDict(206) = "I"
  AsciiDict(207) = "I"
  AsciiDict(208) = "D"
  AsciiDict(209) = "N"
  AsciiDict(210) = "O"
  AsciiDict(211) = "O"
  AsciiDict(212) = "O"
  AsciiDict(213) = "O"
  AsciiDict(214) = "O"
  AsciiDict(217) = "U"
  AsciiDict(218) = "U"
  AsciiDict(219) = "U"
  AsciiDict(220) = "U"
  AsciiDict(221) = "Y"
  AsciiDict(224) = "a"
  AsciiDict(225) = "a"
  AsciiDict(226) = "a"
  AsciiDict(227) = "a"
  AsciiDict(228) = "a"
  AsciiDict(229) = "a"
  AsciiDict(231) = "c"
  AsciiDict(232) = "e"
  AsciiDict(233) = "e"
  AsciiDict(234) = "e"
  AsciiDict(235) = "e"
  AsciiDict(236) = "i"
  AsciiDict(237) = "i"
  AsciiDict(238) = "i"
  AsciiDict(239) = "i"
  AsciiDict(240) = "d"
  AsciiDict(241) = "n"
  AsciiDict(242) = "o"
  AsciiDict(243) = "o"
  AsciiDict(244) = "o"
  AsciiDict(245) = "o"
  AsciiDict(246) = "o"
  AsciiDict(249) = "u"
  AsciiDict(250) = "u"
  AsciiDict(251) = "u"
  AsciiDict(252) = "u"
  AsciiDict(253) = "y"
  AsciiDict(255) = "y"
  AsciiDict(352) = "S"
  AsciiDict(353) = "s"
  AsciiDict(376) = "Y"
  AsciiDict(381) = "Z"
  AsciiDict(382) = "z"
  AsciiDict(258) = "A"
  AsciiDict(259) = "a"
  AsciiDict(272) = "D"
  AsciiDict(273) = "d"
  AsciiDict(296) = "I"
  AsciiDict(297) = "i"
  AsciiDict(360) = "U"
  AsciiDict(361) = "u"
  AsciiDict(416) = "O"
  AsciiDict(417) = "o"
  AsciiDict(431) = "U"
  AsciiDict(432) = "u"
  AsciiDict(7840) = "A"
  AsciiDict(7841) = "a"
  AsciiDict(7842) = "A"
  AsciiDict(7843) = "a"
  AsciiDict(7844) = "A"
  AsciiDict(7845) = "a"
  AsciiDict(7846) = "A"
  AsciiDict(7847) = "a"
  AsciiDict(7848) = "A"
  AsciiDict(7849) = "a"
  AsciiDict(7850) = "A"
  AsciiDict(7851) = "a"
  AsciiDict(7852) = "A"
  AsciiDict(7853) = "a"
  AsciiDict(7854) = "A"
  AsciiDict(7855) = "a"
  AsciiDict(7856) = "A"
  AsciiDict(7857) = "a"
  AsciiDict(7858) = "A"
  AsciiDict(7859) = "a"
  AsciiDict(7860) = "A"
  AsciiDict(7861) = "a"
  AsciiDict(7862) = "A"
  AsciiDict(7863) = "a"
  AsciiDict(7864) = "E"
  AsciiDict(7865) = "e"
  AsciiDict(7866) = "E"
  AsciiDict(7867) = "e"
  AsciiDict(7868) = "E"
  AsciiDict(7869) = "e"
  AsciiDict(7870) = "E"
  AsciiDict(7871) = "e"
  AsciiDict(7872) = "E"
  AsciiDict(7873) = "e"
  AsciiDict(7874) = "E"
  AsciiDict(7875) = "e"
  AsciiDict(7876) = "E"
  AsciiDict(7877) = "e"
  AsciiDict(7878) = "E"
  AsciiDict(7879) = "e"
  AsciiDict(7880) = "I"
  AsciiDict(7881) = "i"
  AsciiDict(7882) = "I"
  AsciiDict(7883) = "i"
  AsciiDict(7884) = "O"
  AsciiDict(7885) = "o"
  AsciiDict(7886) = "O"
  AsciiDict(7887) = "o"
  AsciiDict(7888) = "O"
  AsciiDict(7889) = "o"
  AsciiDict(7890) = "O"
  AsciiDict(7891) = "o"
  AsciiDict(7892) = "O"
  AsciiDict(7893) = "o"
  AsciiDict(7894) = "O"
  AsciiDict(7895) = "o"
  AsciiDict(7896) = "O"
  AsciiDict(7897) = "o"
  AsciiDict(7898) = "O"
  AsciiDict(7899) = "o"
  AsciiDict(7900) = "O"
  AsciiDict(7901) = "o"
  AsciiDict(7902) = "O"
  AsciiDict(7903) = "o"
  AsciiDict(7904) = "O"
  AsciiDict(7905) = "o"
  AsciiDict(7906) = "O"
  AsciiDict(7907) = "o"
  AsciiDict(7908) = "U"
  AsciiDict(7909) = "u"
  AsciiDict(7910) = "U"
  AsciiDict(7911) = "u"
  AsciiDict(7912) = "U"
  AsciiDict(7913) = "u"
  AsciiDict(7914) = "U"
  AsciiDict(7915) = "u"
  AsciiDict(7916) = "U"
  AsciiDict(7917) = "u"
  AsciiDict(7918) = "U"
  AsciiDict(7919) = "u"
  AsciiDict(7920) = "U"
  AsciiDict(7921) = "u"
  AsciiDict(7922) = "Y"
  AsciiDict(7923) = "y"
  AsciiDict(7924) = "Y"
  AsciiDict(7925) = "y"
  AsciiDict(7926) = "Y"
  AsciiDict(7927) = "y"
  AsciiDict(7928) = "Y"
  AsciiDict(7929) = "y"
  AsciiDict(8363) = "d"
  Text = Trim(Text)
  If Text = "" Then Exit Function
  Dim Char As String, _
    NormalizedText As String, _
    UnicodeCharCode As Long, _
    i As Long
 
  For i = 1 To Len(Text)
    Char = Mid(Text, i, 1)
    UnicodeCharCode = AscW(Char)
    If (UnicodeCharCode < 0) Then
  
      UnicodeCharCode = 65536 + UnicodeCharCode
    End If
    If AsciiDict.Exists(UnicodeCharCode) Then
      NormalizedText = NormalizedText & AsciiDict.Item(UnicodeCharCode)
    Else
      NormalizedText = NormalizedText & Char
    End If
  Next
  BoDau = NormalizedText
End Function
 

Code bạn LamNA không đáp ứng được tiêu chí số lượng ký tự của mã phải nhất quán. Code của bác SA_DQ thì nhất quán về số lượng ký tự nhưng trong một số trường hợp như hình ví dụ của bác lại không còn đúng ý nghĩa lấy ký tự đầu của họ tên đưa vô mã. :)

Theo quan điểm cá nhân tôi thì các mã liên quan đến họ tên tôi không dùng ký tự đầu của Họ Tên mà chỉ dùng cách đơn giản nhất là:
- "NV" + Stt (Vd: NV0001).
- Hoặc thêm số năm gia nhập Cty + Stt: NV20190001
Cách này đảm bảo:
- Nhất quán số ký tự.
- Nhất quán nội dung.
- Không tốn thêm code cho việc lấy ký tự đầu.
Mã này chủ yếu để định dạng, liên kết dữ liệu, phục vụ công tác quản lý về mặt dữ liệu chứ không cần phải có ý nghĩa nhiều để người dùng bình thường quan tâm, đọc hiểu v.v.. nên chọn cách tạo mã đơn giản và chuẩn hoá phục vụ tốt cho công tác xử lý dữ liệu là được rồi.
Ý kiến cá nhân là vậy.

Screen Shot 2019-11-22 at 12.50.32 PM.png

Screen Shot 2019-11-22 at 12.52.55 PM.png

Screen Shot 2019-11-22 at 12.52.07 PM.png
 
(2) Code của bác SA_DQ thì nhất quán về số lượng ký tự nhưng trong một số trường hợp như hình ví dụ của bác lại không còn đúng ý nghĩa lấy ký tự đầu của họ tên đưa vô mã.

(1) Theo quan điểm cá nhân tôi thì các mã liên quan đến họ tên tôi không dùng ký tự đầu của Họ Tên mà chỉ dùng cách đơn giản nhất là:
- "NV" + Stt (Vd: NV0001). - Hoặc thêm số năm gia nhập Cty + Stt: NV20190001
Trong bộ mã của bạn có con số 2019 chắc là để biểu thị số năm mà người NV (nhân viên) đó vô CQ làm việc; Đồng ý thôi, nhưng không nên xài thừa thải chuyện trùng lắp như vậy trong bộ mã
Sao ta không xài là J0001 để chỉ cho NV đầu tiên vô CQ trong năm nay, người đầu tiên của năm sau sẽ là K0001, . . . .

(2) Bộ mã của mình có tính tương tác cao giữa người quản lý & người chịu quản lý mà!
 
...
Theo quan điểm cá nhân tôi thì các mã liên quan đến họ tên tôi không dùng ký tự đầu của Họ Tên mà chỉ dùng cách đơn giản nhất là:
- "NV" + Stt (Vd: NV0001).
- Hoặc thêm số năm gia nhập Cty + Stt: NV20190001
...
Thêm "NV" chi vậy? Nó chả giúp thêm được cái gì, ngoài việc ép Excel không dùng số.
Nếu là tôi thì dùng 20190101A (ngày tháng năm và A là người đầu tiên trong ngày, người kế tiếp là B)
Chú: nếu ngày ấy có hơn 26 người (trường hợp rất có thể xảy ra nếu lần đầu tiên nhập mã cho tất cả nhân viên) thì hoặc cho mã chạy luôn sang AA, hay cho "ăn gian" sang ngày 20190102,...
 
Nếu là tôi thì dùng 20190101A (ngày tháng năm và A là người đầu tiên trong ngày, người kế tiếp là B)
Chú: nếu ngày ấy có hơn 26 người (trường hợp rất có thể xảy ra nếu lần đầu tiên nhập mã cho tất cả nhân viên) thì hoặc cho mã chạy luôn sang AA, hay cho "ăn gian" sang ngày 20190102,...
Thường thì CQ ngành may thì số LĐ có biến động lớn khi có hay thiếu đơn hàng
Cho nên cần đề phòng chuyện tuyển hàng loạt cho dây chuyền SX trong 1 ngày
& có thể có trường hợp làm 1 thời gian rồi nghỉ việc, sau 1 thời gian (nghỉ thai sản chẳng hạn) lại quay vô xin tiếp tục làm việc

Trong những trường hợp đó mình đề xuất xài bộ mã NV như sau
J90000 cho người vô CQ đầu tiên trong tháng 9/2019 & người vô CQ đầu tiên của tháng sau là JA0000 & người đầu tiên nhập vô năm tới sẽ là K10000

Chúc mọi người vui vẻ nhân ngày làm việc cuối tuần!
 
Em thấy cách dùng mã của Bác SA_DQ cũng hay vì nhìn vào mã cũng phần nào hình dung ra người đó tên gì.
 
Em thấy cách dùng mã của Bác SA_DQ cũng hay vì nhìn vào mã cũng phần nào hình dung ra người đó tên gì.
Mình xin được phép khoe thêm với 1 số bạn:

Bộ mã của mình giống như con số logaric, nó có phần đặc tính & phần định trị
Điều này cho ta dễ tìm kiếm nhóm người có cùng phần đặc tính (3 kí tự đầu trong mã)

& cũng như bài trước đã đề cặp:
Bạn nào muốn xài bộ mã của mình, hãy gới danh sách HS toàn trường (như #1) sau 5 phút sẽ nhận lại danh sách có mã đầy đủ & hoàn toàn miễn phí!
 
Thêm "NV" chi vậy? Nó chả giúp thêm được cái gì, ngoài việc ép Excel không dùng số.
Nếu là tôi thì dùng 20190101A (ngày tháng năm và A là người đầu tiên trong ngày, người kế tiếp là B)
Chú: nếu ngày ấy có hơn 26 người (trường hợp rất có thể xảy ra nếu lần đầu tiên nhập mã cho tất cả nhân viên) thì hoặc cho mã chạy luôn sang AA, hay cho "ăn gian" sang ngày 20190102,...

:) Đúng là "NV" chỉ để cho biết đây là mã nhân viên chứ không phải mã phòng ban vậy thôi và không phải là số như anh nói.
Dùng ký tự A, B... cuối chuỗi như anh nói thì gặp vụ 26 người trong ngày do đó em dùng là số thứ tự (có thể 2, 3 ký tự: 001, 002) để tránh trường hơp đặc biệt này.

Trong bộ mã của bạn có con số 2019 chắc là để biểu thị số năm mà người NV (nhân viên) đó vô CQ làm việc; Đồng ý thôi, nhưng không nên xài thừa thải chuyện trùng lắp như vậy trong bộ mã
Đối với khoá chính (mã) thì vẫn có thể chứa các thông tin trùng nhau nhưng toàn bộ mã thì bắt buộc không trùng. Cái này cũng tuỳ quan điểm thiết kế như cái ý của bác SA_DQ là dùng J, K thay cho năm cũng được nhưng khó hiểu, nó giống magic number vậy :)
Vd:
KHDL010001 --> Khách hàng + Đại lý + Quận 1 + Số thứ tự
KHBSBT0011 --> Khách hàng + Bán Sỉ + Quận Bình thạnh + Số thứ tự

Cách đặt mã này cũng có nhiều cách biến hoá nhưng theo tôi thì kiểu gì cũng phải đảm bảo:
- Sự chuẩn hoá (kiểu dữ liệu, số ký tự).
- Nhất quán (theo đúng tiêu chí đề ra về mặt nội dung, ý nghĩa, không có ngoại lệ)
- Hệ thống có thể tạo mã tự động khi có đủ thông tin, không cần nhập mã bằng tay để tránh sai sót.
 
Bác SA_DQ ơi, nếu có phát sinh thêm học sinh thì tự gõ tay vào hả Bác? Bác cho luôn code đi.
 
(2) . Cái này cũng tuỳ quan điểm thiết kế như cái ý của bác SA_DQ là dùng J, K thay cho năm cũng được nhưng khó hiểu, nó giống magic number vậy :)
Vd:
(1) KHDL010001 --> Khách hàng + Đại lý + Quận 1 + Số thứ tự
KHBSBT0011 --> Khách hàng + Bán Sỉ + Quận Bình thạnh + Số thứ tự

(1) BT:= Bình Thạnh vậy Bình Tân sẽ là gì vậy bạn? (vui thôi!)
(2) Khoe luôn Mình cũng đã áp dụng mã hóa các ngày trong các thế kỹ sang 3 kí tự như JAB là chỉ đến ngày 11 tháng 10 năm nay & hàm giải mã này lại luôn cho tiện trong việc xử lý tạo khóa chính cho mối quan hệ trong 2 phần của 1 hóa đơn

Bác SA_DQ ơi, nếu có phát sinh thêm học sinh thì tự gõ tay vào hả Bác? Bác cho luôn code đi.
Nếu phát sinh ít (như HS mới chuyển trường) thì lọc theo phần đặc tính & thêm đơn vị cho phần định trị thôi
Nếu đầu năm thì mình sẽ giúp, miễn phí

Còn đưa Code lên đây thì chưa đến lúc, chỉ giải quyết cho những người làm trong ngành GD thôi
 
Em thấy cách dùng mã của Bác SA_DQ cũng hay vì nhìn vào mã cũng phần nào hình dung ra người đó tên gì.

Anh không nói mã theo ký tự đầu của họ tên là không hay mà anh nói nó đụng mấy trường hợp đặc biệt nên không không còn theo tiêu chí ban đầu nên nó không nhất quán.

Cách đặt mã của bác SA_QD dùng ký tự Alphabe thay cho ngày tháng năm thì cũng có Cty anh làm trước đây áp dụng đó là nhãn hàng Pigeon của Nhật bản. Họ dùng qui tắc này để ghi thông tin ngày SX, ngày hết hạn sản phẩm (SP nhập khẩu, SP sản xuất tại Viêt Nam thì ghi ngày tháng bình thường). Mà muốn đọc nó thì phải có bảng mã qui định. :)
 
...
Dùng ký tự A, B... cuối chuỗi như anh nói thì gặp vụ 26 người trong ngày do đó em dùng là số thứ tự (có thể 2, 3 ký tự: 001, 002) để tránh trường hơp đặc biệt này.
...
A, B,... là tiểu xảo để ép Excel phải nhận chuỗi không phải là số.
Bởi là "tiểu xảo" cho nên tôi chỉ nói ra như một mẹo thôi. Nó không hẳn là cách hay/tốt nhất.
 
Các cao nhân giúp em với ạ. Em muốn lấy các ký tự đầu của họ và tên để tạo thành mã nhân viên thì nên dùng hàm nào được ạ.
Em có gửi file đính kèm bên dưới ạ. Mong được mọi người chỉ giúp. em cám ơn!
Dùng cột phụ
 

File đính kèm

  • FILE THUC HANH EXCEL.xlsx
    11.1 KB · Đọc: 7
Xuất phát điểm từ cái tên dài nhất VN theo mình là 6 từ; Nên mình gợi ý với chủ đề tài là tạo mã NV luôn 7 kí tự (kể cả kí số) như bảng dưới đây:

STTHọTên Mã NVChức vụNgày sinh
1Bùi ĐứcCườngBJC4561Kế toán
2/6/1991​
2Bùi ĐứcCươngBJC4562Giám đốc
11/20/1974​
3Bùi Thị TúÂnBTTA453Phó giám đốc
2/19/2000​
4Công Tằng Tôn Nữ MinhNguyệtCTTNMN4Kế toán
2/10/1996​
5Công Tằng Tôn Nữ NguyệtMinhCTTNNM5Thủ quỹ
7/15/1977​
6Hà MạnhCườngHMC4566Phó giám đốc
7/26/1995​
7Nguyễn KimYếnNKY4567
8/5/2003​
8Phan TrungKiênPTK4568
8/16/2001​
9HoàiCươngHC_4569
8/26/2002​
Nếu bạn nào đồng ý thì thực hiện theo macro sau:

PHP:
Sub TaoMa7()
Dim Rws As Long, J As Long, VTr As Byte
Dim HoDem As String, MaNV As String
Const KT As String = " "

With Sheet1
    Rws = .[B2].CurrentRegion.Rows.Count
End With
For J = 2 To Rws
    HoDem = Trim$(Cells(J, "B").Value) & KT  'Giai Quyêt Ho & Dem        '
    Do
        MaNV = MaNV & LoaiDauTV(Left(HoDem, 1))
        VTr = InStr(HoDem, KT)
        If VTr < 2 Then Exit Do Else HoDem = Mid(HoDem, VTr + 1, Len(HoDem))
    Loop
    MaNV = MaNV & LoaiDauTV(Left(Cells(J, "C").Value, 1))
    If Len(MaNV) = 2 Then MaNV = MaNV & "_"
    Cells(J, "D").Value = Left(MaNV & "4567", 6) & CStr(Cells(J, "A").Value Mod 10)
    MaNV = ""
Next J
End Sub
Mã:
Function LoaiDauTV(ByVal Text As String) As String
Dim Charcode(), ResTxt(), I As Long, Tmp As String

Tmp = Text
Charcode = Array(224, 225, 226, 227, 259, 7841, 7843, 7845, 7847, 7849, 7851, 7853, 7855, 7857, 7859, 7861, _
    7863, 273, 232, 233, 234, 7865, 7867, 7869, 7871, 7873, 7875, 7877, 7879, 236, 237, 297, 7881, 7883, 242, _
        243, 244, 245, 417, 7885, 7887, 7889, 7891, 7893, 7895, 7897, 7899, 7901, 7903, 7905, 7907, 249, 250, _
            361, 432, 7909, 7911, 7913, 7915, 7917, 7919, 7921, 253, 7923, 7925, 7927, 7929)
ResTxt = Array("a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", _
    "J", "e", "e", "e", "e", "e", "e", "e", "e", "e", "e", "e", "i", "i", "i", "i", "i", "o", "o", _
        "o", "o", "o", "o", "o", "o", "o", "o", "o", "o", "o", "o", "o", "o", "o", "u", "u", "u", "u", "u", _
            "u", "u", "u", "u", "u", "u", "y", "y", "y", "y", "y")      'd'
For I = 0 To UBound(Charcode)
    Tmp = Replace(Tmp, ChrW(Charcode(I)), ResTxt(I))
    Tmp = Replace(Tmp, UCase(ChrW(Charcode(I))), UCase(ResTxt(I)))
Next
LoaiDauTV = Tmp
End Function
 
Lần chỉnh sửa cuối:
Xem đúng ý bạn không nhé hi!!!
 

File đính kèm

  • FILE THUC HANH EXCEL_reply.xlsx
    10.4 KB · Đọc: 10
Web KT
Back
Top Bottom