Tách tên từ chuỗi với nhiều đặc điểm khác nhau

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Phương Phương mito

Thành viên thường trực
Tham gia
1/5/19
Bài viết
275
Được thích
65
Kính chào anh chị và các bạn diễn đàn,
Em rà soát đền bù bảo hiểm và muốn tách tên người ra. Nhưng tên nó nằm ở các vị trí khác nhau và em đã tóm được một số chuỗi cần lấy điển hình như file ạ. Em muốn lấy họ và tên của người đứng trước từ THANH TOAN/BOI THUONG/boi thuong/thanh toan/Boi Thuong. Nhưng các mốc bắt đầu lấy thì rất khó vì nó không theo quy luật cố định như 11 dòng ví dụ em đã nêu. Em nghĩ đễn việc đưa ra các Họ cơ bản rồi tìm ngược lại họ nào xuất hiện thì lấy từ Họ đó đến trước các từ THANH TOAN/BOI THUONG/boi thuong/thanh toan/Boi Thuong. Tất nhiên cũng chỉ là tương đối và không đúng hết được. Có code nào có thể lấy được tất cả họ và tên từ 11 dòng đã cho không ạ. Mong anh/chị và các bạn hỗ trợ code với ạ.
 

File đính kèm

  • Tach lay ten tu chuoi.xlsx
    9.9 KB · Đọc: 29
Kính chào anh chị và các bạn diễn đàn,
Em rà soát đền bù bảo hiểm và muốn tách tên người ra. Nhưng tên nó nằm ở các vị trí khác nhau và em đã tóm được một số chuỗi cần lấy điển hình như file ạ. Em muốn lấy họ và tên của người đứng trước từ THANH TOAN/BOI THUONG/boi thuong/thanh toan/Boi Thuong. Nhưng các mốc bắt đầu lấy thì rất khó vì nó không theo quy luật cố định như 11 dòng ví dụ em đã nêu. Em nghĩ đễn việc đưa ra các Họ cơ bản rồi tìm ngược lại họ nào xuất hiện thì lấy từ Họ đó đến trước các từ THANH TOAN/BOI THUONG/boi thuong/thanh toan/Boi Thuong. Tất nhiên cũng chỉ là tương đối và không đúng hết được. Có code nào có thể lấy được tất cả họ và tên từ 11 dòng đã cho không ạ. Mong anh/chị và các bạn hỗ trợ code với ạ.
Chạy code . . .
Mã:
Sub ABC()
  Dim arr(), res(), str$, chr$, sRow&, i&, j&, c&, n&
  Const FistChar$ = ":./" 'Tu khoa truoc ten
 
  arr = Range("B3", Range("B" & Rows.Count).End(xlUp)).Value
  sRow = UBound(arr)
  ReDim res(1 To sRow, 1 To 1)
  For i = 1 To sRow
    j = InStr(1, arr(i, 1), "boi thuong", vbTextCompare)
    If j = 0 Then j = InStr(1, arr(i, 1), "thanh toan", vbTextCompare)
    If j > 0 Then
      str = Mid(arr(i, 1), 1, j - 2)
      n = Len(str)
      For c = n To 1 Step -1
        chr = Mid(str, c, 1)
        If IsNumeric(chr) Or InStr(1, FistChar, chr) Then Exit For
      Next c
      res(i, 1) = Mid(str, c + 1, n - c)
    End If
  Next i
  Range("C3").Resize(sRow) = res
End Sub
 
Upvote 0
Chạy code . . .
Mã:
Sub ABC()
  Dim arr(), res(), str$, chr$, sRow&, i&, j&, c&, n&
  Const FistChar$ = ":./" 'Tu khoa truoc ten
 
  arr = Range("B3", Range("B" & Rows.Count).End(xlUp)).Value
  sRow = UBound(arr)
  ReDim res(1 To sRow, 1 To 1)
  For i = 1 To sRow
    j = InStr(1, arr(i, 1), "boi thuong", vbTextCompare)
    If j = 0 Then j = InStr(1, arr(i, 1), "thanh toan", vbTextCompare)
    If j > 0 Then
      str = Mid(arr(i, 1), 1, j - 2)
      n = Len(str)
      For c = n To 1 Step -1
        chr = Mid(str, c, 1)
        If IsNumeric(chr) Or InStr(1, FistChar, chr) Then Exit For
      Next c
      res(i, 1) = Mid(str, c + 1, n - c)
    End If
  Next i
  Range("C3").Resize(sRow) = res
End Sub
Em không nghĩ là có thể làm được ạ. Code quá hay ạ. Em cảm ơn Anh HieuCD nhiều lắm ạ !!!
 
Upvote 0
Kính chào anh chị và các bạn diễn đàn,
Em rà soát đền bù bảo hiểm và muốn tách tên người ra. Nhưng tên nó nằm ở các vị trí khác nhau và em đã tóm được một số chuỗi cần lấy điển hình như file ạ. Em muốn lấy họ và tên của người đứng trước từ THANH TOAN/BOI THUONG/boi thuong/thanh toan/Boi Thuong. Nhưng các mốc bắt đầu lấy thì rất khó vì nó không theo quy luật cố định như 11 dòng ví dụ em đã nêu. Em nghĩ đễn việc đưa ra các Họ cơ bản rồi tìm ngược lại họ nào xuất hiện thì lấy từ Họ đó đến trước các từ THANH TOAN/BOI THUONG/boi thuong/thanh toan/Boi Thuong. Tất nhiên cũng chỉ là tương đối và không đúng hết được. Có code nào có thể lấy được tất cả họ và tên từ 11 dòng đã cho không ạ. Mong anh/chị và các bạn hỗ trợ code với ạ.
Tham khảo thêm hàm tự tạo.
 

File đính kèm

  • Tach lay ten tu chuoi.xlsm
    17.7 KB · Đọc: 18
Upvote 0
Mấy anh cho em hỏi, đối với bài này của bạnPhương Phương mito gửi thì các anh tách dựa vào 2 cụm từ: BOI THUONG, THANH TOAN.
Nhưng em muốn hỏi: giả sử bài này không phải 2 cụm từ này, mà là 200 cụm từ. VD: BOI THUONG, THANH TOÁN, NHAP, XUAT.............
Lúc đó mình không thể nhận diện bằng cụm từ được.
Nhưng mình có cách nhận diện khác là từ in đậm.
Em muốn hỏi là nếu dấu hiệu nhận diện là từ in đậm, thì code mình sửa lại như thế nào các anh.
 
Upvote 0
Mấy anh cho em hỏi, đối với bài này của bạnPhương Phương mito gửi thì các anh tách dựa vào 2 cụm từ: BOI THUONG, THANH TOAN.
Nhưng em muốn hỏi: giả sử bài này không phải 2 cụm từ này, mà là 200 cụm từ. VD: BOI THUONG, THANH TOÁN, NHAP, XUAT.............
Lúc đó mình không thể nhận diện bằng cụm từ được.
Nhưng mình có cách nhận diện khác là từ in đậm.
Em muốn hỏi là nếu dấu hiệu nhận diện là từ in đậm, thì code mình sửa lại như thế nào các anh.
Dùng nhận diện in đậm thì dữ liệu nguồn không đưa vào mảng mà xử lý trực tiếp trên cell và biến j (ký tự bắt đầu của cụm in đậm) được tìm ra bằng vòng lặp:
For j = 1 To Len(Cells(i, 2)) '=> i từ 3 đến dòng cuối dữ liệu cột B
If Cells(i, 2).Characters(Start:=j, Length:=1).Font.Bold = True Then Exit For
Next
=> Khi kết thúc vòng lặp nếu j <= Len(Cells(i, 2)) thì đó là giá trị cần tìm

Tuy nhiên: tại sao dữ liệu nguồn lại có cụm in đậm đó mới là điều đáng nói --=0
 
Upvote 0
Đời người vô thường lắm, và chuỗi ký tự HỌ TÊN trong ví dụ này cũng thế
Chủ thớt đề xuất lập danh sách các HỌ thường gặp đế lấy ra họ tên. Tất nhiên là không chọn, vì trường hợp tên cũng là họ không phải là hiếm (Lê Văn Phan, Nguyễn Tuấn Trần, Vũ Thị Lê...)
Bài 2 đưa ra phương án trích xuất họ tên kẹp giữa ký tự ":./" và chuỗi :Thanh toán, bồi thường...
Với chuỗi thế này:
"LE PHI BAO HIEM: LE THI XUAN UYEN Boi Thuong NGUYEN THI VAN"
Tất nhiên là tạm ổn cho thớt, cho đến khi gặp:
"LE PHI BAO HIEM LE THI XUAN UYEN Boi Thuong NGUYEN THI VAN"
lại thắc mắc các người họ LÊ này có cái tên sao dài thế
....
Ổn nhất cho thớt, theo tôi nghĩ, là làm cách nào chuẩn hóa cái diễn giải của Ngân hàng, nghĩa là xử lý từ cái đầu vào, yêu cầu người chuyển tiền tuân theo cái form nhận diện.
Tôi vừa chuyển tiền học phí học kỳ 2 cho con tôi với nội dung: "HP HK2 HS15202" với "HS15202" là ID của con tôi.
Và không có gì cần bàn cãi hay nhầm lẫn với cái nội dung này.
 
Upvote 0
Mình thấy cái này có thể dùng hàm FIND, SEARCH và LEN để lập, tuy nhiên tên phía trước lại không có 1 ký tự nào đó chặn mất tên, với ví dụ bạn đưa ra thì có thể khoanh vùng, tuy nhiên nếu không có ký tự đặc biệt giữa tên và nội dung thì sẽ ra kết quả không chính xác.
Ví dụ như dòng này
LE PHI BAO HIEM: LE THI XUAN UYEN nếu không có dấu : thì sẽ trả về tên là LE PHI BAO HIEM LE THI XUAN UYEN
 
Upvote 0
Web KT
Back
Top Bottom