Điều kiện để tách chuổi

Liên hệ QC

khoa_pr

Thành viên hoạt động
Tham gia
16/6/09
Bài viết
141
Được thích
13
Xin chào các cao thủ của Giaiphaexcel
Trong bài viết "Đánh họ, tên, tự động tách tên và tự động viết HOA", dùng sự kiện Worksheet_Change () để tách Họ và tên có đoạn code của 2 thành viên gạo cội là Batê với ví dụ Tachten ở topic #8: http://www.giaiphapexcel.com/forum/...h-họ-và-tên-tự-động-tách-tên-tự-động-viết-hoa; code của bạn quanghai1969 ở topic #17 rất ngắn gọn, rất hay. Nhưng nó thiếu một điều kiện quan trọng, bản thân tôi xin góp ý: Khi cột tên khác rỗng (cột D tập tin Tachten.xls), nếu ta có chỉnh sửa Họ và tên đệm (cột C) khi Enter không được tách tên đệm sang cột D. Rất mong Ba tê và quanghai1969 bổ sung diều kiện tách tên:
1- Nếu cột tên (cột D) không rỗng thì không tách tên từ cột C.
2- Nếu cột Họ, tên đệm khác rỗng và cột Tên (cột D) rỗng thì tách tên từ cột C sang D; tất cả đều chuyển sang chữ HOA.
tôi xin đính kèm 2 tập tin của Ba tê và quanghai1969.
 

File đính kèm

  • TachTen_Ba_Te.xls
    31.5 KB · Đọc: 16
  • TachTen_quanghai1969.xls
    32 KB · Đọc: 6
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim Tem, Str As String
If Target.Column = 3 And Target.Count = 1 Then
If Target.Offset(, 1).Value = Empty Then
    Str = UCase(Target)
    Tem = Split(Trim(Str), " ")
    Target.Offset(, 1).Value = Tem(UBound(Tem))
    Target.Value = Trim(Left(Str, Len(Str) - Len(Target.Offset(, 1))))
End If
End If
Application.EnableEvents = True
End Sub
 
cám ơn bạn!
Vấn đề nảy sinh: nếu nhập họ ở cột C chỉ có một từ rồi nhấn Enter thi nó cắt luôn cái họ đưa qua cột D, cột C trống rỗng kỳ lắm. làm sao cho nó đừng cắt tên bên C.
 
cám ơn bạn!
Vấn đề nảy sinh: nếu nhập họ ở cột C chỉ có một từ rồi nhấn Enter thi nó cắt luôn cái họ đưa qua cột D, cột C trống rỗng kỳ lắm. làm sao cho nó đừng cắt tên bên C.
Vậy bạn sửa lại code của bạn hpkhuong một chút nhé.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim Tem, Str As String
If Target.Column = 3 And Target.Count = 1 Then
[B][COLOR=#ff0000]If (Target.Offset(, 1).Value = Empty) And (InStr(1, Trim(Target.Value), " ") > 0) Then[/COLOR][/B]
    Str = UCase(Target)
    Tem = Split(Trim(Str), " ")
    Target.Offset(, 1).Value = Tem(UBound(Tem))
    Target.Value = Trim(Left(Str, Len(Str) - Len(Target.Offset(, 1))))
End If
End If
Application.EnableEvents = True
End Sub
 
Cám ơn bạn nhiều lắm!
Còn một tình huống này phát sinh từ thực tiễn:
- Sau khi đã tách Họ và tên ra các cột C và D, cột C có đủ Họ và tên đệm (NGUYỄN VĂN), khi xoá tên trong cột D và Enter, thì nó sẽ tự tách tên đệm ra cột D (vì lúc này cột D rỗng).
- Với tập tin Tachten_Bate.xls, toi muốn danh sách bắt đầu từ dòng thứ 2 (C2), còn dòng trên là tiêu đề cột thì cần thêm code như thế nào.
 
Lần chỉnh sửa cuối:
Cám ơn bạn nhiều lắm!
Còn một tình huống này phát sinh từ thực tiễn:
- Sau khi đã tách Họ và tên ra các cột C và D, cột C có đủ Họ và tên đệm (NGUYỄN VĂN), khi xoá tên trong cột D và Enter, thì nó sẽ tự tách tên đệm ra cột D (vì lúc này cột D rỗng).
- Với tập tin Tachten_Bate.xls, toi muốn danh sách bắt đầu từ dòng thứ 2 (C2), còn dòng trên là tiêu đề cột thì cần thêm code như thế nào.
Vậy bạn sửa code lại như thế này.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim Tem, Str As String
If Target.Column = 3 And Target.Count = 1 And Target.Row > 1 Then
If (Target.Offset(, 1).Value = Empty) And (InStr(1, Trim(Target.Value), " ") > 0) Then
    Str = UCase(Target)
    Tem = Split(Trim(Str), " ")
    Target.Offset(, 1).Value = Tem(UBound(Tem))
    Target.Value = Trim(Left(Str, Len(Str) - Len(Target.Offset(, 1))))
End If
ElseIf Target.Column = 4 And Target.Count = 1 And Target.Row > 1 Then
If (Target.Value = Empty) And (InStr(1, Trim(Target.Offset(, -1).Value), " ") > 0) Then
    Str = UCase(Target.Offset(, -1).Value)
    Tem = Split(Trim(Str), " ")
    Target.Value = Tem(UBound(Tem))
    Target.Offset(, -1).Value = Trim(Left(Str, Len(Str) - Len(Target)))
End If
End If
Application.EnableEvents = True
End Sub
 
Cám ơn bạn nhiều
Trong dòng lệnh If (Target.Offset(, 1).Value = Empty) And .....) Then bạn dùng Empty, minh hay dùng dấu ( " "); 2 cách trên có gì khác nhiều không bạn. Bạn giải thích giúp (khỏi phải qua mục giải thích code) Sự kiện WorkSheet_change () và WorkSheet_Selectionchange ().
 
Cám ơn bạn nhiều
Trong dòng lệnh If (Target.Offset(, 1).Value = Empty) And .....) Then bạn dùng Empty, minh hay dùng dấu ( " "); 2 cách trên có gì khác nhiều không bạn. Bạn giải thích giúp (khỏi phải qua mục giải thích code) Sự kiện WorkSheet_change () và WorkSheet_Selectionchange ().
Empty và "" theo mình thấy ghi thế nào cũng cho kết quả đúng, nhưng điểm khác biệt mình biết thì có nhưng cụ thể thì mình chưa rõ.
Còn sự kiện change chỉ xảy ra khi mình thay đổi giá trị của ô, còn sự kiện selectionchange xảy ra khi mình chọn ô.
 
Web KT
Back
Top Bottom