Hỏi về cách xử lý chuỗi ký tự bị sai

Liên hệ QC

nghiank0909

Thành viên mới
Tham gia
28/5/21
Bài viết
5
Được thích
1
Chào mọi người, có một người gửi cho mình một file gồm rất nhiều tên. Tuy nhiên, các tên này bị một lỗi là: Nếu từ nào được tạo thành từ các vần kết thúc là NG (nhưng ong, ông, oang, ang,...) thì có thêm một chuỗi "uyễn" gắn liền phía sau. Do file rất nhiều dữ liệu nên mình không thể xóa tay. Mong nhờ mọi người hỗ trợ. Mình gửi kèm file :)
 

File đính kèm

  • DD.xlsx
    9.3 KB · Đọc: 10
Chào mọi người, có một người gửi cho mình một file gồm rất nhiều tên. Tuy nhiên, các tên này bị một lỗi là: Nếu từ nào được tạo thành từ các vần kết thúc là NG (nhưng ong, ông, oang, ang,...) thì có thêm một chuỗi "uyễn" gắn liền phía sau. Do file rất nhiều dữ liệu nên mình không thể xóa tay. Mong nhờ mọi người hỗ trợ. Mình gửi kèm file :)
Chạy code VBA
Mã:
Option Compare Text

Sub ABC()
  Dim sArr(), S, sRow&, i&, j&, tmp$, res$
  With Sheets("Sheet1")
    sArr = .Range("A1", .Range("A" & Rows.Count).End(xlUp)).Value
    sRow = UBound(sArr)
    For i = 1 To sRow
      tmp = sArr(i, 1)
      For j = Len(tmp) - 5 To 2 Step -1
        If Mid(tmp, j, 6) Like "NGUY?N" Then
          If Mid(tmp, j - 1, 1) <> " " And Mid(tmp, j - 1, 1) <> Chr(10) Then
            tmp = Mid(tmp, 1, j + 1) & Mid(tmp, j + 6, Len(tmp))
          End If
        End If
      Next j
      sArr(i, 1) = tmp
    Next i
    .Range("B1").Resize(sRow) = sArr
  End With
End Sub
 
Chào mọi người, có một người gửi cho mình một file gồm rất nhiều tên. Tuy nhiên, các tên này bị một lỗi là: Nếu từ nào được tạo thành từ các vần kết thúc là NG (nhưng ong, ông, oang, ang,...) thì có thêm một chuỗi "uyễn" gắn liền phía sau. Do file rất nhiều dữ liệu nên mình không thể xóa tay. Mong nhờ mọi người hỗ trợ. Mình gửi kèm file :)
Thêm code sau.
Mã:
Sub test()
Dim dulieu(), k As Long, re As Object
    With ThisWorkbook.Worksheets("Sheet1")
        dulieu = .Range("A1", .Range("A" & Rows.Count).End(xlUp).Offset(1)).Value
    End With
    Set re = CreateObject("VBScript.RegExp")
    With re
        .Global = True
        .IgnoreCase = True
        .MultiLine = True
        .Pattern = "([^\x0A ]ng)uy(\u00EA\u0303|\u1EC5)n"
    End With
    For k = 1 To UBound(dulieu, 1) - 1
        dulieu(k, 1) = re.Replace(dulieu(k, 1), "$1")
    Next k
    ThisWorkbook.Worksheets("Sheet1").Range("B1").Resize(UBound(dulieu, 1)).Value = dulieu
    Set re = Nothing
End Sub
Lưu ý:
1. Đôi khi dữ liệu được nhập từ nhiều nguồn, từ nhiều người, nên sảy ra trường hợp một số dữ liệu là unicode tổ hợp, còn số khác là unicode dựng sẵn. Code của tôi xử lý được cả hai. Vd. có 2 ô với nội dung:

PHÙNGUYỄN KIM ANH - chuỗi unicode có ký tự Ễ tổ hợp, có độ dài 18 ký tự
PHÙNGUYỄN KIM ANH - chuỗi unicode có ký tự dựng sẵn, có độ dài 17 ký tự

Code trên xử lý cả hai chuỗi.

2. Code trên không bị lỗi khi chỉ có 1 dòng dữ liệu, và không bị lỗi cả khi không có dòng dữ liệu nào.
 
Lần chỉnh sửa cuối:
Cám ơn bạn HieuCD và batman1 rất nhiều ạ :) Chúc 2 bạn một ngày tốt lành.
 
Web KT

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

Back
Top Bottom