Tại sao lại không tách họ, đệm và tên được?

Liên hệ QC

quangbkh

Thành viên mới
Tham gia
9/12/07
Bài viết
12
Được thích
0
Tôi có 1 file rất muốn tách Họ, đệm vào 1 cột, tên vào 1 cột khác, đã sử dụng Marco như sau:
Code:
[FONT=&quot]Private Function Tachten(ten As String, lg As Integer)[/FONT]
[FONT=&quot]Dim j As Integer[/FONT]
[FONT=&quot] Name = Trim(ten)[/FONT]
[FONT=&quot] For j = Len(Name) To 1 Step -1[/FONT]
[FONT=&quot] If Mid(Name, j, 1) = " " Then[/FONT]
[FONT=&quot] If lg = "1" Then[/FONT]
[FONT=&quot] Tachten = Right(Name, Len(Name) - j)[/FONT]
[FONT=&quot] Else[/FONT]
[FONT=&quot] Tachten = Left(Name, j)[/FONT]
[FONT=&quot] End If[/FONT]
[FONT=&quot] Exit For[/FONT]
[FONT=&quot] End If[/FONT]
[FONT=&quot] Next[/FONT]
[FONT=&quot]End Function [/FONT]

Sau đó sử dụng công thức =TachTen(B3,0) để tách họ và đệm; =TachTen(B3,1) để tách Tên ( B3 chính là địa chỉ của ô ban đầu chứa cả họ, tên đệm và tên), nhưng tại sao lại không thể tách được, mặc dù Security đặt ở mức Low. File lỗi có tải lên, nhờ các bạn xem giúp!
 

File đính kèm

Tôi có 1 file rất muốn tách Họ, đệm vào 1 cột, tên vào 1 cột khác, đã sử dụng Marco như sau:
Code:
[FONT=&quot]Private Function Tachten(ten As String, lg As Integer)[/FONT]
[FONT=&quot]Dim j As Integer[/FONT]
[FONT=&quot] Name = Trim(ten)[/FONT]
[FONT=&quot] For j = Len(Name) To 1 Step -1[/FONT]
[FONT=&quot] If Mid(Name, j, 1) = " " Then[/FONT]
[FONT=&quot] If lg = "1" Then[/FONT]
[FONT=&quot] Tachten = Right(Name, Len(Name) - j)[/FONT]
[FONT=&quot] Else[/FONT]
[FONT=&quot] Tachten = Left(Name, j)[/FONT]
[FONT=&quot] End If[/FONT]
[FONT=&quot] Exit For[/FONT]
[FONT=&quot] End If[/FONT]
[FONT=&quot] Next[/FONT]
[FONT=&quot]End Function [/FONT]

Sau đó sử dụng công thức =TachTen(B3,0) để tách họ và đệm; =TachTen(B3,1) để tách Tên ( B3 chính là địa chỉ của ô ban đầu chứa cả họ, tên đệm và tên), nhưng tại sao lại không thể tách được, mặc dù Security đặt ở mức Low. File lỗi có tải lên, nhờ các bạn xem giúp!

Bạn để cả 3 module chứa cùng 1 hàm tách tên, có thể điều này gây lỗi, mình Remove bớt 2 module và đã chạy được rồi. Gửi lại file cho bạn.
 

File đính kèm

Upvote 0
Nếu bạn chỉ muốn lấy họ tên thì dùng code là hơi thừa, chỉ cần dùng công thức :

VD : [D6] chứa tên đầy đủ.

PHP:
[F6] gõ =TRIM(RIGHT(SUBSTITUTE(TRIM(D6)," ",REPT(" ",100)),100)) --> Tên.
[E6] gõ =LEFT(TRIM(D6),LEN(TRIM(D6))-LEN(F6)-1) --> Họ và đệm.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Code thì không sai mà thừa. Ai đời bạn có đến 3 Module đều có chứa hàm này. Bạn xóa đi 2 chỉ để 1 là OK
 
Upvote 0
Bài này mà dùng vòng lập thì hơi dở ---> Có thể dùng công thức thường, hoặc nếu dùng VBA, ta dùng Spilt sẽ nhanh hơn
PHP:
Function TachTen(HoTen As String, Kieu As Boolean) As String
  Dim Temp1, Temp2 As String
  On Error Resume Next
  With WorksheetFunction
    Temp1 = Split(.Trim(HoTen), " ")
    Temp2 = Temp1(UBound(Temp1))
    TachTen = IIf(Kieu, Temp2, .Trim(Replace(HoTen, Temp2, "")))
  End With
End Function
 
Upvote 0
Bài này mà dùng vòng lập thì hơi dở ---> Có thể dùng công thức thường, hoặc nếu dùng VBA, ta dùng Spilt sẽ nhanh hơn
PHP:
Function TachTen(HoTen As String, Kieu As Boolean) As String
  Dim Temp1, Temp2 As String
  On Error Resume Next
  With WorksheetFunction
    Temp1 = Split(.Trim(HoTen), " ")
    Temp2 = Temp1(UBound(Temp1))
    TachTen = IIf(Kieu, Temp2, .Trim(Replace(HoTen, Temp2, "")))
  End With
End Function
VBA thì không cần dùng vòng lặp, cũng có thể không cần dùng split đâu, có thể dùng luôn như thế này:
Mã:
Function TachTen(hoten As String) As String
    hoten = WorksheetFunction.Trim(hoten)
    TachTen = Right(hoten, Len(hoten) - InStrRev(hoten, " "))
End Function
 
Upvote 0
Upvote 0
Function TachTen(HoTen As String, Kieu As Boolean) As String
Dim Temp1, Temp2 As String
On Error Resume Next
With WorksheetFunction
Temp1 = Split(.Trim(HoTen), " ")
Temp2 = Temp1(UBound(Temp1))
TachTen = IIf(Kieu, Temp2, .Trim(Replace(HoTen, Temp2, "")))
End With
End Function[/php]
Cái tham số Kieu ở đây theo tôi hiểu là nếu là true thì lấy về tên, nếu là false thì lấy về họ và tên đệm, như vậy thì ở mà dùng câu lệnh này sẽ rất nguy hiểm
Mã:
    TachTen = IIf(Kieu, Temp2, .Trim(Replace(HoTen, Temp2, "")))
Vì Replace của VBA nó giống như SUBSITUTE của WorkshetFunction, tức là nó thay thế hết toàn bộ. Ví dụ như ai đó có tên là Lê Hà Lê thì khi tách tên sẽ được Lê, nhưng nếu lấy họ và họ đệm thì chỉ còn mỗi Hà.
 
Upvote 0
Web KT

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

Back
Top Bottom