Các hàm tách họ tên

Chia sẻ bởi:huonggiang151192
★★★★★
Quảng cáo

Mình gửi lên diễn đàn Code của một số hàm tự tạo: Tách họ, chữ lót và tên ra khỏi tên.
Các hàm này sẽ giúp các bạn tách "Họ", "Chữ lót", "Họ và chữ lót", "Tên" ra khỏi "Họ tên".
Các hàm này còn có thể bỏ các khoảng trống dư trong "Họ tên".
Các bạn tham khảo thêm file đính kèm nhé
Cảm ơn các bạn.

_______________________________
Function tachho(i As String) As String
i = Trim(i)
Do While Left(i, 1) <> " "
tachho = tachho & Left(i, 1)
i = Right(i, Len(i) - 1)
Loop
End Function
__________________________________
Function Tachchulot(j As String) As String
j = Trim(j)
Do While Right(j, 1) <> " "
j = Left(j, Len(j) - 1)
Loop
Do While Left(j, 1) <> " "
j = Right(j, Len(j) - 1)
Loop
j = Trim(j)
Tachchulot = j
End Function
_______________________________________
Function Tachhovachulot(k As String) As String
k = Trim(k)
Do While Right(k, 1) <> " "
k = Left(k, Len(k) - 1)
Loop
k = Trim(k)
Tachhovachulot = k
End Function
_______________________________
Function tachten(l As String) As String
l = Trim(l)
Do While Right(l, 1) <> " "
tachten = Right(l, 1) & tachten
l = Left(l, Len(l) - 1)
Loop
End Function

Mình thấy có bạn hỏi về lấy các ký tự đầu của một chuỗi ký tự.
Mình cũng viết Code thử. Các bạn tham khảo nhé.

Function laykytudau(i As String) As String
Dim k As String, j As Double
k = Left(i, 1)
For j = 2 To Len(i)
If Mid(i, j, 1) = " " Then
k = k & Mid(i, j + 1, 1)
End If
Next j
laykytudau = k
End Function

Với các hàm loại này, chỉ làm đơn giản như vầy thôi, không cần phải Do … Loop:

Function TachHo(ByVal HoTen As String) As String
    HoTen = Trim(HoTen)
    If HoTen = "" Then Exit Function
    Dim SplHoTen
    SplHoTen = Split(HoTen, " ")
    TachHo = SplHoTen(0)
End Function

Function TachTen(ByVal HoTen As String) As String
    HoTen = Trim(HoTen)
    If HoTen = "" Then Exit Function
    Dim SplHoTen
    SplHoTen = Split(HoTen, " ")
    TachTen = SplHoTen(UBound(SplHoTen))
End Function

Function TachTenLot(ByVal HoTen As String) As String
    HoTen = WorksheetFunction.Trim(HoTen)
    If HoTen = "" Then Exit Function
    Dim SplHoTen, u As Long
    SplHoTen = Split(HoTen, " ")
    u = UBound(SplHoTen) - 1
    If u > 0 Then
        ReDim Preserve SplHoTen(0 To u)
        TachTenLot = Join(SplHoTen, " ")
        TachTenLot = Mid(TachTenLot, InStr(TachTenLot, " ") + 1)
    End If
End Function

Function TachHoTenLot(ByVal HoTen As String) As String
    HoTen = WorksheetFunction.Trim(HoTen)
    If HoTen = "" Then Exit Function
    Dim SplHoTen, u As Long
    SplHoTen = Split(HoTen, " ")
    u = UBound(SplHoTen) - 1
    If u = -1 Then
        TachHoTenLot = HoTen
    Else
        ReDim Preserve SplHoTen(0 To u)
        TachHoTenLot = Join(SplHoTen, " ")
    End If
End Function

Ngay các hàm của bạn, giả sử rằng nếu ai đó "lai căng" đặt tên cho con chỉ một chữ (Jenni, Tom, Chanel v.v…) thì sẽ bị lỗi đấy! (nhưng hy vọng không ai đặt như thế!)

Khóa học Power PI – Ứng dung trong Nhân sự
Khóa học SprinGO phù hợp

Khóa học Power PI – Ứng dung trong Nhân sự

TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...

Xem khóa học
★★★★★ 5 ★ 1 👤 4 ▥ 0
Quảng cáo

Bạn nên đọc

4 Responses

  1. huyentrangnl90 says:

    Hàm viết tắt họ tên cũng nên tham khảo code này:

    Function HoTenTat(ByVal HoTen As String) As String
        HoTen = Trim(HoTen)
        If HoTen = "" Then Exit Function
        Dim SplHoTen, i As Long
        SplHoTen = Split(HoTen, " ")
        For i = 0 To UBound(SplHoTen)
            If SplHoTen(i) > " " Then
                HoTenTat = HoTenTat + Left(SplHoTen(i), 1)
            End If
        Next
    End Function

    Riêng hàm bạn cần xử lý các khoảng trắng dư thừa nếu ai đó gõ cách khoảng hơn 1 lần.

    Tham khảo thêm hàm 3 trong 1 này

    Function TachHoTen(cell As Range, Optional ByVal Index As Long = 3) As String
    'Get Surname or MiddleName or Firstname
    With CreateObject("vbscript.regexp")
    .Pattern = "(S+)(.*)(sS+)"
    TachHoTen = Trim(.Replace(Trim(cell), "$" & Index))
    End With
    End Function

  2. huyentrangnl90 says:

    Nhân tiện tách ra từng hàm cho các bạn mới học VBA tham khảo cách dùng Reg

    Function Ho(cell As Range) As String
    With CreateObject("vbscript.regexp")
    .Pattern = "(S+)(.*)(sS+)"
    Ho = Trim(.Replace(Trim(cell), "$1"))
    End With
    End Function

    Function Lot(cell As Range) As String
    With CreateObject("vbscript.regexp")
    .Pattern = "(S+)(.*)(sS+)"
    Lot = Trim(.Replace(Trim(cell), "$2"))
    End With
    End Function

    Function Ten(cell As Range) As String
    With CreateObject("vbscript.regexp")
    .Pattern = "(S+)(.*)(sS+)"
    Ten = Trim(.Replace(Trim(cell), "$3"))
    End With
    End Function

  3. juniorhuyen1804 says:

    Viết theo cách khác:

    Function TachHoTen(ByVal HoTen As String, Optional ByVal Index As Long = 3)
    HoTen = WorksheetFunction.Trim(HoTen)
    If HoTen = "" Then Exit Function
    With CreateObject("vbscript.regexp")
    Select Case Index
    Case 1 To 3
    ''Ho: 1, Lot: 2, Ten: 3
    .Pattern = "(S+)(.*)(sS+)"
    TachHoTen = Trim(.Replace(HoTen, "$" & Index))
    Case 4
    ''Ho va Lot:
    .Pattern = "(.*)(sS+)"
    TachHoTen = Trim(.Replace(Trim(HoTen), "$" & Index – 3))
    Case Else
    ''Xu ly loi:
    TachHoTen = CVErr(xlErrNA)
    End Select
    End With
    End Function

  4. kiendbhb says:

    1. Muốn lây họ + lót thì dùng replace khác:

    .Pattern = "sS+$"[COLOR=#008000] ' match là tên[/COLOR]
            HVL = Trim(.Replace(Trim(cell), ""))[COLOR=#008000] ' replace bằng "" -> còn lại họ + lót[/COLOR]
    
    .Pattern = "^S+"[COLOR=#008000] ' match là họ[/COLOR]
            LVT = Trim(.Replace(Trim(cell), ""))[COLOR=#008000] ' replace bằng "" -> còn lại lót + tên[/COLOR]

    2. Sử dụng nhiều hàm:

    [COLOR=#ff0000]Private [/COLOR]Function TachHoTen(cell As Range, Optional ByVal Index As Long = 3) As String
    ...
    
    Function Ho(cell As Range) As String
    Ho = TachHoTen(cell, 1)
    End Function
    
    Function Lot(cell As Range) As String
    Lot = TachHoTen(cell, 2)
    [COLOR=#FF0000]' Lưu ý là hàm này cần phải thêm code ở đây mới hoàn chỉnh[/COLOR]
    End Function
    
    Function Ten(cell As Range) As String
    Ten = TachHoTen(cell, 3)
    [COLOR=#ff0000]' Lưu ý là riêng hàm này cần phải thêm code ở đây mới hoàn chỉnh[/COLOR]
    End Function

    Lưu ý trong Hàm Lot và Ten:
    Vì cái pattern trong hàm chính sẽ hỏng nếu chuỗi chỉ có 1 từ (vd "Nguyen"). Cho nên phương thức Replace của Regex sẽ không làm gì cả. Và vì vậy hàm sẽ trả về nguyên chuỗi ban đầu. Đối với họ thì được, vì 1 từ tức là họ. Nhưng với lót và tên thì cần thêm phần so sánh kết quả lấy về với chuỗi ban đầu, nếu chúng giống nhau là xoá đi (tức là chuỗi không có lót-tên)

    3. Có cách khác là thay vì dùng phương thức Replace thì dùng hàm Execute; nếu count > 0 thì lấy cái Object đầu tiên (chỉ số 0); các Submatches của Object này là họ (0), lót (1), tên (2).

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm