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

  • Thread starter Thread starter daerty5
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

daerty5

Thành viên mới
Tham gia
2/7/07
Bài viết
4
Được thích
28
Khi nhập liệu vào bảng tính Excel, thông thường ta nhập cả họ và tên vào cùng một ô. Tuy nhiên, có khi sau đó ta cần phải tách riêng tên ra khỏi họ và tên đệm, nếu làm thủ công bằng thao tác sao chép rồi dán qua ô khác thì sẽ rất bất tiện. Ngoài ra có những lúc bạn phải xắp xếp lại theo thứ tự A,B,C,...
Nếu sử dụng hàm Right kết hợp với một vài hàm khác thì cũng có thể cho ra kết quả như bạn muốn, nhưng trong một số trường hợp sẽ cho kết quả không chính xác. Có một phương pháp tối ưu hơn sẽ giúp bạn hoàn thành tốt công việc này, cách thực hiện cũng khá đơn giản như sau:
- Trên bảng tính chứa cột họ tên cần tách, bạn chọn menu Tools > Macro > Visual Basic Editor, lập tức xuất hiện chương trình Microsoft Visual Basic.
- Tiếp theo, bạn nhấn menu Insert và chọn Module sẽ xuất hiện một cửa sổ soạn thảo.
Mã:
Private Function Tachten(ten As String, lg As Integer)
Dim j As Integer
     Name = Trim(ten)
  For j = Len(Name) To 1 Step -1
    If Mid(Name, j, 1) = " " Then
       If lg = "1" Then
          Tachten = Right(Name, Len(Name) - j)
       Else
          Tachten = Left(Name, j)
       End If
  Exit For
    End If
  Next
End Function

Bạn nhập đoạn mã lệnh sau vào cửa sổ soạn thảo:

- Bạn nhấn Ctrl+S để lưu lại và quay trở về bảng tính Excel.
- Bây giờ để tiến hành tách riêng họ và tên đệm vào một ô mới, bạn đặt con trỏ tại ô mới chứa họ và tên đệm rồi nhập vào công thức =TachTen(B3,0) và nhấn Enter sẽ thấy ngay kết quả.
- Để tách riêng tên vào một ô mới, bạn đặt con trỏ tại ô sẽ chứa tên cần tách và nhập vào công thức =TachTen(B3,1) rồi nhấn Enter là xong.
Ghi chú: B3 chính là địa chỉ của ô ban đầu chứa cả họ, tên đệm và tên.


bạn xem thử code nhé:
HTML:
Function CatTen(HoVaTen As String) As String
Dim l, i As Integer
HoVaTen = Trim(HoVaTen)
l = Len(HoVaTen)
CatTen = ""
For i = l To 1 Step -1
If Mid(HoVaTen, i, 1) = Space(1) Then
k = i
Exit For
End If
Next i
CatTen = Mid(HoVaTen, i + 1)
End Function
Có mấy góp ý sau :
- Bạn nên hướng dẫn mọi người cách sử dụng, hàm này có tác dụng như thế nào ??
- Việc khai báo các biến cần đầy đủ và tường minh hơn
- Dòng : CatTen = "" là thừa, biến l là thừa
- Hãy bẫy lỗi khi HoVaTen = ""
- Nếu hàm này chỉ cắt mỗi tên thôi thì e rằng . . phí quá. hãy cho cái Option để có thể lấy HỌ - TÊN ĐỆM - TÊN
- Trên GPE có các hàm như thế này rất nhiều rồi và đã tối ưu, bạn nên tham khảo nhé.

--Chúc vui--
 

File đính kèm

  • a.xls
    a.xls
    15 KB · Đọc: 4,559
Chỉnh sửa lần cuối bởi điều hành viên:
Tách họ và tên

ĐÂY LÀ CÁCH TÔI ĐÃ HỌC ĐƯỢC TRÊN DIỄN ĐÀN VÀ ĐANG THỰC HIỆN, XIN CHIA SẺ CÙNG BẠN:

Từ file EXCEL có chứa dữ liệu bạn đang muốn tách họ và tên - bạn hãy nhấn Alt + F11 sau đó nhấn insert nhấn module dán đọan mã sau vào trong cửa sổ module:

Private Function Tachten(ten As String, lg As Integer)
Dim j As Integer
Name = Trim(ten)
For j = Len(Name) To 1 Step -1
If Mid(Name, j, 1) = " " Then
If lg = "1" Then
Tachten = Right(Name, Len(Name) - j)
Else
Tachten = Left(Name, j)
End If
Exit For
End If
Next
End Function


SỬ DỤNG HÀM TÍNH TÁCH HỌ VÀ TÊN:
Giả sử bạn muốn tách tên ra khỏi họ và họ đệm tại ô A1 = Phạm Xuân Trường / Gõ = tachten(A1,0) / Kết quả: Phạm Xuân
Giả sử bạn muốn tách tên ra khỏi họ và họ đệm tại ô A1 = Phạm Xuân Trường / Gõ = tachten(A1,1) / Kết quả: Trường


(Nếu muốn sử dụng hàm này cho tòan excel bạn hãy đọc thêm trên diễn đàn này)

Chúc bạn thành công !
 
Hàm vả thủ tục tách họ tên

Họ tên thường nhập chung 1 cột cho nhanh. Sau đó ta có thể tách riêng tên ra 1 cột. Nhưng có lúc chúng ra cần tách ra 2 cột: cột họ, cột tên. Đây là 2 làm làm công việc đó:
'======================
Function TachHo(hoten As String) As String
hoten = Trim(hoten)
If hoten = "" Then
TachHo = ""
Else
vt = InStrRev(hoten, " ", Len(hoten))
If vt = 0 Then
TachHo = ""
Else
TachHo = Trim(Mid(hoten, 1, vt))
End If
End If
End Function

'====================
Function TachTen(hoten As String) As String
hoten = Trim(hoten)
If hoten = "" Then
TachTen = ""
Else
vt = InStrRev(hoten, " ", Len(hoten))
If vt = 0 Then
TachTen = hoten
Else
TachTen = Mid(hoten, vt + 1)
End If
End If
End Function

'===================
Bạn sử dụng hàm này bình thường như các hàm khác của Excel, nhưng nếu bạn cần tách họ tên thành 2 cột riêng biệt thì bạn phải thực hiện một loạt các thao tác sau:
1. tách họ, tách tên trên 2 cột phụ
2. chèn thêm cột bên trái cột họ tên
3. Copy 2 cột họ tên mới tách và dán bằng Paste Special - Value trở về nơi cũ.
Để làm nhanh các công việc đó, bạn có thể sử dụng thủ tuc TachHoTen.
Sử dụng thủ tục này như sau:
1. Chọn tất cả các ô chứa họ tên, kể cả ô chứa tiêu đề trên đầu.
2. Chạy Sub TachHoTen.
VBA sẽ làm thay cho bạn các việc còn lại. Lưu ý bạn là số cột trong vùng chọn phải là 1, nếu lớn hơn 1 VBA không thực hiện.

'====================
Sub TachHoTen()
rd = Selection.Row
sr = Selection.Rows.Count
rc = rd + sr - 1
c = Selection.Column
sc = Selection.Columns.Count
If sc > 1 Then
MsgBox "Ban chon " & sc & " cot. Ban phai chon lai 1 cot", vbOKOnly, "Thong bao"
Exit Sub
End If
Range(Cells(rd, c), Cells(rc, c)).Insert Shift:=xlToRight
Range(Cells(rd, c), Cells(rc, c)).Insert Shift:=xlToRight
For r = rd To rc
Cells(r, c) = TachHo(Cells(r, c + 2))
Cells(r, c + 1) = TachTen(Cells(r, c + 2))
Next
Range(Cells(rd, c + 2), Cells(rc, c + 2)).Delete Shift:=xlToLeft
End Sub
'==============
Bạn có thể tham khảo trong tập tin TachHoTen.zip
 

File đính kèm

Bác Chibi ơi, Bác có thể giúp mình hiểu thêm 1 tí không? Mình cũng muốn tách họ tên, nhưng mình không biết Visual Basic, Bác có thể "chỉ vài chiêu" cho mình không? chỉ cần tỉ mỉ 1 chút để làm được cái tách tên mà bác chỉ ở trên thôi. Cảm ơn bác nhiều nhiều
1- Khởi động EXCEL
2- Vào VBE bằng cách Alt+F11
3- Insert Modul
4- Nhập đoạn code trên
5- Nếu cần phong cấp cho hàm thì Save với File type là AddIns, sau đó dùng chức năng Tools->AddIns để khai báo sử dụng trên mọi Workbook.
6- Sử dụng: =tach_ten(hoten) - Họ tên có thể nhập trực tiếp hoặc địa chỉ ô chứa họ tên.
 
Ai không biết VBA (lập trình) thì làm theo tôi như sau:

Giả sử A1 chứa "Họ và Tên".

Lấy Họ:
=LEFT(A1,LEN(A1)-FIND(" ",MID(A1,LEN(A1),1)&MID(A1,LEN(A1)-1,1)&MID(A1,LEN(A1)-2,1)&MID(A1,LEN(A1)-3,1)&MID(A1,LEN(A1)-4,1)&MID(A1,LEN(A1)-5,1)&MID(A1,LEN(A1)-6,1)&MID(A1,LEN(A1)-7,1)))

Lấy Tên:
=RIGHT(A1,FIND(" ",MID(A1,LEN(A1),1)&MID(A1,LEN(A1)-1,1)&MID(A1,LEN(A1)-2,1)&MID(A1,LEN(A1)-3,1)&MID(A1,LEN(A1)-4,1)&MID(A1,LEN(A1)-5,1)&MID(A1,LEN(A1)-6,1)&MID(A1,LEN(A1)-7,1))-1)
 
Chào các bạn.
Bạn có thể tách họ và tên theo cách sau.
1/ Đầu tiên bạn chọn vùng dữ liệu
2/ Sau đó vào menu Data / Text to Columns.
3/ Cửa sổ Step 1 of 3, bạn chọn Delimited, rồi chọn Next.
4/ Ở Step 2 of 3, tại mục Delimiters chọn Space rồi Next.
5/ Trong Step 3 of 3, ở hộp Destination bạn nhập địa chỉ để cho ra kết quả. Cuối cùng nhấn Finish để xem kết quả.

Thân !
 
tedaynui đã viết:
Chào các bạn.
Bạn có thể tách họ và tên theo cách sau.
1/ Đầu tiên bạn chọn vùng dữ liệu
2/ Sau đó vào menu Data / Text to Columns.
3/ Cửa sổ Step 1 of 3, bạn chọn Delimited, rồi chọn Next.
4/ Ở Step 2 of 3, tại mục Delimiters chọn Space rồi Next.
5/ Trong Step 3 of 3, ở hộp Destination bạn nhập địa chỉ để cho ra kết quả. Cuối cùng nhấn Finish để xem kết quả.

Thân !
Cách này chỉ áp dụng được với số từ của họ tên bằng nhau. Họ tên ít nhất 2 từ, nhiều nhất 7, 8 từ hoặc hơn. Nếu trong danh sách có một người có tên 8 từ, Excel tách ra 8 cột. Nhặt tên ra khùng luôn !
 
Chào các bạn.
Để không dùng VBA, mình có vài công thức các bạn test thử thế nào nhé.

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," ","")))))


Thân !
 
chibi đã viết:
Cách làm của tedaynui cũng rất hay, sau khi tách xong lấy ra tên không có gì phức tạp cả. Cái lợi là mọi người đều có thể làm được, không cần đến VBA.

Quá đúng.


Tôi nghĩ, cách làm của bạn tedaynui cũng hay nhưng chỉ dùng cho các trường hợp đơn giản, thông thường thôi. Chứ nếu tui có 1 danh sách hàng vài nghìn tên với độ dài khác nhau, nhiều cột mục mà áp dụng cách này bảng tính của tôi trở thành "râu tóc te tua, xồm đầu" và xin bái.... bai đấy!

Nếu muốn sort một danh sách cho dễ dàng, việc tách họ và tên là rất cần, theo tôi vẫn nên bằng cách nào đó phải có 1 đoạn code tiện ích như các bạn đã giới thiệu để có thể dùng thường xuyên, nhanh chóng, tiện lợi.
Tôi đề nghị các bạn nghiên cứu và bổ sung thêm sao cho đoạn mã này tự động chạy cái "rẹt!" từ đầu đến cuối danh sách, chứ mà ngồi mổ cò cho hết cái công thức trường giang đại hải hoặc mỗi lần thực hiện nó thì phải giở "Tự điển GPE" này ra tra (chứ nhớ sao nổi?) thì "chết toi em" luôn.
 
Lần chỉnh sửa cuối:
Lấy họ:=IF(MID(A1,2,1)=" ",LEFT(A1,2),IF(MID(A1,3,1)=" ",LEFT(A1,2),IF(MID(A1,4,1)=" ",LEFT(A1,3),IF(MID(A1,5,1)=" ",LEFT(A1,4),IF(MID(A1,6,1)=" ",LEFT(A1,5),IF(MID(A1,7,1)=" ",LEFT(A1,6),LEFT(A1,7)))))))
Lấy tên đệm:=IF(LEN(A2)-LEN(B2)-LEN(D2)-2>0,MID(A2,LEN(B2)+2,LEN(A2)-LEN(B2)-LEN(D2)-2)," ")
Lấy tên thật:=IF(MID(A3,LEN(A3)-1,1)=" ",RIGHT(A3,2),IF(MID(A3,LEN(A3)-2,1)=" ",RIGHT(A3,2),IF(MID(A3,LEN(A3)-3,1)=" ",RIGHT(A3,3),IF(MID(A3,LEN(A3)-4,1)=" ",RIGHT(A3,4),IF(MID(A3,LEN(A3)-5,1)=" ",RIGHT(A3,5),IF(MID(A3,LEN(A3)-6,1)=" ",RIGHT(A3,6),RIGHT(A3,7)))))))
 
tedaynui đã viết:
Chào các bạn.
Để không dùng VBA, mình có vài công thức các bạn test thử thế nào nhé.

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," ","")))))


Thân !

Cách dùng này rất hay đó các bạn, phần lấy tên rất OK.
Mình bổ sung thêm phần lấy họ và lót (sau khi đã lấy được tên) thì làm như sau cho gọn:
=LEFT(A1,LEN(A1)-LEN(ô chứa tên)-1)
 
daerty5 đã viết:
em cần tách họ và tên ra hai cột khác nhau xin các anh chị chỉ bảo, em cần phải dùng hàm gì vậy ?

đây là dữ liệu, em cần hướng dẫn gấp lắm xin các anh chi nhanh dùn
View attachment 2380
Chào bạn
Bạn tìm trên diễn đàn có rất nhiều bài nói về vấn đề này.
Có thể dùng VBA hoặc dùng hàm. Dùng hàm cũng có rất nhiều cách và đây là 1 trong các cách :
VD : Ô A2 chứa chuỗi họ và tên
Họ lót ==LEFT(A2,FIND("*",SUBSTITUTE(A2," ","*",LEN(A2)-LEN(SUBSTITUTE(A2," ",""))))-1)
Tên ==RIGHT(A2,LEN(A2)-LEN(B2)-1)

TDN
 
Ok có ngay !!!

- Tải cái này về và xem hướng dẫn kèm theo để cài đặt.
- Chạy ếch xèo lên vào Format -> TiengViet-TCVN -> Tach gop ho ten.
- Chý ú : Insert thêm 1 cột để phần tên tách ra không đè lên cột bên cạnh.

View attachment 2384
 
Lần chỉnh sửa cuối:
Macro tách chuỗi

Bạn dùng thử Macro mình làm xem. Cái này có thể tách chuỗi bất kỳ bằng cách chọn ký tự làm mốc tách. Chú ý trong ô chọn mốc tách chỉ đánh 1 ký tự thôi nhé ví dụ +, -, " " (Ký tự trống), â, ô....)*&^))*&^)


!$@!!!$@!!!$@!!!$@!! Ê mọi người đừng tải file ở đây nữa, nghe nói có virus. Chuyển sang cuối trang 2 tải file khác mình đã tải lên rồi, nhớ kiểm tra kỹ virus, nếu cần nhắn tin cho mình mình gửi code cho.
 

File đính kèm

Lần chỉnh sửa cuối:
Tu Anh đã viết:
Bạn dùng thử Macro mình làm xem. Cái này có thể tách chuỗi bất kỳ bằng cách chọn ký tự làm mốc tách. Chú ý trong ô chọn mốc tách chỉ đánh 1 ký tự thôi nhé ví dụ +, -, " " (Ký tự trống), â, ô....)*&^))*&^)
Cám ơn bạn
Bạn làm giao diện tuyệt đẹp đấy nhưng có vài góp ý nhỏ :
- Cái mặt cười màu vàng không thể hiệu lực trên máy khác, chỉ có hiệu lực trên máy của bạn vì nút đó bạn tự tạo và gán cho nó 1 macro
- Sao dung lượng file gần 1Mb, có vẻ lớn đấy (vì data không có - nguyên nhân là do Form có chèn hình đã quá)
- Khi tách chuỗi thì cần xử lý chuỗi luôn :
Nguyễn___Thanh_Sơn --> Nguyễn_Thanh --- Sơn
Cần bỏ bớt các khoảng trắng thừa.
- Có Form đẹp và hoành tráng nhưng chỉ tách nội dung 1 ô, vậy có thể chỉnh lại để có thể tách hàng loạt không ?
Thanks

TDN
 
Lần chỉnh sửa cuối:
Tu Anh đã viết:
Bạn dùng thử Macro mình làm xem. Cái này có thể tách chuỗi bất kỳ bằng cách chọn ký tự làm mốc tách. Chú ý trong ô chọn mốc tách chỉ đánh 1 ký tự thôi nhé ví dụ +, -, " " (Ký tự trống), â, ô....)*&^))*&^)
File của bạn có virus và rất nhiều name lỗi. Vì vậy mình không kịp thấy bạn đã làm gì vì Anti nó diệt mất rồi.

1183404641.jpg


Mong gửi lên File sạch nhé.

Thân!
 
daerty5 đã viết:
em cần tách họ và tên ra hai cột khác nhau xin các anh chị chỉ bảo, em cần phải dùng hàm gì vậy ?

đây là dữ liệu, em cần hướng dẫn gấp lắm xin các anh chị chỉ nhanh dùm
View attachment 2381

Chào bạn

Thí dụ ở ô A1 bạn có tên Trần Văn Xoài.

Tách họ trong ô B1 thì dung =LEFT(A1,FIND(" ",A1)-1)

Phần tên còn lại ghi qua C1 bằng phương thức =RIGHT(A1,LEN(A1)-LEN(B1)-1)

Mến
 
Chỉnh sửa lần cuối bởi điều hành viên:
Xin lỗi các bạn nhé, máy mình biết là bị nhiễm virus nhưng đã sử dụng cá phần mềm diệt virus vẫn không diệt được. Mình cũng mới tham gia diễn đàn, hôm trước có việc cần tách chuỗi nên tập tọe làm thử, thấy có bạn hỏi nên post lên để mọi người tham khảo thôi. Mong mọi người tiếp tục chỉ bảo. Mình sẽ tìm cách sửa để có thể tách một loạt các ô chọn, nhưng mình bận đi làm ít khi về nhà để lên mạng nên chưa thể làm ngay được. Và mình cũng sẽ bỏ bớt các hình nền để file đỡ nặng. Cám ơn các bạn đã góp ý.
 
Việc tách này các bạn đã giải nhiều rồi. Cả bằng công thức, cả bằng VBA. Tuy nhiên mình lưu ý với các bạn rằng đầu tiên ta phải làm rõ các khái niệm :
(Giả sử phân cách các từ là khoảng trống)

Như thế nào là HỌ
Như thế nào là TÊN LÓT
Như thế nào là TÊN

VD :
Trần Hoàn
Nguyễn Y Vân
Nguyễn Thị Minh Khai
Nguyễn Đình Thanh Bảo Quốc (đây là dòng họ Nguyễn Đình)
Nguyễn Hồng Tử Thanh Thái
Nguyễn Tử Chính Long Bảo Ứng
. . . . . . . . . . . . . . . . . . .

Đấy, chỉ khi các bạn hiểu rõ đâu là HỌ, đâu là TÊN LÓT, đâu là TÊN thì khi đó mới làm tiếp theo được.

Chứ cứ quanh quẩn mãi ở cái tên Vũ Như Cẩn, Y Như Cũ . . thì chỉ cần mấy hàm đơn giản là ra rồi.

Mong được xem xét.

Thân!
 
Theo quan niệm và quy ước về họ tên Tiếng Việt - Chữ Việt thì: Từ đầu tiên phía trái sẽ là "Họ" (Thường là họ cha, chỉ trong trường hợp không xác định được cha thì mới lấy họ mẹ), từ cuối cùng bên phải sẽ là "Tên" của người đó - còn lại các từ đứng giữa dù là một hay nhiều thì cũng chỉ được coi là "Tên lót" hoặc "Họ đệm" / "Tên đệm"

Nếu không phải, xin được chỉ giáo tiếp !
 
vungoc đã viết:
Theo quan niệm và quy ước về họ tên Tiếng Việt - Chữ Việt thì: Từ đầu tiên phía trái sẽ là "Họ" (Thường là họ cha, chỉ trong trường hợp không xác định được cha thì mới lấy họ mẹ), từ cuối cùng bên phải sẽ là "Tên" của người đó - còn lại các từ đứng giữa dù là một hay nhiều thì cũng chỉ được coi là "Tên lót" hoặc "Họ đệm" / "Tên đệm"

Nếu không phải, xin được chỉ giáo tiếp !

Đây cũng là một ý, tuy nhiên Cụ Lê Hồng Phong không thích thiên hạ gọi người yêu của Cụ là KHAI đâu, mà phải là Minh Khai (hoặc Nguyễn Thị Minh Khai)

Miền Tây lại có kiểu mọi người rất thích đặt tên các con theo kiểu :

Nguyễn Hoàng Thanh Sang
Nguyễn Hoàng Kim Sang
Nguyễn Hoàng Phương Sang
Nguyễn Hoàng Anh Sang

. . . . . . . . .

Nếu gọi là Sang cả thì e . . . . nhậu không được (vì không biết thằng sang nào uống rồi !!!!??)

Còn ngoài Bắc thì họ Trần Đình, họ Nguyễn Phúc . . . thật là nhiều. Làm không cẩn thận, mỗi lần về quê là các cụ xách tai lên mà mắng đấy : "Họ ta là họ Trần Đình, còn họ Trần là của . . làng bên, mày sang làng bên mà . . ở !!!"

Thân!

Thân!
 
Gởi bác Hiếu
Thông thường thì hiểu như anh VuNgoc là phổ biến nhất. Còn hiểu như Hiếu hình như chỉ có các cụ mới dùng và có vẻ mang tính địa phương. Nếu Họ khi 1 chữ, khi 2 chữ ... chuyến này chắc về làng nhờ các cụ viết code giúp thôi. Hi hi

Thân !
 
Phương ngữ / hay tập tục / hay tập quán / hay văn hóa vùng, miền thì quá đa dạng - hìhì. Vấn đề chỉ giải quyết được trên cơ sở có một "Khái niệm chung".
 
- Theo cái chung thì đa số vẫn là Họ/ Chữ lot/ Tên nên theo em các Pác nên thống nhất như vậy cho dể.
- Còn những tên đăc biệt thì đành sử = tay thôi.
- Chương trình lọc của em gởi lên là ok.
 
Tu Anh đã viết:
Bạn dùng thử Macro mình làm xem. Cái này có thể tách chuỗi bất kỳ bằng cách chọn ký tự làm mốc tách. Chú ý trong ô chọn mốc tách chỉ đánh 1 ký tự thôi nhé ví dụ +, -, " " (Ký tự trống), â, ô....)*&^))*&^)

Bạn có thể post code của bạn lên được không. Quả thực mình mở File của bạn ra thì code bị xóa mất rồi.

Thông cảm vậy.

Thanks!

Thân!
 
Macro tách chuỗi

Trích:
Nguyên văn bởi Mr Okebab
Bạn có thể post code của bạn lên được không. Quả thực mình mở File của bạn ra thì code bị xóa mất rồi.

Thông cảm vậy.

Thanks!

Thân!


Xin lỗi nhé. Hôm trước post file lên thấy mọi người bảo bị nhiễm virus nên cả ngày hôm nay ngồi hì hụi tải các loại chương trình diệt virus về diệt. Hình như diệt hết rồi nhưng mấy cái file có code cũng ra đi luôn nên phải từ từ để mình làm lại đã. Chờ vậy nhé.
 
Lần chỉnh sửa cuối:
Đây rồi, mình làm lại cái chương trình tách chuỗi rồi, mọi người tham khảo, tuy không bằng cái trước, nhưng nó cũng đủ các cái cơ bản. Mọi người tải về chú ý kiểm tra xem có virus ko? Nếu có thì lên tiếng mình post mã code lên cho.
Chương trình này chỉ là sơ khai vẫn còn nhiều hạn chế, mong mọi người góp ý phát triển thêm cho hoàn thiện.
 

File đính kèm

Đây là hàm tách họ, tên, lót. Các bác xem cho ý kiến nhé.

Thân!
 

File đính kèm

Gởi Hiếu
Rất hay, gọn nhẹ nhưng Hiếu cắt luôn nấy khoảng trắng thừa thì tuyệt vời hơn.
Thanks
 
tedaynui đã viết:
Gởi Hiếu
Rất hay, gọn nhẹ nhưng Hiếu cắt luôn nấy khoảng trắng thừa thì tuyệt vời hơn.
Thanks

Cảm ơn nhiều, em đã sửa.
Nhưng không biết tại sao trong VBA hàm trim lại không tác dụng, phải khai báo như hàm của excel.
 
Có maro nào tách họ tên ra làm hai cột không zậy?

cho mình hỏi có maro nào tách họ và tên thành hai cột riêng biệt không! thank
 
Tất nhiên là có... nhưng bạn sử dụng chức năng Text to Column trong Excel cũng làm dc điều này mà.
Mến
ANH TUẤN
 
ongtrungducmx25 đã viết:
cho mình hỏi có maro nào tách họ và tên thành hai cột riêng biệt không! thank
Bác theo dõi ở đây nhé :

HTML:
http://www.giaiphapexcel.com/forum/showthread.php?t=2725

File mẫu

Thân!
 
có cách nào bổ sung thêm tách chữ lót được không
code:
PHP:
Private Function Tachten(ten As String, lg As Integer)
Dim j As Integer
     Name = Trim(ten)
  For j = Len(Name) To 1 Step -1
    If Mid(Name, j, 1) = " " Then
       If lg = "1" Then
          Tachten = Right(Name, Len(Name) - j)
       Else
          Tachten = Left(Name, j)
       End If
  Exit For
    End If
  Next
End Function
=TachTen(B3,0)
=TachTen(B3,1)
xin các pác bổ sung tách chữ lót đi!
chữ lót:
VD: Cao thuỳ Mỹ Dung ==> "Thuỳ Dung"
họ:
còn họ thì :"Cao" nhé!
 
Tên của VN đặt lộn xộn... làm sao mà tách đây... Chỉ có thể tách khi bạn đặt ra 1 nguyên tắc nào đó... lấy VD: Họ là chử đầu, tên là chử cuối, chứ lót là những cái nằm giữa... nhưng dù là vậy thì đến ngày nào đó bạn sẽ phát hiện ra sự bất hợp lý của nguyên tắc trên... Món này Bắp có từng đề cập tới (nếu tôi nhớ ko lầm)
Mến
ANH TUẤN
 
đúng rồi mình xem trên diễn đàn có code đó nhưng theo nguyên tắc chữ lót là phần ở giữ thì đúng ý mình rồi! có thể lấy như thế nào đây!
 
ongtrungducmx25 đã viết:
đúng rồi mình xem trên diễn đàn có code đó nhưng theo nguyên tắc chữ lót là phần ở giữ thì đúng ý mình rồi! có thể lấy như thế nào đây!
Chào thầy
Em gởi thầy thử mấy công thức này xem. Nếu được thì thầy khỏi dùng VBA
Tại ô A2 chứa chuỗi tên (VD : Nguyễn Trần Thanh Hùng)
Họ : =LEFT(A2,FIND(" ",A2,1))
Tên : =RIGHT(A2,LEN(A2)-FIND("*",SUBSTITUTE(A2," ","*",LEN(A2)-LEN(SUBSTITUTE(A2," ","")))))
Lót : =TRIM(RIGHT(A2,LEN(A2)-LEN(B2)-LEN(C2)))
Họ và lót : =LEFT(A2,FIND("*",SUBSTITUTE(A2," ","*",LEN(A2)-LEN(SUBSTITUTE(A2," ",""))))-1)

TDN
From AnhTuan1066:
Phước ơi... Tôi đễ ý ông này hình như ổng ko khóai dùng công thức... Thích dùng VBA cho nó sang... Tôi nhớ hình như thầy Phước có code này mà... Cho đi...
hi... hi...
 
Chỉnh sửa lần cuối bởi điều hành viên:
anhtuan1066 đã viết:
Phước ơi... Tôi đễ ý ông này hình như ổng ko khóai dùng công thức... Thích dùng VBA cho nó sang... Tôi nhớ hình như thầy Phước có code này mà... Cho đi...
hi... hi...
Hi hi... tất nhiên là trong trường hợp này dùng VBA vừa sang lại vừa đẹp nhưng em muốn đưa ra 1 giải pháp khác, ai thích cái nào thì dùng cái đó vậy mà. VBA của em củ chuối lắm, em xin phép Mr.Hiếu gởi lại bài của ông Bắp vậy, OK lắm. hi hi...
File này của Mr.Hiếu làm hay lắm á.

Thân !
From AnhTuan1066:
Ngon đấy chứ... Nhưng Phước nè... Sao nó tách đến cell A8 thì nghĩ luôn vậy? Từ A9 trở đi im re... Làm sao chỉnh đây?
ANH TUẤN
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Hình như là phải kéo công thức của các ô "Họ", "Tên", "Lót" xuông dòng dưới hay sao bác ạ. Vì Bác Bắp chỉ lập function "tach" thôi chứ không tách luôn họ, lót, tên ra.
 
Ah... ah... quên xem... Tôi cứ tưởng macro nó làm tuốt tuồn tuột.. ko có công thức gì cả chứ
Cám ơn...

Ah... ha... nếu vậy thì có thể save file này thành .xla đễ làm User Define Function luôn nhỉ... Đở mất công Enable macro... Có lý
Cám ơn
ANH TUẤN
 
Cảm ơn các bác đã quan tâm . Cú pháp là :
tach(Chuoi, Kytu, Loai)

Ở đó :
  1. Chuoi :Tên họ đầy đủ
  2. Kytu : Bất kỳ ký tự đặc biệt nào để phân các từ ra. VD như chuỗi : Trần - Anh-Tuấn, thì kytu chính là -
  3. Loai: Tùy theo lựa chọn cần tách Họ, Lót, Tên mà sẽ tương ứng là ho; lot; ten
Như vậy nó sẽ tách họ, tên và lót riêng rẽ ra.

Còn việc như bác anhtuan nói ở trên, thì đúng là Tiếng Việt phức tạp nên lúc thì họ là 1 từ lúc thì họ là 2 từ . . . . . Nếu có được qui luật thì mới làm được. Còn không thì . . . ngồi cười vậy thôi.

VD : Nguyễn Vân; Vũ Như Cẩn; Nguyễn Thị Minh Khai; Nguyễn Đình Bảo Chung; Cao Thị Lê Phương Thúy. . . .

Thân!
 
anhtuan1066 đã viết:
Ah... ha... nếu vậy thì có thể save file này thành .xla đễ làm User Define Function luôn nhỉ... Đở mất công Enable macro... Có lý
Cám ơn
ANH TUẤN
Cái này là hàm "tự tạo" nên anh phải copy công thức. Nếu muốn Click 1 cái là nó tách 1 lèo luôn thì anh sửa code lại.

Thân!
 
đâu có mình thấy nó chạy tốt lắm mà chạy đúng đó bạn xem lại đi!thank "Phước nhé"
 
Code của Mr Be rất hay, sao không dùng hàm InStr và InStrRev theo name manager của MaiKa cũng hay lắm.
 
tedaynui đã viết:
Chào thầy
Em gởi thầy thử mấy công thức này xem. Nếu được thì thầy khỏi dùng VBA
Tại ô A2 chứa chuỗi tên (VD : Nguyễn Trần Thanh Hùng)
Họ : =LEFT(A2,FIND(" ",A2,1))
Tên : =RIGHT(A2,LEN(A2)-FIND("*",SUBSTITUTE(A2," ","*",LEN(A2)-LEN(SUBSTITUTE(A2," ","")))))
Lót : =TRIM(RIGHT(A2,LEN(A2)-LEN(B2)-LEN(C2)))
Họ và lót : =LEFT(A2,FIND("*",SUBSTITUTE(A2," ","*",LEN(A2)-LEN(SUBSTITUTE(A2," ",""))))-1)

TDN

tách chữ lót đó hình như không đúng
Lót : =TRIM(RIGHT(A2,LEN(A2)-LEN(B2)-LEN(C2)))
bạn xem fiel của mình nhé tách ra 4 cột lót nhé ! có được không . bạn chỉnh sửa lại cho mình nhé! thank
 

File đính kèm

Nếu bạn muốn thế thì dùng công thức phức tạp lắm... Vào menu Data, chọn công cụ Text to Column... 1 phát ra liền, nhanh như chớp...
 
ongtrungducmx25 đã viết:
tách chữ lót đó hình như không đúng
Lót : =TRIM(RIGHT(A2,LEN(A2)-LEN(B2)-LEN(C2)))
bạn xem fiel của mình nhé tách ra 4 cột lót nhé ! có được không . bạn chỉnh sửa lại cho mình nhé! thank
Thầy ơi,
Em test lại thấy ổn mà. Ví dụ tên "Thái Thị Mỹ Dung" thì em nghĩ Lót là "Thị Mỹ", nêm công thức ấy vẫn ổn mà.
Ý thầy Lót là "Thị" và "Mỹ". Vậy thì thì dùng hàm Left, Mid cắt tiếp. Ví dụ ô D4 là "Thị Mỹ" thì thầy lấy chữ "Thị" bằng công thức
=LEFT(D4,FIND(" ",D4,1))

@ Ngoài ra, có thể dùng công thức mảng nhưng nó dài quá nhìn thấy ngán lắm.
Thân!
 
cám ơn em thầy đã phải làm nhiều cột mới đạt được " nhưng phải dấu nhiều cột thôi " cách này cũng tạm được! thank nhé!
 

File đính kèm

Lần chỉnh sửa cuối:
ongtrungducmx25 đã viết:
cám ơn em thầy đã phải làm nhiều cột mới đạt được " nhưng phải dấu nhiều cột thôi " cách này cũng tạm được! thank nhé!
Anh Thầy làm thế là chơi cho vui thôi. Chứ nếu tên 2 chữ, 3 chữ, 4 chữ,... thì anh thầy gặp rắc rối ngay. Tốt nhất, muốn tách kiểu này thì dùng Text to Column.

Thân !
 
zây hả, dung text colum thì tách ra đầy đủ lắm , nhưng mình chỉ thích tách tên thôi có được không cũng dùng text colum được không! hoặc họ
riêng như dùng công thức có được không ! chắc khó hé
 
Ông thấy này tôi bảo đảm ko phải dạy môn Văn... hi.. hi.. Bài viết đọc 10 lần mới hiểu nổi Thầy muốn cái gì...
 
Nếu chỉ tánh họ thì Text to Column ngon lành nhưng nếu tách tên thì không ổn lắm. Tóm lại, nếu chỉ tách tên và phần còn lại (Họ và Lót) thì dùng công thức hoặc VBA. Nhưng em vẫn thường dùng VBA vì thấy nó tiện hơn. File nhẹ hơn và không dùng thêm cột fụ thứ 3, thứ 4.

Thân!
 
Hình như có 1 hàm đảo ngược thứ tự các ký tự lại phải không các bác ??
(hàm của excel nhé)

VD : GPE --> EPG


Thân!
 
Là code này đây:
PHP:
Function RevText(S As String) As String
    Dim Ndx As Integer
    For Ndx = Len(S) To 1 Step -1
        RevText = RevText & Mid(S, Ndx, 1)
    Next Ndx
End Function

Và còn nữa:

PHP:
Public Function rev(t)
  rev = ""
  ct = Len(t)
  For i = ct To 1 Step –1
    rev = rev & Mid(t, i, 1)
  Next i
End Function
Tiếp cái nữa:
PHP:
Public Function rev(t)
   rev = StrReverse(t)
End Function
 
anhtuan1066 đã viết:
Là code này đây:

Function RevText(S As String) As String
Dim Ndx As Integer
For Ndx = Len(S) To 1 Step -1
RevText = RevText & Mid(S, Ndx, 1)
Next Ndx
End Function

Công thức của Excel cơ, chứ lại hàm tự viết thì không được.

Thân!
 
Hình như ko có.. mình phải tự làm thôi Bắp à!
 
Ý của em định là : Vì một số thích công thức
  1. Tìm ra vị trí của khoảng trắng đầu tiên (hàm Find)
  2. Tìm ra vị trí khoảng tráng cuối cùng (dựa vào hàm đảo ngược và hàm LEN)
Sau đó việc tiến hành tách họ, tên, lót rất đơn giản

Thân!
 
Uh... tôi cũng đoán bạn sẽ làm thế... Tôi tham khảo các trang web nước ngoài, thấy họ cũng tách họ tên bằng cách giống bạn nói, nhưng vẫn phải VBA, Excel ko có hàm này...
ANH TUẤN
 
Tôi đã thực hiện các bước tách chữ như các ban hướng dẫn nhưng không thực hiện tách tên và họ được mong các bạn giúp đỡ

Tôi không hiểu VBA là gì các bạn hướng dẫn giúp nhé
From Sa_DQ:
Với từ khóa 'VBA' bạn sẽ tiếp xúc với rất chi là nhiều thứ về VBA!
 
Chỉnh sửa lần cuối bởi điều hành viên:
AddIn Tách ghép họ tên

tuananh1507 đã viết:
Em muốn tách tên ra khỏi họ và tên thì phải làm sao vậy các bác. Ví dụ:
Ngô Kim Tuyền -> Tuyền
Lê Tuấn Anh -> Anh
Lê Quốc Hùng -> Hùng
Cám ơn các bác nhiều!!!
Tách họ tên bằng công thức có, bằng VBA cũng có. Nhưng cách nào ta cũng phải qua nhiều thao tác. AddInHoTen giúp bạn tách họ tên từ 1 cột ra 2 cột hoặc từ 2 cột họ, tên ghép thành 1 cột chỉ bằng thao tác click chuột.
Đơn giản, nếu vùng họ tên bạn chọn:
- 1 cột > tách họ tên ra 2 cột
- 2 cột > ghép họ tên thành một cột
Tự động mở rộng vùng chọn cho bạn, cho phép bạn chọn lại vùng họ tên trên form, tách, ghép cả tên trường.
Cái này thích hợp cho các bạn đã nhập danh sách xong, nhưng xếp bảo phải tách ra, ghép vào và phải nộp ngay cho xếp.
 

File đính kèm

Cho em hỏi chức năng Test to column là gì thế? Ứng dụng như thế nào? Em mới nghe nói đến thôi+-+-+-+
 
sutrang đã viết:
Cho em hỏi chức năng Test to column là gì thế? Ứng dụng như thế nào? Em mới nghe nói đến thôi+-+-+-+
Đây là chức năng Text to Columns, có thể hiểu đơn giản thế này : Chức năng này cho phép tách từng chữ trong Cell ra thành một hay nhiều chữ trong từng cột ; Căn cứ vào ký tự phân cách (có thể là : dấu phẩy, chấm phẩy, Space, ...). Bạn có thể test thử rất dễ dàng : Chọn ô dữ liệu, menu Data / Text to Columns...

TDN
 
cho em hỏi nếu lần sau mà dùng lại lệnh thì làm thế nào
chẳng lẽ lần nào dùng cũng phải copy đoạn code đó sang hay sao
E thử làm rồi nhưng chỉ áp dụng được có một lần thôi
 
cho em hỏi nếu lần sau mà dùng lại lệnh thì làm thế nào
chẳng lẽ lần nào dùng cũng phải copy đoạn code đó sang hay sao
E thử làm rồi nhưng chỉ áp dụng được có một lần thôi

Mỗi lần copy như vầy sẽ dùng được cho 1 file.

Muốn làm 1 lần mà dùng mãi mãi thì xài Add-Ins... nhé
 
Thông thường, khi có 1 danh sách, họ tên được viết liền. Tại sao lại phải tách riêng ra cột khác nhỉ. Khi muốn sắp xếp họ tên trong tiếng Việt thường sử dụng VBA, đã dùng đến nó thì cần gì phải tách tên ra cột khác.
 
Thông thường, khi có 1 danh sách, họ tên được viết liền. Tại sao lại phải tách riêng ra cột khác nhỉ. Khi muốn sắp xếp họ tên trong tiếng Việt thường sử dụng VBA, đã dùng đến nó thì cần gì phải tách tên ra cột khác.
Bài toán tách tên này còn áp dụng trong nhiều trường hợp nữa bạn ạ, giả sử không phải là sắp xếp theo tiếng Việt có dấu mà là sắp xếp trực tiếp luôn thì sao???.
Nhân đây tôi cũng xin góp thêm 1 cách tách Tên mà không dùng VBA(Cái này tôi từng làm khi chưa biết gì về VBA và chỉ áp dụng được trong trường hợp thực tế cụ thể, không áp dụng được cho mọi trường hợp).
1. Dùng chức năng Text to columns để tách cột Họ tên thành các cột cách nhau bởi dấu cách.
2. Tại 1 cột cách cột Họ tên ban đầu đủ lớn để chắc chắn họ tên không thể có nhiều từ hơn(Ví dụ là cột thứ 10 sau cột Họ tên, vì chắc không ai có tên nhiều hơn 10 từ, cái này chính là hạn chế)
3. Dùng hàm Index kết hợp với hàm CountA để lấy về tên
- Ví dụ Họ tên nằm ở ô A1, dùng chức năng Text to columns để tách thành các cột, tại ô J1 dùng công thức sau:
Mã:
=INDEX(A1:I1,1,COUNTA(A1:I1))
Cách này hơi chuối 1 chút, nhưng được cái không phải dùng VBA --=0.
 
ĐÂY LÀ CÁCH TÔI ĐÃ HỌC ĐƯỢC TRÊN DIỄN ĐÀN VÀ ĐANG THỰC HIỆN, XIN CHIA SẺ CÙNG BẠN:

Từ file EXCEL có chứa dữ liệu bạn đang muốn tách họ và tên - bạn hãy nhấn Alt + F11 sau đó nhấn insert nhấn module dán đọan mã sau vào trong cửa sổ module:

Private Function Tachten(ten As String, lg As Integer)
Dim j As Integer
Name = Trim(ten)
For j = Len(Name) To 1 Step -1
If Mid(Name, j, 1) = " " Then
If lg = "1" Then
Tachten = Right(Name, Len(Name) - j)
Else
Tachten = Left(Name, j)
End If
Exit For
End If
Next
End Function


SỬ DỤNG HÀM TÍNH TÁCH HỌ VÀ TÊN:
Giả sử bạn muốn tách tên ra khỏi họ và họ đệm tại ô A1 = Phạm Xuân Trường / Gõ = tachten(A1,0) / Kết quả: Phạm Xuân
Giả sử bạn muốn tách tên ra khỏi họ và họ đệm tại ô A1 = Phạm Xuân Trường / Gõ = tachten(A1,1) / Kết quả: Trường


(Nếu muốn sử dụng hàm này cho tòan excel bạn hãy đọc thêm trên diễn đàn này)

Chúc bạn thành công !

Mình lại cần tách Họ, tên đệm và tên thành 3 cột thì công thức VBS sẽ thế nào nhỉ? Nhờ cả nhà giúp với nhé ! Thanks.
 
Mình lại cần tách Họ, tên đệm và tên thành 3 cột thì công thức VBS sẽ thế nào nhỉ? Nhờ cả nhà giúp với nhé ! Thanks.

Bạn xem file đính kèm. File này làm bằng công thức. Cái này có nhiều trên GPE mình lắm bạn à!
 

File đính kèm

ĐÂY LÀ CÁCH TÔI ĐÃ HỌC ĐƯỢC TRÊN DIỄN ĐÀN VÀ ĐANG THỰC HIỆN, XIN CHIA SẺ CÙNG BẠN:

Từ file EXCEL có chứa dữ liệu bạn đang muốn tách họ và tên - bạn hãy nhấn Alt + F11 sau đó nhấn insert nhấn module dán đọan mã sau vào trong cửa sổ module:

Private Function Tachten(ten As String, lg As Integer)
Dim j As Integer
Name = Trim(ten)
For j = Len(Name) To 1 Step -1
If Mid(Name, j, 1) = " " Then
If lg = "1" Then
Tachten = Right(Name, Len(Name) - j)
Else
Tachten = Left(Name, j)
End If
Exit For
End If
Next
End Function


SỬ DỤNG HÀM TÍNH TÁCH HỌ VÀ TÊN:
Giả sử bạn muốn tách tên ra khỏi họ và họ đệm tại ô A1 = Phạm Xuân Trường / Gõ = tachten(A1,0) / Kết quả: Phạm Xuân
Giả sử bạn muốn tách tên ra khỏi họ và họ đệm tại ô A1 = Phạm Xuân Trường / Gõ = tachten(A1,1) / Kết quả: Trường


(Nếu muốn sử dụng hàm này cho tòan excel bạn hãy đọc thêm trên diễn đàn này)

Chúc bạn thành công !


Chào bạn!
cho tôi hỏi mình dán đoạn mã vào sheet 1 ah!
nhưng khi tôi dán đoạn mã vào shet 1 rôi thực hiện tại ô A1=Nguyễn Trường/ gõ Tachten(A1,0) --> #Name?
Không có kết quả bạn ah!
Mong giúp đỡ!!!
 
Chào bạn!
cho tôi hỏi mình dán đoạn mã vào sheet 1 ah!
nhưng khi tôi dán đoạn mã vào shet 1 rôi thực hiện tại ô A1=Nguyễn Trường/ gõ Tachten(A1,0) --> #Name?
Không có kết quả bạn ah!
Mong giúp đỡ!!!
Bạn Insert > Module, sau đó dán đoạn mã ấy vào Module mới vừa thêm vào (không phải Sheet)

TDN
 
Chỉnh sửa lần cuối bởi điều hành viên:
Mình cần lấy tên đệm và tên chính thì dùng công thức nào ?
Nguyễn Tấn Dũng --> Nguyễn và Tấn Dũng
 
tôi có danh sách họ tên trong excel , để tách thành họ riêng , tên riêng thì làm thế nào ?
 
tôi có danh sách họ tên trong excel , để tách thành họ riêng , tên riêng thì làm thế nào ?
Em cũng xin tham gia 1 code đơn giản. "Tách tên" có rất nhiều trên diễn đàn. Trước mắt em xin gởi anh 1 công thức và 1 code, tùy anh chọn:
1/ Công thức
A1: Họ tên
B1=TRIM(RIGHT(SUBSTITUTE(A1," ",REPT(" ",10)),18))
Hàm này nghĩa là thay 1 khỏan trắng giữa họ và tên thành 10 khỏan trắng.
Và lấy right 18. Tên VN không dài hơn 18 ký tự.
2/ Code: anh chép code này vào module. Nhấn Alt F11, và Insert Module.
PHP:
Function layten(sHoTen As Range) As String
Dim Vitri As Long, sTen As String
Vitri = InStrRev(sHoTen, " ")
sTen = Right(sHoTen, Len(sHoTen) - Vitri)
layten = sTen
End Function
Cú pháp:
=layten(Ô chứa họ tên)
Hy vọng giúp được Anh.
 
Đây là UDF hàm tách tên ngắn nhất! Code này có sự hỗ trợ rất nhiệt tình của bác ndu96081631. Rất cảm ơn bác.
PHP:
 Function tachten(ten As String) As String Dim arr() As String If ten = "" Then tachten = "Error": Exit Function arr() = Split(ten, " ") tachten = arr(Len(ten) - Len(Application.WorksheetFunction.Substitute(ten, " ", ""))) End Function
Code này dùng để chỉ lấy tên của dữ liệu thôi. Thân.
 
Lần chỉnh sửa cuối:
- Nếu hàm này chỉ cắt mỗi tên thôi thì e rằng . . phí quá. hãy cho cái Option để có thể lấy HỌ - TÊN ĐỆM - TÊN --Chúc vui--
Muốn Option thì có option liền:
PHP:
Function tachten(ten As String, Optional k As String = "ten") As String Dim arr() As String If ten = "" Then tachten = "Error": Exit Function arr() = Split(ten, " ") If UCase(k) = "HO" Then tachten = arr(0) ElseIf UCase(k) = "TEN DEM" Then tachten = Trim(WorksheetFunction.Substitute(WorksheetFunction.Substitute(ten, arr(Len(ten) - Len _ (WorksheetFunction.Substitute(ten, " ", ""))), ""), arr(0), "")) ElseIf UCase(k) = "TEN" Then tachten = arr(Len(ten) - Len(WorksheetFunction.Substitute(ten, " ", ""))) End If End Function
Thân.
 
Lần chỉnh sửa cuối:
Đây là UDF hàm tách tên ngắn nhất!
PHP:
Function tachten(ten As String) As String
Dim arr() As String
If ten = "" Then tachten = "Error": Exit Function
arr() = Split(ten, " ")
tachten = arr(Len(ten) - Len(Application.WorksheetFunction.Substitute(ten, " ", "")))
End Function
Cái này sao gọi ngắn nhất được. Po_pikachu xem code này nhé:
[highlight=vb]
Function TachTen(HoTen As String)
If HoTen = "" Then TachTen = "error": Exit Function
TachTen = Trim(Right(Replace(HoTen, " ", Space(100)), 100))
End Function
[/highlight]

Còn muốn có optional thì cũng có đây:
[highlight=vb]
Function TachTen(HoTen As String, Optional Vitri As Byte)
'Vị trí = 0 hoặc bỏ trống: Lấy tên (Mặc định), Vitri = 1 : Lấy Họ + Tên Lót
If HoTen = "" Then TachTen = "error": Exit Function
If IsNull(Vitri) Or Vitri = 0 Then
TachTen = Trim(Right(Replace(HoTen, " ", Space(100)), 100))
Else: TachTen = Left(HoTen, Len(HoTen) - Len(Trim(Right(Replace(HoTen, " ", Space(100)), 100))))
End If
End Function
[/highlight]
 
Lần chỉnh sửa cuối:
Hay lắm. Nhưng cái option... dài thòng à, Po ơi.
Làm vầy đi, nhập hàm lẹ hơn nè:
PHP:
Function tachten(ten As String, Optional k As String = "ten") As String
    Dim arr() As String
    If ten = "" Then tachten = "Error": Exit Function
        arr() = Split(ten, " ")
        If k = 1 Then
            tachten = arr(0)
        ElseIf k = 2 Then
            tachten = Trim(WorksheetFunction.Substitute(WorksheetFunction.Substitute(ten, arr(Len(ten) - Len _
            (WorksheetFunction.Substitute(ten, " ", ""))), ""), arr(0), ""))
    ElseIf k = 3 Then
        tachten = arr(Len(ten) - Len(WorksheetFunction.Substitute(ten, " ", "")))
    End If
End Function
Cho k = 1, k = 2, k = 3 cho nó dễ xài í mà... chớ hỏng sửa gì đâu, mà nói thiệt có biết gì đâu mà sửa...
 
Nâng cấp nhờ bác Ca_Dafi.
PHP:
Function tachten(ten As String, Optional k As String = "ten") As String Dim arr() As String If ten = "" Then tachten = "Error": Exit Function arr() = Split(ten, " ") If UCase(k) = "HO" Then tachten = arr(0) ElseIf UCase(k) = "TEN DEM" Then tachten = Trim(Replace(Replace(ten, arr(Len(ten) - Len _ (Replace(ten, " ", ""))), ""), arr(0), "")) ElseIf UCase(k) = "TEN" Then tachten = arr(Len(ten) - Len(Replace(ten, " ", ""))) End If End Function
Thân.
 
Lần chỉnh sửa cuối:
Cho hỏi Cadafi tí, muốn lấy cái ở giữa thui, thì option bằng bi nhiu?
Với lại, Cadafi làm hay đó. Hàm nào VBE có thì xài, mắc gì phải lôi Application.WorksheetFunction ra hơ...
 
Hàm ngắn hàm dài chưa quan trọng.

Bây giờ các bác thử với dữ liệu khoảng 30.000 cell xem hàm nào chạy nhanh hơn ??


Thân!
 

File đính kèm

Lần chỉnh sửa cuối:
Bác Bắp gửi dùm cái file có 30.000 cái tên lên đây, tui test dùm cho...
 
Test dùm cái của em luôn nha! Cảm ơn bác trước. Thân.
 
Lần chỉnh sửa cuối:
Cho hỏi Cadafi tí, muốn lấy cái ở giữa thui, thì option bằng bi nhiu?
Với lại, Cadafi làm hay đó. Hàm nào VBE có thì xài, mắc gì phải lôi Application.WorksheetFunction ra hơ...
Anh chọn tham số Vitri theo như code bên dưới nhé!
Code này chắc không còn ngắn hơn được nữa, chỉ mỗi cái IF để Check Hoten = Blank mà thôi:
[highlight=vb]
Function TachTen(HoTen As String, Optional Vitri As Byte = 1)
'Vtri = 1: Ten ; Vtri = 2: Ho ; Vtri = 3: TenLot ; Vtri = 4: HoTenlot
If HoTen = "" Then TachTen = "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)))
TachTen = Choose(Vitri, Ten, Ho, TenLot, HoTenlot)
End Function
[/highlight]
 
Lần chỉnh sửa cuối:
Góp thêm 1 hàm cho đông vui :-)

Cách dùng: Đối số tùy chọn iPos xác định vị trí của chuỗi con cần lấy.
iPos <= 0 : hàm trả về Chuỗi con đầu tiên (tương đương với Họ)
iPos = 1, 2, ... - hàm trả về các chuỗi con kế tiếp (tương đương với chữ lót thứ 1, thứ 2...)
iPos >= (tổng số từ -1) : trả về chuỗi cuối cùng (tương đương với Tên)

Mã:
Function SubStr(ByVal st As String, Optional [COLOR=red]iPos[/COLOR] As Integer = 0) As String
Dim i As Long, lB As Long, uB As Long
Dim aStr() As String
    st = WorksheetFunction.Trim(st)  'DelSpace(st)'
    If st = Empty Then Exit Function
    aStr = Split(st, Space(1))
    lB = LBound(aStr): uB = UBound(aStr)
    iPos = IIf(iPos > uB, uB, IIf(iPos < lB, lB, iPos))
    SubStr = aStr(iPos)
End Function
 
Em lại theo bước bác Ca_Dafi 1 lần nữa. Hiiiiiiiii Có bác nào có dữ liệu nhiều không? Test giùm em đoạn code này với. Có thể code này là ngắn nhất luôn rồi đó.
PHP:
Function TachTen(HoTen As String, Optional Vitri As Byte = 1) As String 'Vtri = 1: Ho ; Vtri = 2: TenLot ; Vtri = 3: Ten ; Vtri = 4: HoTenlot Dim arr() As String arr() = Split(HoTen, " ") k = UBound(arr) TachTen = Choose(Vitri, arr(0), Trim(Replace(Replace(HoTen, arr(k), ""), arr(0), "")), _ arr(k), Trim(Replace(HoTen, arr(k), ""))) End Function
Thân.
 
Lần chỉnh sửa cuối:
Có ai biết cách Test hôn, Test hộ code của em tí (bài #13), test 50.000 cell nha!
Pro|Rows|Time (milisecond)
Po_Pikachu|50.000|2.575
Ca_Dafi|50.000|2.739
HVL|50.000|2.530
Các bác nhớ cho Calculation = Manual nhé


Bác nào có UDF nào chạy nhanh hơn không ??

Thân!
 

File đính kèm

Lần chỉnh sửa cuối:
Cái này sao gọi ngắn nhất được. Po_pikachu xem code này nhé:
[highlight=vb]
Function TachTen(HoTen As String)
If HoTen = "" Then TachTen = "error": Exit Function
TachTen = Trim(Right(Replace(HoTen, " ", Space(100)), 100))
End Function
[/highlight]
Vẫn chưa ngắn ---> cái này nè:
PHP:
Function TachTen(Hovaten As String) As String
  TachTen = Trim(Right(Replace(Hovaten, " ", Space(255)), 255))
End Function
Các bạn thử xem, bào đãm hàm này sẽ không báo lổi gì, cho dù Hovaten = ""
---> Khỏi cần IF
 
Lần chỉnh sửa cuối:
Vẫn chưa ngắn ---> cái này nè:
PHP:
Function TachTen(Hovaten As String) As String
  TachTen = Trim(Right(Replace(Hovaten, " ", Space(255)), 255))
End Function
Các bạn thử xem, bào đãm hàm này sẽ không báo lổi gì, cho dù Hovaten = ""
---> Khỏi cần IF
Các bạn cho tôi hỏi: Giữa cái UDF ở trên của anh Tuấn và cái công thức này:
=TRIM(RIGHT(SUBSTITUTE(Hovaten," ",REPT(" ",255)),255))​
là tương đương nhau phải không.
Vậy với cùng một dữ liệu, thì nên dùng cái nào, và cái nào nhanh hơn?
 
Vẫn chưa ngắn ---> cái này nè:
PHP:
Function TachTen(Hovaten As String) As String
  TachTen = Trim(Right(Replace(Hovaten, " ", Space(255)), 255))
End Function
Các bạn thử xem, bào đãm hàm này sẽ không báo lổi gì, cho dù Hovaten = ""
---> Khỏi cần IF

Dĩ nhiên với những hàm về Text thì việc Text = "" vẫn không sao cả.
Tuy nhiên việc phân định Text = "" rồi thoát giúp cho hàm chạy nhanh hơn.
Nhưng nếu người lập trình không thích thì cũng chẳng sao cả.

Bác cải tiến hàm của bác để có thể lấy đủ cả họ tên xem tốc độ ra sao, bởi bác là người thích về tốc độ. Hy vọng có những cải tiến !

Thân!
 
Các bạn cho tôi hỏi: Giữa cái UDF ở trên của anh Tuấn và cái công thức này:
=TRIM(RIGHT(SUBSTITUTE(Hovaten," ",REPT(" ",255)),255))​
là tương đương nhau phải không.
Vậy với cùng một dữ liệu, thì nên dùng cái nào, và cái nào nhanh hơn?
Đúng vậy! 2 cái hoàn toàn như nhau
Chỉ đưa giãi pháp lên chơi thôi chứ nếu dùng thì tôi sẽ dùng công thức
 
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!
 

File đính kèm

Nếu bác không để ý thì thấy dùng công thức thì file sẽ nặng hơn rất nhiều đó. Vì file sẽ tính dung lượng trên số lượng ký tự gõ vào mà! Mà code VBA của bác NUD chơi ăn gian quá! Sao chỉ có lấy tên không vậy. Code của em lấy được mọi thứ kia mà. Nếu muốn lấy tên không thì đâu cần viết dài vậy? Code lấy tên:
PHP:
Function TachTenPo(HoTen As String) As String  '' Po_PiKachu     Dim arr() As String     IF HoTen = "" then TachTenPo = "Error": Exit Function     arr() = Split(HoTen, " ")     TachTenPo = arr(UBound(arr)) End Function
Thân.
 
Lần chỉnh sửa cuối:

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

Back
Top Bottom