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

Liên hệ QC
- 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

  • TachTen.7z
    56.1 KB · Đọc: 184
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

  • TachTen.7z
    1.6 MB · Đọc: 128
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

  • TachTen.7z
    87.7 KB · Đọc: 110
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:
Web KT
Back
Top Bottom