Các phương pháp tách họ và tên đề nghị post ở đây

Liên hệ QC
Chuyển chuỗi họ tên (CHT) bất kỳ thành chuỗi gồm 3 kí tự viết hoa (VH), mà trong đó:

(*) Nếu CHT chỉ có 2 từ thì thêm kí tự 'J' vô giữa
Như Võ Trữ => VJT


(*) Nếu CHT gồm hơn 3 từ thì chỉ lấy ký tự đầu tiên (VH) của từ đầu & 2 kí tự (VH) đầu tiên của 2 từ cuối
Như Ngô Ngọc Bảo Trâm => NBT

(*) Nếu Kí tự cần lấy là chữ 'Đ' thì chuyển thành 'F'
Nhằm mục đích tạo mã toàn chữ cái tiếng Anh & cũng để bớt trùng mã CHT tiếng Việt
Như Đỗ Đại Việt => FFV

(*) Các nguyên âm đầu từ cần lấy làm mã sẽ chuyển sang nguyên âm tiếng Anh tương ứng.
Như Ôn => O; Âu => A; Ửng => U,. . . . .

Nếu các bạn thấy còn trường hợp nào khác, thì đưa lên giúp tôi, để chúng ta cùng trao đổi

Rất cảm ơn các bạn!
có trường hợp tên có 5 từ hay 6 từ thì sao
Công Tằng Tôn Nữ Cẩm Tuân
chưa kể khi mã hóa sẽ có những ký tự giống nhau nữa, sau khi mã hóa xong dò lại bằng cách nào?
 
có trường hợp tên có 5 từ hay 6 từ thì sao
Công Tằng Tôn Nữ Cẩm Tuân
(*) Chưa kể khi mã hóa sẽ có những ký tự giống nhau nữa, sau khi mã hóa xong dò lại bằng cách nào?

Công Tằng Tôn Nữ Ái Như => CAN

(*) Việc trùng mã sẽ có sẩy ra; khi đó ta lại thêm 2 kí tự hay kí số fía sau để phân biệt, như
Ngô Viết Toàn := NVT00
Nguyễn Thị Vũ Thư := NVT99
Nhưng trước khi thêm ta sẽ phải sắp xếp dữ liệu theo cột mã mới tạo này & kiểm tra tính chính xác của hàm tạo mã này.
 
Công Tằng Tôn Nữ Ái Như => CAN

(*) Việc trùng mã sẽ có sẩy ra; khi đó ta lại thêm 2 kí tự hay kí số fía sau để phân biệt, như
Ngô Viết Toàn := NVT00
Nguyễn Thị Vũ Thư := NVT99
Nhưng trước khi thêm ta sẽ phải sắp xếp dữ liệu theo cột mã mới tạo này & kiểm tra tính chính xác của hàm tạo mã này.
cái này của bạn cũng khá rõ ràng, để một số thành viên khác vào sẽ giúp bạn vì tôi không sử dụng máy tính
tôi chỉ nói cách làm
kiểm tra tên có 2 từ hay hơn
nếu có 2 từ thì thêm ký tự J
nếu có hơn 2 từ thì lấy ký tự của từ đầu và 2 ký tự của 2 từ cuối( có thể mã hóa ký tự Đ)
đưa vào DIC các ký tự mã hóa kèm theo ký số tăng theo, thứ tự từ 0 đến 99 thì sẽ tạo ra được danh sách mã theo yêu cầu của bạn
 
Lần chỉnh sửa cuối:
cái này của bạn cũng khá rõ ràng, để một số thành viên khác vào sẽ giúp bạn vì tôi không sử dụng máy tính
tôi chỉ nói cách làm
kiểm tra tên có 2 từ hay hơn
nếu có 2 từ thì thêm ký tự J
nếu có hơn 2 từ thì lấy ký tự của từ đầu và 2 ký tự của 2 từ cuối( có thể mã hóa ký tự Đ)
đưa vào DIC các ký tự mã hóa kèm theo ký số tăng theo, thứ tự từ 0 đến 99 thì sẽ tạo ra được danh sách mã theo yêu cầu của bạn

Cũng không biết chủ Topic dùng để làm gì, chứ nếu chỉ là việc tạo mã thì việc có 1 table tham chiếu từ mã sang tên là rất bình thường với mã số được đánh thứ tự lần lượt.

Việc tách họ tên ra tạo mã theo ý kiến cá nhân là không ổn và nhìn vào số lượng mã số lớn thì nó lổn nhổn, nhấp nhô, không đẹp.

Nếu bạn chủ Topic dùng phương pháp table mã số - họ tên với mã số theo quy luật tăng dần thì sẽ thuận tiện hơn.
 
Cảm ơn khuongvietphong rất nhiều! rất hữu ích! Cho mình hỏi thêm nếu có thêm
(118)110315-(86)110515-(48)110615
hoặc
(118)110315-(86)110515-(48)110615-(5)021516
thì công thức triển khai như thế nào? xin bạn chỉ giúp
Một lần nửa xin cảm ơn rất nhiều!

Nếu thế thì phải làm bằng VBA thôi chứ công thức chắc "chớt" quá. Bạn xem File này nha
 

File đính kèm

  • tách lấy số.xls
    39 KB · Đọc: 13
Nếu thế thì phải làm bằng VBA thôi chứ công thức chắc "chớt" quá. Bạn xem File này nha

Chi mà vừa VBA vừa Công thức cực thế chàng Phong. Thế này có được hem?

Mã:
B1 =TRIM(MID(SUBSTITUTE(SUBSTITUTE(MID($A1,2,LEN($A1)),"-(",")"),")",REPT(" ",255)),COLUMNS($A:A)*255-254,255))
 
Công Tằng Tôn Nữ Ái Như => CAN

(*) Việc trùng mã sẽ có sẩy ra; khi đó ta lại thêm 2 kí tự hay kí số fía sau để phân biệt, như
Ngô Viết Toàn := NVT00
Nguyễn Thị Vũ Thư := NVT99
Nhưng trước khi thêm ta sẽ phải sắp xếp dữ liệu theo cột mã mới tạo này & kiểm tra tính chính xác của hàm tạo mã này.
Gởi bạn bài tham khảo. tôi viết code theo cây nhà lá vườn, các lỗi lầm bạn tự bẫy. tôi chỉ làm theo ý tưởng của bài thôi, hy vọng đúng yêu cầu của bạn

Function MATEN(HoTen As String) As String
Dim temp As String
Dim SoKhoanTrang As Byte
Dim Dem As Byte
HoTen = Trim(HoTen)
HoTen = Replace(HoTen, ChrW(272), "F")
temp = Replace(HoTen, " ", "")

SoKhoanTrang = Len(HoTen) - Len(temp)
If SoKhoanTrang = 1 Then
For i = 1 To Len(HoTen)
If (Mid(HoTen, i, 1) = " ") Then
MATEN = Mid(HoTen, i + 1, 1)
End If
Next
MATEN = Left(HoTen, 1) & "J" & MATEN
Else
For i = Len(HoTen) To 2 Step -1
If (Mid(HoTen, i, 1) = " ") Then
MATEN = Mid(HoTen, i + 1, 1) & MATEN
Dem = Dem + 1
End If
If (Dem = 2) Then Exit For

Next
MATEN = Left(HoTen, 1) & MATEN

End If

End Function
Sub MaHoa()
Dim Arr_N()
Dim Arr_D()
Dim i As Long
Dim J As Long
Dim temp As String
Dim dongcuoi as Long
Arr_N = Sheet1.Range("A1:A28")
ReDim Arr_D(1 To 28, 1 To 3)

For i = 1 To 28
temp = Arr_N(i, 1)
Arr_D(i, 1) = MATEN(temp)
Next
dongcuoi = 1
While (dongcuoi <= 28)
Dem = 0
For i = 1 To dongcuoi
If Arr_D(dongcuoi, 1) = Arr_D(i, 1) Then
Dem = Dem + 1
End If
Next
Arr_D(dongcuoi, 2) = Dem
dongcuoi = dongcuoi + 1
Wend
For i = 1 To 28
Arr_D(i, 1) = Arr_D(i, 1) & Format(Arr_D(i, 2), "00")
Next
Sheet1.Range("B1").Resize(28, 1) = Arr_D
End Sub
 

File đính kèm

  • GPE.xlsb
    19 KB · Đọc: 8
Lần chỉnh sửa cuối:
Gởi bạn bài tham khảo. tôi viết code theo cây nhà lá vườn, các lỗi lầm bạn tự bẫy. tôi chỉ làm theo ý tưởng của bài thôi, hy vọng đúng yêu cầu của bạn
Chú Phi chưa làm cái này (công nhận code....hoành tráng thật)
Nguyên văn bởi Hoang2013
Chuyển chuỗi họ tên (CHT) bất kỳ thành chuỗi gồm 3 kí tự viết hoa (VH), mà trong đó:

.................

(*) Các nguyên âm đầu từ cần lấy làm mã sẽ chuyển sang nguyên âm tiếng Anh tương ứng.
Như Ôn => O; Âu => A; Ửng => U,. . . . .

..........

Nếu giữa 3 ký tự đầu và 2 ký tự "số" đằng sau có thêm dấu "-" thì có thể sẽ dễ nhìn hơn nhỉ ???
Đến ngày 8/3 đem....mực lên chơi tiếp nhé (nhớ cắt gọn ghẽ, đừng để dính như vừa rồi, "nguy hiểm" quá)
Thân
 
Chú Phi chưa làm cái này (công nhận code....hoành tráng thật)

Nếu giữa 3 ký tự đầu và 2 ký tự "số" đằng sau có thêm dấu "-" thì có thể sẽ dễ nhìn hơn nhỉ ???
Đến ngày 8/3 đem....mực lên chơi tiếp nhé (nhớ cắt gọn ghẽ, đừng để dính như vừa rồi, "nguy hiểm" quá)
Thân
mấy cái bỏ dấu đó để cho người ta tự làm đi thầy, mấy cái bỏ dấu đó người ta biết làm mà, 8/3 này thì hơi gấp, nhưng mà nếu thầy rảnh thì ok thôi, 90% là chắc chắn có mồi
 
Mình thấy cách làm của bạn khá hay với đơn giản
 
Toán: 4.50 Ngữ văn: 2.50 Vật lí: 6.00 Hóa học: 5.20 Sinh học: 5.60 Tiếng Anh: 3.40
dùng công thúc gì tách lấy điểm thi môn toán, hóa, sinh
mong các cao thủ giúp dùm e
 
Code VBA Tách tên:

'yeu Cau: Full Name dang "Ho [Lot ]Ten"
Function Tach_Ten(Ten As String)
Tach_Ten = Split(Ten, " ")(UBound(Split(Ten, " ")))
End Function
 

File đính kèm

  • a.xls
    37 KB · Đọc: 6
Theo mình thì nên linh động trong cách sử dụng hàm:
- Nếu chỉ thao tác trên lượng data ít, thì chỉ cần sử dụng các hàm LEFT, RIGHT, FIND như bạn tedaynui
- Còn ngược lại, nếu có một danh sách họ tên thật dài, thì nên viết macro.
 
mình dùng hàm như bạn tedaynui

Giả sử ô A1 có chứa "Họ Chữ lót Tên"
Lấy Họ :
=LEFT(A4,FIND(" ",A4,1))

Lấy Họ và Chữ lót :
=LEFT(A4,FIND("*",SUBSTITUTE(A4," ","*",LEN(A4)-LEN(SUBSTITUTE(A4," ",""))))-1)

Lấy Tên :
=RIGHT(A1,LEN(A1)-FIND("*",SUBSTITUTE(A1," ","*",LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))

Nhưng trong ô tên ví dụ có chữ HT hoặc (HT) nằm cuối cùng thì mình muốn loại bỏ các chữ đó và lấy từ cuối cùng trước chữ HT hoặc (HT) thì sửa công thức thế nào ạ?

Ví dụ ô có chứa:
aa bb cc HT - muốn lấy chữ cc
aa bb cc dd (HT) - muốn lấy chữ dd
 
Web KT
Back
Top Bottom