Cắt họ tên không cần VBA

Liên hệ QC

phihndhsp

Thành viên gạo cội
Tham gia
26/12/09
Bài viết
3,363
Được thích
2,488
Giới tính
Nam
Nghề nghiệp
Giáo Viên
Vừa rồi vào
http://www.giaiphapexcel.com/forum/showthread.php?50314-Gi%C3%BAp-X%E1%BB%AD-l%C3%BD-chu%E1%BB%97i-d%E1%BB%AF-li%E1%BB%87u-g%E1%BB%93m-c%E1%BA%A3-k%C3%BD-t%E1%BB%B1-v%C3%A0-s%E1%BB%91
xem bài của bạn huuthang_bd. Tôi n[FONT=&quot]ả[/FONT]y ra m[FONT=&quot]ộ[/FONT]t ý là, t[FONT=&quot]ạ[/FONT]i sao mình không s[FONT=&quot]ử[/FONT] d[FONT=&quot]ụ[/FONT]ng nh[FONT=&quot]ữ[/FONT]ng công th[FONT=&quot]ứ[/FONT]c này đ[FONT=&quot]ể[/FONT] c[FONT=&quot]ắ[/FONT]t h[FONT=&quot]ọ[/FONT] tên mà không c[FONT=&quot]ầ[/FONT]n t[FONT=&quot]ớ[/FONT]i VBA
Và sau m[FONT=&quot]ộ[/FONT]t h[FONT=&quot]ồ[/FONT]i tôi mày mò thì tôi đã làm đ[FONT=&quot]ượ[/FONT]c bài c[FONT=&quot]ắ[/FONT]t h[FONT=&quot]ọ[/FONT] tên mà không c[FONT=&quot]ầ[/FONT]n dùng VBA
Tôi th[FONT=&quot]ấ[/FONT]y đúng vô cùng, tôi mu[FONT=&quot]ố[/FONT]n up lên đ[FONT=&quot]ể[/FONT] các bác xem có gì sai xót thì góp ý dùm nha, xin chân thành c[FONT=&quot]ả[/FONT]m [FONT=&quot]ơ[/FONT]n
Cảm ơn huuthang_bd nhiều
 

File đính kèm

Lần chỉnh sửa cuối:
bài này chuẩn hơn 1 tí
 

File đính kèm

bài này chuẩn hơn 1 tí
Bạn gõ "Tách họ tên" vào ô tìm kiếm thử xem, từ năm 2006 đã có rất nhiều bài viết về vấn đề này bằng cả code và hàm.
Vì Bạn xài không phải EX 2003 nên tôi không đọc được File của Bạn nên không biết công thức của Bạn có "ngắn gọn hơn" không.
 
Lần chỉnh sửa cuối:
Bài toán cắt tên đã có rất nhiều trên diễn đàn rồi. Và đa số dùng công thức chứ không dùng VBA đâu bạn.

Công thức tách tên của bạn rất ngắn =TRIM(RIGHT(SUBSTITUTE(TRIM(B8)," ",REPT(" ",255)),255)),
tôi thấy ngắn nhất từ trước đến nay (so với những bài tôi đã đọc), nhưng tách họ bạn làm như vậy hơi dài dòng, lẽ ra bạn làm như vầy là chuẩn: =TRIM(SUBSTITUTE(B8,C8,""))
 
Công thức tách tên của bạn rất ngắn =TRIM(RIGHT(SUBSTITUTE(TRIM(B8)," ",REPT(" ",255)),255)),
tôi thấy ngắn nhất từ trước đến nay (so với những bài tôi đã đọc), nhưng tách họ bạn làm như vậy hơi dài dòng, lẽ ra bạn làm như vầy là chuẩn: =TRIM(SUBSTITUTE(B8,C8,""))
Bậy à nha!
Vụ này nói nhiều lần rồi mà ---> Tên Nguyễn Văn Văn thì công thức của bạn ra kết quả gì ---> Nói chung là không thể dùng SUBSTITUTE được
 
Bậy à nha!
Vụ này nói nhiều lần rồi mà ---> Tên Nguyễn Văn Văn thì công thức của bạn ra kết quả gì ---> Nói chung là không thể dùng SUBSTITUTE được

À quên, SUBSTITUTE có thêm cái đối số nữa, cho nên phải như vầy là chuẩn: =TRIM(SUBSTITUTE(B8,C8,"",1))
 
tôi thử công thức của tôi Nguyễn Văn V và Nguyễn Văn Văn cũng ra mà các bác thử lại tí xem
 
Bạn dùng công thức đó tách tên này coi: Nguyễn Văn V

OK, nếu ép nhau cái tên như vậy thì chịu chết thôi! Mình mà có con cái nỡ lòng nào đặt tên con với 1 ký tự nhỉ? Nếu đặt tên con là B, thích thì người ta gọi là Bê, vui thì gọi là Bi, buồn thì gọi là Bờ. Cái tên này con người đọc đã thấy đuối huống chi là máy tính. Sặc ... Sặc ...
 
Lần chỉnh sửa cuối:
OK, nếu ép nhau cái tên như vậy thì chịu chết thôi! Mình mà có con cái nỡ lòng nào đặt tên con với 1 ký tự nhỉ? Nếu đặt tên con là B, thích thì người ta gọi là Bê, vui thì gọi là Bi, buồn thì gọi là Bờ. Cái tên này con người đọc đã thấy đuối huống chi là máy tính. Sặc ... Sặc ...
Bời vậy mới nói SUBSTITUTE không dùng được.
Người ta đặt tên gì mặc kệ, miễn bảo đảm rằng:
- Nếu chuổi là 1 từ thì đó là TÊN, không có họ
- Nếu chuổi từ 2 từ trở lên thì từ cuối là TÊN, các từ còn lại là HỌ và CHỮ LÓT
vậy thôi
------------
Ngoài ra, cứ cho rằng TÊN không bao giờ là 1 ký tự. Vậy nếu tên là Nguyễn Văn Nguyễn hoặc Quách văn Quá thì hợp lệ chứ
Ẹc.. Ẹc...
 
Lần chỉnh sửa cuối:
OK, nếu ép nhau cái tên như vậy thì chịu chết thôi! Mình mà có con cái nỡ lòng nào đặt tên con với 1 ký tự nhỉ? Nếu đặt tên con là B, thích thì người ta gọi là Bê, vui thì gọi là Bi, buồn thì gọi là Bờ. Cái tên này con người đọc đã thấy đuối huống chi là máy tính. Sặc ... Sặc ...
Bó tay. Tên người ta đặt sao đặt chứ. Ai mà cấm được. Theo bạn thì tên LÝ THỊ NHƯ Ý có đẹp không?
tôi thử công thức của tôi Nguyễn Văn V và Nguyễn Văn Văn cũng ra mà các bác thử lại tí xem
Công thức của bạn đúng rồi.
 
Bời vậy mới nói SUBSTITUTE không dùng được.
Người ta đặt tên gì mặc kệ, miễn bảo đảm rằng:
- Nếu chuổi là 1 từ thì đó là TÊN, không có họ
- Nếu chuổi từ 2 từ trở lên thì từ cuối là TÊN, các từ còn lại là HỌ và CHỮ LÓT
vậy thôi

Nói vậy thôi, chứ việc bạn phihndhsp tách tên là thấy ngắn nhất rồi, còn việc tách họ chỉ là phụ họa, nếu bảo tách họ không thôi (không bắt tách tên) thì cái công thức đó cũng không xài được!
 
Thế bi giớ tui có cột Họ & Tên, ở cell kế bên tui hổng muốn lấy Tên, tui chỉ muốn lấy Họ & Lót
Vậy tui phải quánh công thức nào???
 
Thế bi giớ tui có cột Họ & Tên, ở cell kế bên tui hổng muốn lấy Tên, tui chỉ muốn lấy Họ & Lót
Vậy tui phải quánh công thức nào???
Trời... có gì đâu anh! Cùng lắm là copy nguyên công thức ở cột B, paste vào công thức ở cột C
Như vầy đây:
PHP:
=LEFT(TRIM(B8),LEN(TRIM(B8))-LEN(TRIM(RIGHT(SUBSTITUTE(TRIM(B8)," ",REPT(" ",255)),255))))
Vân vân... và còn nhiêu cách khác nữa
 
Thế bi giớ tui có cột Họ & Tên, ở cell kế bên tui hổng muốn lấy Tên, tui chỉ muốn lấy Họ & Lót
Vậy tui phải quánh công thức nào???
Thiếu gì cách hả Bác. Bí quá thì gộp 2 công thức lại.
Công thức tách tên ở B8:
Mã:
=TRIM(RIGHT(SUBSTITUTE(TRIM(B8)," ",REPT(" ",255)),255))
Công thức lấy họ và chữ lót:
Mã:
=LEFT(TRIM(B8),LEN(TRIM(B8))-LEN(C8))
Gộp lại thì như thế này:
Mã:
=LEFT(TRIM(B8),LEN(TRIM(B8))-LEN(TRIM(RIGHT(SUBSTITUTE(TRIM(B8)," ",REPT(" ",255)),255))))
 
Bàn với nhau để tìm ra cái nào mới hơn thôi, giờ search lại trên diễn đàn ta, cách nào cũng đã có rồi, kể cả cách bạn phihndhsp làm, vào link dưới đây sẽ thấy rất rõ:
http://www.giaiphapexcel.com/forum/...tên-đề-nghị-post-ở-đây&p=127496#post127496

Sau đây là kết quả. Chỉ với kết quả lấy tên (Không lấy Họ , không lấy Tên đệm), dữ liệu là 50.000 Cells

VBA

Pi_Pokachu:
PHP:
Function TachTenPo(HoTen As String, Optional Vitri As Byte = 1) As String
' Po_PiKachu
'Vtri = 1: Ho ; Vtri = 2: TenLot ; Vtri = 3: Ten ; Vtri = 4: HoTenlot
    Dim arr() As String
    Dim K As Long
    arr() = Split(HoTen, " ")
    K = UBound(arr)
    TachTenPo = Choose(Vitri, arr(0), Trim(Replace(Replace(HoTen, arr(K), ""), arr(0), "")), _
                       arr(K), Trim(Replace(HoTen, arr(K), "")))
End Function
Ca_Dafi :
PHP:
Function TachTenCa(HoTen As String, Optional Vitri As Byte = 1)
'ca dafi
'Vtri = 1: Ten ; Vtri = 2: Ho ; Vtri = 3: TenLot ; Vtri = 4: HoTenlot
    If IsNull(HoTen) Or HoTen = "" Then TachTenCa = "error": Exit Function
    Dim Ten, Ho, TenLot, HoTenlot
    Ten = Trim(Right(Replace(HoTen, " ", Space(100)), 100))
    Ho = Trim(Left(Replace(HoTen, " ", Space(100)), 100))
    TenLot = Trim(Replace(Replace(HoTen, Ten, ""), Ho, ""))
    HoTenlot = Trim(Left(HoTen, Len(HoTen) - Len(Ten)))
    TachTenCa = Choose(Vitri, Ten, Ho, TenLot, HoTenlot)
End Function
NDU

PHP:
Function TachTenNDU(Hovaten As String) As String
' Bac NDU
  TachTenNDU = Trim(Right(Replace(Hovaten, " ", Space(255)), 255))
End Function

Công thức (NonVBA)
Bác BNTT
PHP:
=TRIM(RIGHT(SUBSTITUTE(A2;" ";REPT(" ";255));255))

Pro|Rows|Times (Milisecond)
Po_Pikachu|50.000|1.544
Ca_Dafi|50.000|1.633
HVL|50.000|1.517
NDU|50.000|1.046
BNTT|50.000|72.138
Hơi ngạc nhiên nhưng như vậy có nghĩa rằng VBA có thế mạnh của nó

Thân!
 
Lần chỉnh sửa cuối:
Ý mình hỏi là cái này nè
Vân vân... và còn nhiêu cách khác nữa
Híc
Ví dụ 1 cách dùng Evaluate
- Đặt con trỏ chuột tại dòng 8, đặt 1 name:
PHP:
Tmp=EVALUATE("{"""&SUBSTITUTE(TRIM($B12)," ",""",""")&"""}")
- Công thức lấy TÊN:
PHP:
=INDEX(Tmp,,COUNTA(Tmp))
- Công thức lấy HỌ VÀ CHỮ LÓT
PHP:
=LEFT(TRIM($B8),LEN(TRIM($B8))-LEN(INDEX(Tmp,,COUNTA(Tmp))))
Giải thuật này tương đương với Split trong VBA
 

File đính kèm

Tôi thử công thức của tui tên Nguyễn Văn NguyễnQuách văn Quá thì thấy đúng mà
và tôi thử tên Nguyễn hoặc A hoặc B ... vẫn đúng mà các bác xem lại dùm công thức của tôi nha, xin chân thành cảm ơn
 
Web KT

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

Back
Top Bottom